GCC -rdynamic не работает со статическими библиотеками - PullRequest
4 голосов
/ 19 мая 2011

Почему -rdynamic не экспортирует символы в файлы .a, а экспортирует символы в файлы .o?

У меня есть приложение и плагин в файле .so. Основное приложение связано с использованием ряда объектных файлов и одной статической библиотеки, например:

CXXFLAGS =      $(CXXFLAGS_COMMON) -rdynamic
STATICLIBS =    ../Utilities/Utilities.a
...

all:
    $(CXX) $(CXXFLAGS) -o $(SAMPLE) main.o $(STATICLIBS) $(SHAREDLIBS) $(INCLUDES)

(CXX - это g ++ 4.5.2 на Ubunut, я использую в основном -std = c ++ Ox для компиляции)

В этом случае символы в Utilities.a не экспортируются (т. Е. "Objdump -t a.out | grep symbol" пусто).

Если я использую «ar x» для извлечения файлов .o в .a и ссылки, используя только .o, то символы экспортируются и обнаруживаются плагинами (которые загружаются с помощью dlopen, если вам интересно ).

Я пытался использовать -Wl, -export-dynamic, но безуспешно.

У меня есть обходной путь, как уже упоминалось, но я все еще хотел бы понять, что мне не хватает. Заранее спасибо!

Ответы [ 2 ]

9 голосов
/ 02 октября 2011

Обычно компоновщик включает только те части статических архивов (.a файлы), на которые имеются ссылки.

Чтобы заставить компоновщик включать все содержимое файла .a, вы можете использовать--whole-archive опция компоновщика (поэтому -Wl,--whole-archive в командной строке gcc).

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

Так, например, с помощью вашей команды:

$(CXX) $(CXXFLAGS) -o $(SAMPLE) main.o -Wl,--whole-archive $(STATICLIBS) -Wl,--no-whole-archive $(SHAREDLIBS) $(INCLUDES)
1 голос
/ 19 мая 2011
Файл

A .o является перемещаемым ELF, а файл .so является общим объектом ELF.Принимая во внимание, что файл .a является текущим архивом.Когда компоновщику передается флаг --export-dynamic через -rdynamic из gcc, он ищет файл динамического объекта.

Я думаю, что компоновщику не нужно просматривать архив и извлекатьсимволы.

...