#0 0x00000000 in ?? ()
#1 0xb77108af in __pthread_initialize_minimal_internal () from /lib/libpthread.so.0
#2 0xb770feb8 in _init () from /lib/libpthread.so.0
#3 0x080f884e in call_init (l=<value optimized out>, argc=1, argv=0xbfc87ac4, env=0xbfc87acc) at dl-init.c:70
#4 0x080f89f3 in _dl_init (main_map=0x814f0c8, argc=1, argv=0xbfc87ac4, env=0xbfc87acc) at dl-init.c:100
#5 0x080d3c63 in dl_open_worker (a=0xbfc87830) at dl-open.c:463
#6 0x080d2733 in _dl_catch_error (objname=0xbfc87858, errstring=0xbfc87854, mallocedp=0xbfc8785f, operate=0x80d3930 <dl_open_worker>, args=0xbfc87830) at dl-error.c:178
#7 0x080d40c6 in _dl_open (file=0x814f07c "/home/user/test/shared_lib/libTestFSMSS.so", mode=-2147483390, caller_dlopen=0x8048384, nsid=<value optimized out>, argc=1,
argv=0xbfc87ac4, env=0xbfc87acc) at dl-open.c:554
#8 0x080b8d28 in dlopen_doit (a=0xbfc879ac) at dlopen.c:67
#9 0x080d2733 in _dl_catch_error (objname=0x814c8f4, errstring=0x814c8f8, mallocedp=0x814c8f0, operate=0x80b8cc0 <dlopen_doit>, args=0xbfc879ac) at dl-error.c:178
#10 0x080b91b7 in _dlerror_run (operate=0x80b8cc0 <dlopen_doit>, args=0xbfc879ac) at dlerror.c:164
#11 0x080b8da9 in __dlopen (file=0x814f07c "/home/user/test/shared_lib/libTestFSMSS.so", mode=258, dl_caller=0x8048384) at dlopen.c:90
#12 0x0804883f in dlopen (file=0x814f07c "/home/user/test/shared_lib/libTestFSMSS.so", mode=258) at dlopen.c:31
#13 0x08048384 in main ()
Загрузка динамической библиотеки из static приложения
1) Есть приложение, которое поставляется заказчикам в виде бинарного файла. У заказчиков линуксы всякие разные. поэтому приложение собирается с ключом -static.
2) Требуется добавить возможность подгрузки модулей в виде .so
3) Ключ static нужно сохранить.
Что есть:
Загрузка библиотеки:
Код:
void *dl_handle;
dl_handle = dlopen( "/home/blablabla/test/shared_lib/libTestFSMSS.so", RTLD_NOW | RTLD_GLOBAL);
dl_handle = dlopen( "/home/blablabla/test/shared_lib/libTestFSMSS.so", RTLD_NOW | RTLD_GLOBAL);
Сборка приложения:
Код:
g++ -rdynamic -std=c++0x -D_LINUX -I/our_lib_path/ -o app.bin -L/our_lib_path/Release/ -lOurLib -ldl -lpthread -static Source/main.cpp
/tmp/ccUQ6TEA.o: In function `main':
main.cpp:(.text+0x9b): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/tmp/ccUQ6TEA.o: In function `main':
main.cpp:(.text+0x9b): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
Сборка библиотеки:
Код:
g++ -std=c++0x -D_LINUX -I/our_lib_path/ -shared -o libTestFSMSS.so -Wl,-soname,libtestFSMS.so -L/our_lib1_path/Release/ -lOurLib -lpthread Source/example001.cpp
Запуск на той же машине, где и собиралось:
Цитата:
> ./app.bin
Ошибка сегментирования
Ошибка сегментирования
Падает, судя по всему, как раз на dlopen. Из gdb, ессно, нифига не видно.
Предположительная проблема:
И в самом приложении, и в библиотеке нужны либы OurLib и pthread, и на самом деле еще куча других. В этом, скорее всего, и косяк. Использовать один экземпляр либ на всех не получится, ввиду Static линковки.
Вопрос:
Возможно ли совместить ключ -static и загрузку своей динамической либы в описаной ситуации? Собирать без static - не вариант, поскольку на серверах заказчиков стоят зачастую более старые версии библиотек, чем на зонах сборки, т.е. использовать их не можем, поэтому приходится тащить с собой. Вариант поддерживать для каждого дистрибутива сборки - тоже не вариант :) А так, альтернативные решения - тоже велкам.
UPD: Ага, вижу, что есть. Невнимателен.
Походу. проблема в попытке двойной статической прилинковке libpthread, только пока не пойму, в каком месте.
В общем понял, что затея дохлая, это нужно тащить два экземпляра, например, libc, и как они там за память драться будут - хз. Все плохо. Имхо проще реализовтаь свой загрузчик аля ld-linux :)