Компиляция несущественных объектных файлов с GCC - PullRequest
6 голосов
/ 07 февраля 2010

Рассмотрим следующий пример

g++ a.o b.o c.o -o prog

В случае, если c.o не вносит никакого исполняемого кода в prog, и нет никаких зависимостей от c.o ни в одном из других файлов, GCC все же включит содержимое c.o в prog

Говоря иначе, кроме времени компиляции, какие (если таковые имеются) негативные последствия могут иметь компиляцию ненужных файлов в исполняемый файл?

Заранее спасибо; Ура! * * 1013

Ответы [ 4 ]

5 голосов
/ 07 февраля 2010

Нет никаких негативных последствий, за исключением того, что ваш исполняемый файл может быть слишком большим. Возможно, компоновщик может лишить вас неиспользуемого кода, и это сократит количество ошибок. Вы можете использовать какой-либо инструмент просмотра объектов (otool, objdump, nm и т. Д.) В выходном исполняемом файле, чтобы проверить, есть ли в вашей программе дополнительные символы.

Я использую Mac, поэтому будут некоторые различия, если вы используете стандартный набор инструментов gcc, но вот пример:

$ make
gcc -o app main.c file2.c
gcc -Wl,-dead_strip -o app_strip main.c file2.c
$ ls -l app*
-rwxr-xr-x  1 carl  staff  8744 Feb  6 20:05 app
-rwxr-xr-x  1 carl  staff  8704 Feb  6 20:05 app_strip

Я думаю, что в мире gcc, не принадлежащем Apple, вы бы передали -Wl,--gc-sections вместо -Wl,-dead_strip в моем примере. Разница в размерах двух исполняемых файлов, которую вы видите, связана с удалением дополнительной функции:

$ nm app | cut -c 20- > app.txt
$ nm app_strip | cut -c 20- > app_strip.txt 
$ diff app.txt app_strip.txt 
8d7
< _function2
3 голосов
/ 07 февраля 2010

llvm может устранить мертвый код на этапе связывания. Используется специальный линкер llvm-ld.

Кроме того, использование -fwhole или -ipo (intel) поможет убрать мертвые символы.

2 голосов
/ 07 февраля 2010

Я только что попробовал это с некоторым кодом C, который я сейчас использую - я связал объект, который содержал метод, который (пока) не использовался нигде в программе. Код был включен в результирующий исполняемый файл, проверен путем запуска nm для файла elf и наблюдения, что метод T действительно был там, даже с использованием -O2 и -O3.

1 голос
/ 07 февраля 2010

Да, GCC будет включать все объектные файлы. С совсем новым компилятором (версия разработки 4.5.0) вы можете использовать -flto (оптимизация во время соединения), чтобы выполнить это.

...