Как dlsym может успешно импортировать функцию из раздельной двоичной библиотеки? - PullRequest
2 голосов
/ 21 июля 2011

Странно, что dlsym может импортировать функции из удаленных двоичных файлов.

Может кто-нибудь сказать мне, почему / как?

=== FILE: a.c ===
int a1() { return 1; }
int a2() { return 2; }
=== end of a.c ===

=== FILE: b.c ===
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>

typedef int (*fint)();

fint dlsym_fint(void *handle, char *name)
{
    fint x = (fint)dlsym(handle, name);
    char *err = NULL;
    if ((err = dlerror()) != NULL) {
        printf("dlsym: %s\n", err);
        exit(1);
    }
    return x;
}

int main()
{
    void *dl = dlopen("a.so", RTLD_NOW);
    fint a = NULL;
    a = dlsym_fint(dl, "a1");
    printf("%p: %d\n", a, a());
    a = dlsym_fint(dl, "a2");
    printf("%p: %d\n", a, a());
    return 0;
}
=== end of b.c ===

$ gcc -shared -fPIC -o a.so a.c
$ nm a.so
...
00000000000004ec T a1
00000000000004f7 T a2
...

$ strip a.so
$ nm a.so
nm: a.so: no symbols

$ gcc -o b b.c -ldl

$ ./b
0x2aaaaaac74ec: 1
0x2aaaaaac74f7: 2

Ответы [ 2 ]

6 голосов
/ 21 июля 2011

Попробуйте readelf -s a.so. Динамические символы все еще там после этого strip.

(или просто переключитесь на nm -D a.so.)

4 голосов
/ 21 июля 2011

strip удаляет таблицы символов отладки, а не таблицы динамических символов, используемые динамическим компоновщиком. Чтобы также удалить эти символы, используйте -fvisibility=hidden и функцию видимости символов / атрибуты переменных , чтобы выбрать, какие функции вы хотите предоставить.

...