Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Загрузка динамической библиотеки из static приложения

245
17 февраля 2012 года
~ArchimeD~
1.4K / / 24.07.2006
Ситуация:
1) Есть приложение, которое поставляется заказчикам в виде бинарного файла. У заказчиков линуксы всякие разные. поэтому приложение собирается с ключом -static.
2) Требуется добавить возможность подгрузки модулей в виде .so
3) Ключ static нужно сохранить.
Что есть:

Загрузка библиотеки:

 
Код:
void *dl_handle;
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


Сборка библиотеки:
 
Код:
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 - не вариант, поскольку на серверах заказчиков стоят зачастую более старые версии библиотек, чем на зонах сборки, т.е. использовать их не можем, поэтому приходится тащить с собой. Вариант поддерживать для каждого дистрибутива сборки - тоже не вариант :) А так, альтернативные решения - тоже велкам.

316
17 февраля 2012 года
Alm3n
889 / / 29.05.2009
В линкусах аналога LoadLibrary и GetProcAddress нет?
UPD: Ага, вижу, что есть. Невнимателен.
245
21 февраля 2012 года
~ArchimeD~
1.4K / / 24.07.2006
Походу. проблема в попытке двойной статической прилинковке libpthread, только пока не пойму, в каком месте.
Код:
#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 ()
245
21 февраля 2012 года
~ArchimeD~
1.4K / / 24.07.2006
В общем понял, что затея дохлая, это нужно тащить два экземпляра, например, libc, и как они там за память драться будут - хз. Все плохо. Имхо проще реализовтаь свой загрузчик аля ld-linux :)

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог