Перечитал разной инфы, но не нашел ответ на мой вопрос.
Нашел, что можно сделать статическую .a библиотеку, динамическую .so библиотеку.
Можно динамически грузить внутренности из .so через win аналог ::GetProcAddress.
А вот как прилинковать .so статически так, чтобы не вызывать явно аналог ::GetProcAddress — не нашел.
Возможно ли это в принципе? Если да — то как?
Здравствуйте, push, Вы писали:
P>Перечитал разной инфы, но не нашел ответ на мой вопрос.
P>Нашел, что можно сделать статическую .a библиотеку, динамическую .so библиотеку.
P>Можно динамически грузить внутренности из .so через win аналог ::GetProcAddress.
Имеется в виду dlopen()?
P>А вот как прилинковать .so статически так, чтобы не вызывать явно аналог ::GetProcAddress — не нашел.
P>Возможно ли это в принципе? Если да — то как?
Напустите ldd на практически любой бинарник, да хоть самописный hello world. Увидите, что он цепляет библиотеки (>99.9% это libc, плюс остальные по необходимости).
При сборке это делается ключом -l<name>, при этом lib<name.so> должна лежать в путях поиска библиотек и быть ссылкой на lib<чего-то>.so.<номер>, которая и будет записываться в бинарник. Например, для libm (функции из <math.h>, <fenv.h>):
$ ls -l /usr/lib/libm.so
lrwxrwxrwx 1 root root 14 Nov 6 19:07 /usr/lib/libm.so -> /lib/libm.so.6
Бинарник с ней показывает:
$ ldd t
linux-vdso.so.1 (0x00007fffbb7ff000)
libm.so.6 => /lib64/libm.so.6 (0x00007f3d66fd3000)
libc.so.6 => /lib64/libc.so.6 (0x00007f3d66c2e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3d672ca000)
В стандартных путях поиска обычно только всякие /lib и /usr/lib. Чтобы линкер узнал про остальные, надо добавлять (до ключа -l с библиотекой) -L с путём, например:
gcc -o foo foo.o foolib.o aux1.o -L../libbar -lbar