LINUX.ORG.RU

dlopen


0

0

Есть f.so

void test();
void f()
{
test();
}

main
main()
{
void* so = dlopen("f.so",RTLD_LAZY)
void* f = dlsym(so,"f");
}
test()
{

}
при загрузки so говорит что undefined symbol: test

anonymous

Re: dlopen

Телепаты в отпуске :)

Наверное, неправильно собираешь. У меня твой пример работает...

Die-Hard ★★★★★ ()

Re: dlopen

bash-2.05b$ cat main.c
#include <dlfcn.h>
main()
{
void* so = dlopen("./f.so",RTLD_LAZY);
if(!so)
printf("%s\n",dlerror());

void* f = dlsym(so,"f");
}

void test()
{

}

bash-2.05b$ gcc ./main.c -ldl
bash-2.05b$ cat f.c
void test();
void f()
{
test();
}
bash-2.05b$ gcc -shared f.c -o f.so
bash-2.05b$ ./a.out
./f.so: undefined symbol: test
bash-2.05b$

anonymous ()
Ответ на: Re: dlopen от anonymous

Re: dlopen

bash-2.05b$ cat f.c
void test();
void f()
{
test();
}
bash-2.05b$ gcc -shared -fPIC f.c -o f.so
bash-2.05b$ cat main.c
#include <dlfcn.h>
main()
{
void* so = dlopen("./f.so",RTLD_LAZY);
if(!so)
printf("%s\n",dlerror());

void (*f)();

f = (void(*)())dlsym(so,"f");
if(!f)
printf("%s\n",dlerror());

f();
}

void test()
{
printf("zz\n");
}

bash-2.05b$ gcc main.c -ldl
bash-2.05b$ ./a.out
./a.out: relocation error: ./f.so: undefined symbol: test
bash-2.05b$

anonymous ()
Ответ на: Re: dlopen от anonymous

Re: dlopen

> Попробуй при построении main.c добавить -Wl,-E

Разумеется!

Конечно, можно было догадаться, даже не будучи телепатом :-)

Die-Hard ★★★★★ ()
Ответ на: Re: dlopen от Die-Hard

Re: dlopen

> Конечно, можно было догадаться, даже не будучи телепатом :-)

мне кажется, что я бы тоже догадался сразу, когда бы код
был отформатирован. не знаю как другие, а я просто не в
состоянии прочитать даже вот эти несколько строк.

Die-Hard, я к тебе как к модератору обращаюсь. ну ведь
постоянно сюда постят отрывки кода, и он всегда в таком
виде. может добавить к help message, который я сейчас
вижу на экране пару слов про Preformated text возле кнопки
Post ?

а вообще, лучше бы Preformated сделать default, imho.

idle ★★★★★ ()
Ответ на: Re: dlopen от idle

Re: dlopen

2idle:

> может добавить к help message, который я сейчас вижу на экране пару слов про Preformated text возле кнопки Post ?

Ну, я подкину идею Максу -- не думаю, что у него сейчас найдется время; todo лист сейчас достаточно велик...

> а вообще, лучше бы Preformated сделать default, imho.

Не, совсем не катит:

1. Preformatted затребован, в основном, только в этом форуме.

2. Большинство тусующихся на ЛОРе по происхождению виндузятники. Им не объяснить, что такое конец строки: для людей, пишущих письма в Ворде, конец строки эквивалентен концу параграфа.

Если сделать Preformatted умолчательным, мы немедленно будем иметь большинство сообщений сформатированными в одну строку.

Die-Hard ★★★★★ ()
Ответ на: Re: dlopen от Die-Hard

Re: dlopen

> а вообще, лучше бы Preformated сделать default, imho.

> Не, совсем не катит:

> 1. Preformatted затребован, в основном, только в этом форуме.

почему бы не сделать преформат по умолчанию только в этом форуме? это одна строка в jsp.

anonymous ()
Ответ на: Re: dlopen от anonymous

Re: dlopen

anonymous (*) (26.04.2005 22:50:24):

> почему бы не сделать преформат по умолчанию только в этом форуме?

Пункт 2.

Die-Hard ★★★★★ ()
Ответ на: Re: dlopen от fortl

Re: dlopen

> ...только так чтобы если строка длинная - разрывал

Совсем IMHO неверный подход: preformatted для того и нужен, чтобы "as it is" можно было показать. Например, представь себе, надо запостить длинную строку из какого-нибудь конфига с непредусмотренными переносами.

