LINUX.ORG.RU

dlopen causes SEGFAULT


0

0

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...

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