Как включить только используемые символы при статической привязке к gcc? - PullRequest
17 голосов
/ 15 марта 2011

Я развернул небольшую программу, скомпилированную с помощью gcc, 4.3.2-1.1 (Debian).Эта программа будет развернута на шаблонах виртуальных машин, начиная с Debain 5 и заканчивая современными Fedora, Ubuntu, Slackware, Arch и др.

Программа зависит от некоторых символов из библиотек Xen, которые доступны только в нестабильном дереве.Следовательно, установка библиотек Xen через соответствующие менеджеры пакетов на шаблонах виртуальных машин не решит мою непосредственную проблему.

Пока я не упакую свою собственную версию этих библиотек, мне нужно статически связать исполняемый файл.

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

1 Ответ

18 голосов
/ 15 марта 2011

Эта проблема связана не только с gcc, но и с ld (1).

По умолчанию gcc не удаляет мертвый код, вы можете проверить это, скомпилировав / связав исполняемый файл, а затем запустив

objdump -d a.out

, который показывает все функции вашего исполняемого файла.

Простое "поиск в Google" дает эту ссылку .

Итак, чтобы удалить неиспользуемые функции, вам необходимо:

  • Компилировать с «-fdata-section», чтобы хранить данные в отдельных разделах данных, и «-ffunction-section», чтобы хранить функции в отдельных разделах, чтобы их (данные и функции) можно было отбрасывать, если они не используются.
  • Ссылка с «--gc-section» для удаления неиспользуемых разделов.
...