2010-02-07 3 views
6

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

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

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

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

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

+0

Вы можете попробовать установить ссылку с дополнительной библиотекой и без нее и посмотреть, имеет ли исполняемый файл одинаковый размер. –

+0

Я не знаю о GCC, но MSVC будет включать в себя содержимое всех файлов .obj, ссылаетесь ли вы на них или нет, но он будет содержать только те части файлов .lib, которые вы ссылаетесь. Я ожидал бы, что GCC будет таким же –

+2

. Описанный шаг обычно называется «привязкой». Термин «компиляция» обычно используется для описания создания объектных файлов. – MSalters

ответ

5

Нет никаких негативных последствий, за исключением того, что ваш исполняемый файл может быть излишне большим. Линкером может быть, возможно, мертвый полоса неиспользуемого кода для вас, и это сократит все. Вы можете использовать какой-либо инструмент для просмотра объектов (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 мире , вы бы передали -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 
2

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

3

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

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

1

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

Смежные вопросы