Возможно ли в Linux прилнковать dll статически?
От: push  
Дата: 15.11.12 09:53
Оценка:
Перечитал разной инфы, но не нашел ответ на мой вопрос.
Нашел, что можно сделать статическую .a библиотеку, динамическую .so библиотеку.
Можно динамически грузить внутренности из .so через win аналог ::GetProcAddress.
А вот как прилинковать .so статически так, чтобы не вызывать явно аналог ::GetProcAddress — не нашел.
Возможно ли это в принципе? Если да — то как?
Re: Возможно ли в Linux прилнковать dll статически?
От: hotdox  
Дата: 15.11.12 09:59
Оценка: 3 (1) +1
Здравствуйте, push, Вы писали:

P>Перечитал разной инфы, но не нашел ответ на мой вопрос.

P>Нашел, что можно сделать статическую .a библиотеку, динамическую .so библиотеку.
P>Можно динамически грузить внутренности из .so через win аналог ::GetProcAddress.
P>А вот как прилинковать .so статически так, чтобы не вызывать явно аналог ::GetProcAddress — не нашел.
P>Возможно ли это в принципе? Если да — то как?

Динамическая библиотека линкуется статически, также как и статическая, то есть в вашей системе сборки надо прописать -L /path/to/lib -l library.so
Re: Возможно ли в Linux прилнковать dll статически?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 15.11.12 10:13
Оценка: 3 (1)
Здравствуйте, 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
The God is real, unless declared integer.
Re: Возможно ли в Linux прилнковать dll статически?
От: push  
Дата: 15.11.12 10:34
Оценка:
Спасибо всем!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.