Как включить только используемые символы при статической привязке к gcc?
Я развертываю небольшую программу, скомпилированную с gcc, 4.3.2-1.1 (Debian). Эта программа будет развернута на шаблонах виртуальных машин, начиная от Debain 5 и заканчивая краями Fedora, Ubuntu, Slackware, Arch и другими.
Программа зависит от некоторых символов из библиотек Xen, которые доступны только в нестабильном дереве. Следовательно, установка библиотек Xen через соответствующих менеджеров пакетов на шаблонах виртуальных машин не решит мою непосредственную проблему.
Пока я не упакую свою собственную версию этих библиотек, мне нужно статически связать исполняемый файл.
Имеет ли gcc 4.3-x по умолчанию только символы, которые фактически используются при статической привязке, или есть другой флаг оптимизации, который я должен передать в компоновщик? Я знаю, что статическая связь плохая, я делаю это только как временную работу.
Ответы
Ответ 1
Эта проблема связана не только с gcc, но и с ld (1).
По умолчанию gcc не устраняет мертвый код, вы можете проверить это, скомпилировав/связав исполняемый файл, а затем запустив
objdump -d a.out
который показывает вам все функции в вашем исполняемом файле.
Простой "googling" дает ссылку .
Итак, чтобы удалить неиспользуемые функции, вам необходимо:
- Скомпилируйте с разделами "-fdata-sections", чтобы данные в отдельных разделах данных и "-ffunction-sections" сохраняли функции в отдельных разделах, поэтому они (данные и функции) могут быть отброшены, если они не используются.
- Ссылка на "--gc-sections" для удаления неиспользуемых разделов.