Есть ли способ убрать все функции из объектного файла, который я не использую? - PullRequest
4 голосов
/ 14 апреля 2010

Я пытаюсь сэкономить место в моем исполняемом файле, и я заметил, что несколько функций добавляются в мои объектные файлы, хотя я никогда не вызываю их (код взят из библиотеки).

Есть ли способ сообщить gcc об автоматическом удалении этих функций или мне нужно удалить их вручную?

Ответы [ 5 ]

2 голосов
/ 14 апреля 2010

Если вы компилируете в объектные файлы (не исполняемые файлы), то компилятор никогда не удалит никакие не-static функции, поскольку всегда возможно связать объектный файл с другим объектным файлом, который будет вызывать эту функцию. Таким образом, ваш первый шаг должен объявить как можно больше функций static.

Во-вторых, единственный способ для компилятора удалить любые неиспользуемые функции - это статически связать ваш исполняемый файл. В этом случае, по крайней мере, существует вероятность того, что программа может прийти и выяснить, какие функции используются, а какие не используются.

Суть в том, что я не верю, что gcc на самом деле выполняет этот тип кросс-модульной оптимизации. Лучше всего ставить флаг -Os для оптимизации размера кода, но даже в этом случае, если у вас есть объектный файл abc.o, в котором есть неиспользуемые нестатические функции, и вы статически связываетесь с некоторым исполняемым файлом def.exe, я Я не верю, что gcc откажется от кода для неиспользуемых функций.

Если вы действительно отчаянно нуждаетесь в этом, я думаю, вам, возможно, придется на самом деле #include объединить файлы, чтобы после прохождения препроцессора это привело к компиляции одного файла .c. С gcc, компилирующим один чудовищный jumbo исходный файл, у вас больше шансов на удаление неиспользуемых функций.

1 голос
/ 25 мая 2010

Так как я задал этот вопрос, была выпущена GCC 4.5, которая включает в себя возможность объединить все файлы, чтобы это выглядело как 1 гигантский исходный файл. Используя эту опцию, можно легко удалить неиспользуемые функции.

Подробнее здесь

1 голос
/ 14 апреля 2010

В дополнение к -Os для оптимизации размера, эта ссылка может помочь.

1 голос
/ 14 апреля 2010

Вы смотрели на вызов gcc с -Os (оптимизируйте по размеру.) Я не уверен, удаляет ли он недостигнутый код, но это было бы достаточно просто для тестирования. Вы также можете, вернув свой исполняемый файл, удалить его. Я уверен, что есть аргумент командной строки gcc, который делает то же самое - это - dead_strip?

0 голосов
/ 14 апреля 2010

IIRC компоновщик по умолчанию делает то, что вы хотите в некоторых конкретных случаях. Суть в том, что библиотечные файлы содержат кучу объектных файлов, и в них связаны только ссылочные файлы. Если вы можете выяснить, как заставить GCC выдавать каждую функцию в свой собственный объектный файл, а затем встроить ее в библиотеку, вы должны получить что вы ищете.

Я знаю только один компилятор, который действительно может это сделать: здесь (посмотрите на флаг -lib)

...