Dynamicke linkovani & -export-dynamic
Jirka Kosina
jikos na jikos.cz
Čtvrtek Září 4 01:23:24 CEST 2003
Zdravim,
Mejme nasledujici dva soubory:
$ cat foo.c
#include <stdio.h>
extern void bar(void);
void foo()
{
puts("Hello from foo");
bar();
}
$ cat bar.c
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
typedef void (*function_t) (void);
void bar()
{
puts("Hello from bar");
}
int main()
{
function_t foo;
void *handle;
const char *error;
bar();
if (!(handle = dlopen("./libfoo.so", RTLD_NOW | RTLD_GLOBAL))) {
fprintf(stderr, "%s\n", dlerror());
return EXIT_FAILURE;
}
foo = dlsym(handle, "foo");
if ((error = dlerror()) != NULL) {
fprintf(stderr, "foo: %s\n", error);
return EXIT_FAILURE;
}
foo();
dlclose(handle);
return 0;
}
Pak ale:
$ gcc -shared -fPIC -o libfoo.so foo.c -lc
$ gcc -static -o bar bar.c -ldl -Wl,-export-dynamic
$ ./bar
Hello from bar
./libfoo.so: undefined symbol: bar
Pokud nebudu trvat na staticke binarce, tak to projde:
$ gcc -o bar bar.c -ldl -Wl,-export-dynamic
[jikos na twin C]$ ./bar
Hello from bar
Hello from foo
Hello from bar
Otazka je proc. Mel jsem za to, ze mi kdysi na nejakem prehistorickem
linuxu fungovala i ta prvni varianta.
Problem je evidentne v tom, ze v pripade staticky slinkovane binarky se
nedostane nejakym zpusobem ke slovu dynamicky linker, ktery by
'dodefinoval' symbol bar, ktery je v libtest.so ze zjevnych duvodu
nedefinovany.
Mam sklerozu a v linuxu toto neslo a jit nemuze, nebo se nekdy neco
zmenilo?
Diky.
--
JiKos.
Další informace o konferenci Linux