Именно поэтому Preformatted и не стОит делать default: он сравнительно редко бывает нужен.

Die-Hard ★★★★★ ()
Ответ на: Re: dlopen от Die-Hard

Re: dlopen

а когда бывает нужне TeX?
неужели трудно все \r?\n заменять на <br>
?
????

anonymous ()
Ответ на: Re: dlopen от anonymous

Re: dlopen

anonymous (*) (27.04.2005 0:41:15):

> неужели трудно все \r?\n заменять на <br> ? ????

Крут :-)

> а когда бывает нужне TeX?

TeX paragraphs w/quoting был поставлен как default "по многочисленным просьбам" как наиболее удобный для _большинства_.

Die-Hard ★★★★★ ()
Ответ на: Re: dlopen от Die-Hard

Re: dlopen

> Конечно, можно было догадаться, даже не будучи телепатом :-)

Прошу прощения, можно глупый вопрос - что означает -Wl,-E? Из man gcc:

   Options for Linking

   [...]

   -c
   -S
   -E  If any of these options is used, then the linker is not run, and
       object file names should not be used as arguments.

Что значит "linker not run", если main все равно линкуется с -ldl?
Спасибо большое.

murla ()
Ответ на: Re: dlopen от murla

Re: dlopen

2murla:

man gcc:

. . .
-Wl,option
Pass option as an option to the linker. If option
contains commas, it is split into multiple options at
the commas.


man ld:

. . .
-E
--export-dynamic
When creating a dynamically linked executable, add all
symbols to the dynamic symbol table. ... If you use "dlopen" to load a dynamic object which
needs to refer back to the symbols defined by the program, rather than some other dynamic object, then you
will probably need to use this option when linking the
program itself.

Die-Hard ★★★★★ ()
Ответ на: Re: dlopen от Die-Hard

Re: dlopen

Всем спасибо Все свободны...:)

anonymous ()
Ответ на: Re: dlopen от Die-Hard

Re: dlopen

Большое спасибо. Но ...

> man gcc:
>
> ...
> -Wl,option
> Pass option as an option to the linker.

Конечно. Я потому и указал, что привел часть man gcc ниже "Linker Options".
Я так понимаю, это и есть опции, которые подсталяются в -Wl,options. "-E"
для компилятора - это вызов одного препроцессора. Чем эти опции отличаются
от опций ld?
Извините, если очень сильно туплю :)

murla ()
Ответ на: Re: dlopen от murla

Re: dlopen

2murla:

Честно говоря, не понимаю вопроса...

gcc -Wl,abracadabra

передает опцию abracadabra линкеру "as it is", никак ее не интерпретируя.

Т.о., при вызове

gcc -Wl,-E main.c -ldl

gcc передаст опцию -E линкеру, а сам ее даже не увидит.

Не нравится -Wl,-E -- можно через -Xlinker опцию линкеру передать:

gcc -Xlinker -E main.c -ldl

Die-Hard ★★★★★ ()
Ответ на: Re: dlopen от Die-Hard

Re: dlopen

> Честно говоря, не понимаю вопроса...

В man gcc можешь набрать в поиске строчку "Options for Linking", и под ней
ты найдешь описание пресловутой опции "-E", и оно скажем прямо, отличается
от описания, данного в ld.

       Options for Linking

       These options come into play when the compiler links object files into
       an executable output file.  They are meaningless if the compiler is not
       doing a link step.

Я так понял сначала, что речь здесь как раз и идет об опциях, подставляемых
после "-Wl" и запятой.

murla ()
Ответ на: Re: dlopen от murla

Re: dlopen

2murla:

Ну и фантазия у тебя! :-)

-c -S -E If any of these options is used, then the linker is not run, and object file names should not be used as arguments.

. . .

-Wl,option Pass option as an option to the linker.

Как можно передать нечто тому, что вообще не запускается?

Хотя, конечно, написано несколько идиотически:

They are meaningless if the compiler is not doing a link step. ... If any of these options is used, then the linker is not run, ...

Die-Hard ★★★★★ ()
Ответ на: Re: dlopen от Die-Hard

Re: dlopen

> Как можно передать нечто тому, что вообще не запускается?

Спасибо, понял наконец. Блин, я таки жуткий тормоз %-)

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