Подтвердить что ты не робот

Как включить только используемые символы при статической привязке к gcc?

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

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

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

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

4b9b3361

Ответ 1

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

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

objdump -d a.out

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

Простой "googling" дает ссылку .

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

  • Скомпилируйте с разделами "-fdata-sections", чтобы данные в отдельных разделах данных и "-ffunction-sections" сохраняли функции в отдельных разделах, поэтому они (данные и функции) могут быть отброшены, если они не используются.
  • Ссылка на "--gc-sections" для удаления неиспользуемых разделов.