LINUX.ORG.RU

.so библиотека не подгружается


0

0

Стоит задача скомпилить библиотеку-заглушку, она должна вызовы определенных символов транслирова в вызовы других символов. Пользоваться ею будут 32 битные приложения

Вот код(не мой):

        #include <stdlib.h>
        #include <ctype.h>
        unsigned short int * __ctype_b;
        unsigned short int * __ctype_tolower;
        unsigned short int * __ctype_toupper;

        void __attribute__((constructor)) my_init()
        {
         __ctype_b = * __ctype_b_loc();
         __ctype_tolower = * __ctype_tolower_loc();
         __ctype_toupper = * __ctype_toupper_loc();
        }
        void __attribute__((destructor)) my_clean() {}

Компилирую на 64 битной системе со следующими параметрами
Код
gcc -m32 -O2 -shared -fpic -xc libctype.c -o /usr/lib/libctype.so


вывод gcc -v:

Reading specs from /usr/lib/gcc-lib/x86_64-redhat-linux/3.2.3/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --enable-languages=c,c++ --disable-libgcj --host=x86_64-redhat-linux
Thread model: posix
gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-47.3)


После помещения в /lib, прописывания прав и вызова ldconfig, все равно при поиске символов "__ctype_b" ld не подключает эту библиотеку =( 

мало того, попытка насильно её загрузить через LD_PRELOAD вываливает следующее 

===============
ERROR: ld.so: object '/lib/libctype.so.1' from LD_PRELOAD cannot be preloaded: ignored.
===================

Господа программисты, очень прошу подсказать выход из ситуации.

PS. При компиляции библиотечки вываливаются следующие варнинги:
Код

libctype.c: In function `my_init':
libctype.c:9: warning: assignment discards qualifiers from pointer target type
libctype.c:10: warning: assignment from incompatible pointer type
libctype.c:11: warning: assignment from incompatible pointer type

что-то не так делаете в программе. все сработало :

extern short int * __ctype_b;
int main(void) {
__ctype_b = (short *) 1;
}

$ gcc a.c -lctype -L.
$ nm ./a.out | grep ctype
08049694 B __ctype_b

Chumka ★★★
()
Ответ на: комментарий от Chumka

# nm /lib/libctype.so.1 | grep __ctype_b
0000000000001830 B __ctype_b
         U __ctype_b_loc@@GLIBC_2.3

Вроде как символы экспортируются, но если они кому понадобятся, то ld не подгружает libctype.so.1 =((( Мне кажется это связано как-то что я компилирую 32 битную библиотеку в 64 битной системе.

Какой командой вручную вообще можно загрузить в память библиотеку и если не получается, то отследить причину?

redbaron ★★
() автор топика
Ответ на: комментарий от redbaron

в самой библиотеке все ок, смотрите в сторону программы, использующей библиотеку. А ld - это линкер, и он не подгружает библиотеки, а только разрешает dynamic секцию (и relocation) elf файла во время компиляции, то есть связывает адреса и имена символов. А подгружает библиотеки ld-linux.so Но все подгружается, я думаю, нормально. Нужно посмотреть ldd ваша_программа nm ваша_программа | grep ctype и тд

Chumka ★★★
()
Ответ на: комментарий от Begemoth

Я как собественно предполагал: во время линковки уже скомпилированного объектника линкер смотрит какие символы ему нужны, ищет эти символы в своем кеше, созданом по ldconfig и собственно связывает первое со вторым. разве не так? Проясните плиз, или ткните где можно почитать.

А программа которая юзает заглушку это не моя, это объектники оракла, которые линкуются на этапе инсталяции.

redbaron ★★
() автор топика
Ответ на: комментарий от redbaron

то есть на этапе линковки оракла с библиотекой заглушкой, ld не находит данной библиотеки? А обычная программа, которую я выше приводил, находит эту заглушку? Неплохо бы видеть с какими опциями линкуется эта библиотека.

Chumka ★★★
()
Ответ на: комментарий от Chumka

Спасибо что навели на мысль про опции линковки. Видимо я ошибался, полагая что линкер сам найдет нужную библиотеку по требуемым символам. Расковыряв make файлы и добавив -lctype в опции линковки проблемных объектников все заработало, как полагается.

redbaron ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.