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