Какие символы вставит компоновщик в исполняемый файл ELF?

Рассмотрим следующую команду:

g++ -Wl,--start-group main.o liba.a -Wl,--end-group -o a.out

Возможно ли, что в a.out есть некоторые символы, определенные в liba.a, но не используемые main.o? Если да, то в каких случаях? Есть ли какие-то хитрости в написании исходного кода или вызове компилятора или компоновщика, чтобы сделать это возможным? Насколько я знаю, этого не должно происходить, но я недавно столкнулся с таким случаем.

1

Решение

Я могу вспомнить, по крайней мере, три обстоятельства, в которых это может произойти:

  1. -Wl,--whole-archive может быть использован для принуждения liba.a быть включенным в его цельность а не только необходимые объектные файлы.
  2. liba.a может содержать символы, которые используются средой выполнения C, минуя содержимое main.o, Наиболее распространенной причиной таких символов являются объекты C ++ global или file scope с конструкторами.
  3. По умолчанию компоновщик удаляет неиспользуемый код в масштабе отдельных объектные файлы; если объектный файл определяет набор символов, только некоторые из которых были использованы, все они будут присутствовать независимо. Вы можете обойти это, компилируя все, что переходит в liba.a с -ffunction-sections -fdata-sections а затем давая -Wl,--gc-sections во время ссылки. С очень недавним GCC (я не попробовал бы это с чем-либо ранее, чем 4.7), компилируя все с -flto а затем связать с -fwhole-program также может помочь
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]