cc static linking: Как импортировать все символы только из одной библиотеки .a? - PullRequest
0 голосов
/ 30 сентября 2011

У меня есть 2 статические библиотеки,

libalgha.a с 2 функциями: func1() и func2()

и

libbeta.a с 2 функциями: func3() и func4()

У меня есть 1 исполняемый файл (mytest), связанный с этими двумя библиотеками.Исполняемый файл вызывает только func1() и func3().Итак, насколько я понимаю, компоновщик поместит только символ этих 2 функций в исполняемый файл.

Исполняемый файл загружает с dlopen() во время выполнения общую библиотеку (libgamma.so), и эта общая библиотека использует функциюfunc2() из libalgha.a.При запуске mytest я получаю сообщение об ошибке:

символ func2: указанный символ не найден

Я не могу включить libalgha.a внутри libgamma.so из-заSolaris 32/64 бит выпуска.

Так как мне связать mytest со всеми символами libalgha.a?

Ответы [ 2 ]

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

Включите ссылку на func2 в исходном коде вашей программы, например:

extern void func2 ();
void (*pfunc2)() = func2;

В качестве альтернативы, вы можете связать всю библиотеку в один объект, используя ld -r, и связать этот объект с исполняемым файлом вместобиблиотека.Вы можете или не можете извлекать объекты, например, если следующее не работает:

ld -r -o libbeta.o libbeta.a

, затем выполните

mkdir x
cd x
ar x ../libbeta.a
ld -r -o ../libbeta.o *.o
cd ..
rm -rf x
1 голос
/ 30 сентября 2011

Может быть, -u func2 поможет.См. Справочную страницу .

К сожалению, не существует опции --whole-archive, как в GNU.

...