URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 413
[ Назад ]

Исходное сообщение
"dlopen, dlsym, dlclose..."

Отправлено sergmsr , 17-Янв-02 13:19 
есть foo.cpp:
int main()
{
  void *dllptr;
  int (*mmm)(void);

  dllptr = dlopen("/home/sergmsr/ts/src/plugins/dl.so", RTLD_LAZY);
  mmm = (int (*)(void))dlsym(dllptr, "hello");
  mmm();
  dlclose(dllptr);
  return 0;
}

Собираю: gcc -Wall foo.cpp -ofoo -ldl

есть test.cpp:
#include <stdio.h>
int hello()      
{                
  printf("F");    
  return 33;      
}                
Собираю:
export LD_LIBRARY_PATH=`pwd`
gcc  -c -fpic test.cpp
gcc -shared -lc  -o test.so  test.o

после чего запускаю foo.cpp и получаю segmentation fault (core dumped).
операционка RedHat 7.1
в чем может быть проблема???


Содержание

Сообщения в этом обсуждении
"RE: dlopen, dlsym, dlclose..."
Отправлено Soldier , 17-Янв-02 16:23 
>есть foo.cpp:
>int main()
>{
>  void *dllptr;
>  int (*mmm)(void);
>
>  dllptr = dlopen("/home/sergmsr/ts/src/plugins/dl.so", RTLD_LAZY);
>
>  mmm = (int (*)(void))dlsym(dllptr,
>"hello");
>  mmm();
>  dlclose(dllptr);
>  return 0;
>}
>
>Собираю: gcc -Wall foo.cpp -ofoo -ldl
>
>
>есть test.cpp:
>#include <stdio.h>
>int hello()
>{
>  printf("F");
>  return 33;
>}
>Собираю:
>export LD_LIBRARY_PATH=`pwd`
>gcc  -c -fpic test.cpp
>gcc -shared -lc  -o test.so
> test.o
>
>после чего запускаю foo.cpp и получаю
>segmentation fault (core dumped).
>операционка RedHat 7.1
>в чем может быть проблема???

A vi zaglyanite vo vnutr' fail-a test.so (ili dl.so, tak ya i ne ponyal chto vi konkretno kompilite) i poprobuyte tam nayti simvol "hello" - vzamen vi naydete chto to tipa "hello_fV". Ukazhite vmesto "hello" etot simvol i vse uvas poluchitsya (nadeyus'). Yasno teper' pochemu "viletaet"?


"RE: dlopen, dlsym, dlclose..."
Отправлено Арлекин , 17-Янв-02 17:59 
> Собираю:
> export LD_LIBRARY_PATH='pwd'
> gcc  -c -fpic test.cpp
> gcc -shared -lc  -o test.so  test.o

Я могу ошибаться, т.к. гнутым не пользуюсь и в Линухе не работаю, но я не нашел указания собрать библиотеку dl.so.
СПАРКовский компилер требует ЭТО явно указать и я сильно сомневаюсь, что гнутый делает что-то по умолчанию.
И если я прав, в dl.so, если она ТАМ есть, может и не быть никакого hello вообще. Ну и с указателями надо полегче - проверяй mmm на NULL перед вызовом. dlsym, если не найдет точку входа вернет нул и ты передашь управление в никуда = SIGSEGV (11)


"RE: dlopen, dlsym, dlclose..."
Отправлено sergmsr , 18-Янв-02 11:52 
>> Собираю:
>> export LD_LIBRARY_PATH='pwd'
>> gcc  -c -fpic test.cpp
>> gcc -shared -lc  -o test.so  test.o
>
>Я могу ошибаться, т.к. гнутым не
>пользуюсь и в Линухе не
>работаю, но я не нашел
>указания собрать библиотеку dl.so.
>СПАРКовский компилер требует ЭТО явно указать
>и я сильно сомневаюсь, что
>гнутый делает что-то по умолчанию.
>
>И если я прав, в dl.so,
>если она ТАМ есть, может

dl.so это опечатка. вместо нее test.so
>и не быть никакого hello
>вообще. Ну и с указателями
>надо полегче - проверяй mmm
>на NULL перед вызовом. dlsym,
>если не найдет точку входа
>вернет нул и ты передашь
>управление в никуда = SIGSEGV
>(11)



"RE: dlopen, dlsym, dlclose..."
Отправлено Арлекин , 18-Янв-02 13:39 
Командой ( Solaris )
/usr/ccs/bin/ld -s _имя_.so_файла
можно посмотреть правильно ли ты собрал либу.

"RE: dlopen, dlsym, dlclose..."
Отправлено Soldier , 19-Янв-02 10:59 
>Командой ( Solaris )
>/usr/ccs/bin/ld -s _имя_.so_файла
>можно посмотреть правильно ли ты собрал
>либу.

U-f-f. Chego vi ogorod gorodite? Vse gorazdo prosche. Dayu tol'ko ukazanie, a pochemu ono tak ili inache, sami razbiraytes'.

Prezhde vsego pereimenuyte *.cpp v *.c (VAZHNO!).
Pomestite faile test.c i foo.c v odnoy direktorii i v dlopen ukazhite "./test.so" .

Dalee
1) gcc -shared -o test.so test.c
2) gcc -o foo foo.c

I VSE!!!


"RE: dlopen, dlsym, dlclose..."
Отправлено Soldier , 19-Янв-02 11:04 
>2) gcc -o foo foo.c
Sorry, t.e.
gcc -o foo -ldl foo.c