Рассмотрим следующую команду:
g++ -Wl,--start-group main.o liba.a -Wl,--end-group -o a.out
Возможно ли, что в a.out есть некоторые символы, определенные в liba.a, но не используемые main.o? Если да, то в каких случаях? Есть ли какие-то хитрости в написании исходного кода или вызове компилятора или компоновщика, чтобы сделать это возможным? Насколько я знаю, этого не должно происходить, но я недавно столкнулся с таким случаем.
Я могу вспомнить, по крайней мере, три обстоятельства, в которых это может произойти:
-Wl,--whole-archive
может быть использован для принуждения liba.a
быть включенным в его цельность а не только необходимые объектные файлы.liba.a
может содержать символы, которые используются средой выполнения C, минуя содержимое main.o
, Наиболее распространенной причиной таких символов являются объекты C ++ global или file scope с конструкторами.liba.a
с -ffunction-sections -fdata-sections
а затем давая -Wl,--gc-sections
во время ссылки. С очень недавним GCC (я не попробовал бы это с чем-либо ранее, чем 4.7), компилируя все с -flto
а затем связать с -fwhole-program
также может помочьДругих решений пока нет …