Компиляция несущественных объектных файлов с GCC

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

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

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

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

Заранее спасибо; Удачи!

6
задан Chris Tonkinson 7 February 2010 в 03:53
поделиться

4 ответа

Нет никаких негативных последствий, за исключением того, что ваш исполняемый файл может быть излишне большим. Компоновщик, вероятно, может удалить неиспользуемый код за вас, и это уменьшит количество вещей. Вы можете использовать какой-то инструмент просмотра объектов ( 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-section вместо -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
5
ответ дан 9 December 2019 в 22:34
поделиться

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

2
ответ дан 9 December 2019 в 22:34
поделиться

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

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

3
ответ дан 9 December 2019 в 22:34
поделиться

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

1
ответ дан 9 December 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: