Я создал файл .c
, который преобразуется в файл .o
вместе с примерно 300 другими файлами .c
и включен в статическую библиотеку .a
.Эта библиотека, наряду со многими другими, используется для создания динамической библиотеки .so
.При анализе файлов .a
и .so
с nm
я обнаружил, что по какой-то причине символы, определенные в файле .c
, присутствуют в файле .a
, но отсутствуют в файле .so
.Я не могу думать ни о какой причине, что это должно произойти.Может кто-нибудь помочь мне здесь?Для создания двух двоичных файлов используются следующие шаги:
gcc -fvisibility=hidden -c foo.c -o foo.c.o
ar cr libbar.a foo.c.o ...
gcc -fvisibility=hidden -fPIC -o libfinal.so libbar.a x.o y.a ...
Причина, по которой я указал скрытую видимость, заключается в том, что я хочу показать только несколько выбранных символов.Чтобы выставить символы из foo.c
, я указал атрибут видимости, чтобы сигнатуры функций в заголовке foo.h
выглядели так:
extern int _____attribute_____ ((visibility ("default"))) func ();
РЕДАКТИРОВАТЬ: команда nm libbar.a | grep Ctx
дает:
000023c5 T CtxAcquireBitmap
000026e9 T CtxAcquireArray
00001e77 T CtxCallMethod
Однако, nm libfinal.so | grep Ctx
ничего не показывает.
ОБНОВЛЕНИЕ: Найдена другая запись , в котором обсуждается использование опции --whole-archive
.Кроме того, наткнулся на параметр --export-dynamic
, который, по-видимому, указывает компоновщику сохранять символы, на которые нет ссылок.Расследование дальше.