Hello All!
Я вот наткнулся на странную проблему, может быть, кто-нибудь знает, в
чем дело... Итак:
1) есть исходник shared library с инициализатором _init:
-------- mydll.c -----------------------------------
#include <dlfcn.h>
static void *myhandle;
void _init() {
myhandle = dlopen("/lib/libc.so.6", RTLD_LAZY);
}
----------------------------------------------------
компилируется так:
gcc -Wall mydll.c -nostdlib -shared -o libmydll.so -ldl
2) есть программулина, которая грузит эту lybmydll.so:
-------- test.c ------------------------------------
#include <dlfcn.h>
#include <stdio.h>
int main() {
char libname[] = "libmydll.so";
void *lib = dlopen(libname, RTLD_LAZY);
if(!lib) {
printf("Cannot open library: %s\n", dlerror());
return 1;
}
printf("OK!\n");
return 0;
}
----------------------------------------------------
Компилируем программулину так:
gcc -g -c test.c -o test.o
gcc -g -o test test.o -ldl
Запускаем:
bash$ export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
bash$ ./test
OK!
Все работает. А вот теперь внимание - компилируем по-другому:
gcc -g -c test.c -o test.o
gcc -g -o test test.o -static -lc -ldl
Запускаем:
bash$ export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
bash$ ./test
Segmentation fault
Таким образом, при вызове dlopen из инициализатора все работает, если
екзешник собран динамическим, а если статически - все падает... Без
вызова dlopen опять-таки все в порядке.
Крэш происходит в динамическом загрузчике (/lib/ld-2.3.2.so). Где -
непонятно, собирать и инсталлить все хозяйство с отладкой слишком
опасно :(
В чем может быть дело?
Заранее спасибо!
btw, только что убедился, что dlopen необязательно делать в _init.
достаточно его сделать в любой функции этой shared library - в
статическом варианте при вызове такой функции всегда случается
segfault...