(Untitled)

Oct 10, 2006 20:42

сегодня я узнал опытным путем, что оказывается линкер (gcc -> collect2 -> ld) линкует статические либы к бинарнику в порядке обратном их появлению в коммандной строке, причем почему-то на это дело влияют разные уровни оптимизации и всякие другие опции компилятора.

вот ведь блядство, а.

work, unix, routine, dumb

Leave a comment

Comments 10

alnsn October 11 2006, 12:39:45 UTC
Помню на прошлой была задачка большой проект собрать статически. А там как водится куча беспорядочных зависимостей и глобальных объектов. Мой коллега как-то нашел верную последовательность либ и передал мне увольняясь разгребаться с глобальными переменными. Вскоре после этого я тоже уволился. Так што ...

PS больше всего меня позабавили глобальные переменные для саморегистрации. При переходе на статический билд они просто исчезали ибо извне функции того TU никто не звал.
PPS это был не gcc, а SUN'овский компайлер.

Reply

antoxa October 11 2006, 13:06:00 UTC
да, наслышан про сановские компиляторы :)
я тут словил тривиальный, но от того не менее забавный баг с порядком инициализации статиков в разных TU тоже вот вчера :)

Reply


some41 October 25 2006, 09:50:41 UTC
вообще либы просматриваются строго в порядке, в котором они поданы. но из либы берутся только те объектники, которые нужны для разрешения текущих неопределенных символов. так что если у тебя из объектников есть зависимость только от последней либы, то возьмется она.

кстати, можно тебе вопрос как к эксперту по c++ с мировым именем™?

Reply

antoxa October 25 2006, 10:28:00 UTC
у меня одна либа зависит от другой. твой ответ понял, будду знать, спасибо.

вопрос задавай конечно, только ты мне льстишь все же :)

Reply

some41 October 25 2006, 11:42:59 UTC
когда либы зависят друг от друга, то, в идеале, нужно их упорядочевать так, чтобы либа зависила только от либ правее ее в строке. иначе придется либу указывать несколько раз.

а вопрос такой: вот C++-сные include файлы для C-библиотеки, типа . насколько я понял из стандарта, они должны все класть в std (17.4.1.2). но все реальные реализации, которые я видел, кладут и в std и в global. я что-то понял не так? или реализации не соответстуют стандарту?

Reply

antoxa October 25 2006, 12:16:54 UTC
насколько я понимаю gcc вообще просто использует почти одинаковый код для cmath то же, просто инклудит math.h.
имхо соответствуют, т.к. никто не запрещает класть еще и в global, зато бенефит - совместимость с C, а недостаток - разные сигнатуры всяких isalpha/isdigit и проч.

Reply


Leave a comment

Up