есть 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
в чем может быть проблема???
>есть 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"?
> Собираю:
> 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)
>> Собираю:
>> 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)
Командой ( Solaris )
/usr/ccs/bin/ld -s _имя_.so_файла
можно посмотреть правильно ли ты собрал либу.
>Командой ( 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.cI VSE!!!
>2) gcc -o foo foo.c
Sorry, t.e.
gcc -o foo -ldl foo.c