Как добавить конкретные символы из статической библиотеки - PullRequest
0 голосов
/ 17 ноября 2011

Я пытаюсь использовать параметр --whole-archive, но, похоже, он не работает с -Xlinker. Как я могу добавить эту опцию, используя - Xlinker?

Вот вся история: Я пишу основную программу A и несколько общих библиотек B1, B2 и т. Д. Основная программа будет использовать dlopen для загрузки этих общих библиотек во время выполнения. Я компилирую основную программу A, связывая ВСЕ возможные статические библиотеки, используемые основной программой (S1, S2 ... и т. Д.) Или общими библиотеками (S3, S4 ... и т. Д.). Затем я собираю общую библиотеку без статической библиотеки. При вызове dlopen сбой программы из-за неопределенного символа в разделяемой библиотеке. этот символ существует в статической библиотеке S3, но я не могу найти его в таблице символов основной программы.

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

1 Ответ

1 голос
/ 21 ноября 2011

Поэтому я добавляю опцию --whole-archive при компиляции основной программы

Вы до сих пор не ответили на вопрос: какую командную строку вы использовали.Добавление опций компоновщика при компиляции в общем случае бессмысленно: они имеют значение только при компоновке .

Правильная линия связи для описанной вами ситуации (при условии, что вы используете GCC насистема UNIX / ELF):

 gcc -rdynamic -o exename main.c \
   -Wl,--whole-archive -lS1 -lS2 -Wl,--no-whole-archive

Объяснение важных моментов:

  1. -rdynamic необходим для того, чтобы символы, определенные в главном исполняемом файле, были видны для dlopenобщие библиотеки ed.
  2. Библиотеки должны следовать за источниками в строке ссылок (порядок библиотек и источников имеет значение ).
  3. Библиотеки, в которые вы хотите полностью ссылаться, должны быть окруженыпо --whole-archive и --no-whole-archive вариантам.
...