Có hy vọng chạy dlopen(NULL, ...)
và nhận biểu tượng cho nhị phân được biên dịch tĩnh không?Sử dụng dlsym trên nhị phân tĩnh
Ví dụ: với mã sau tôi có thể nhận được biểu tượng nếu chương trình được biên dịch động và tôi sử dụng -rdynamic
.
$ gcc -o foo foo.c -ldl -rdynamic
$ ./foo bar
In bar!
Nhưng với -static
tôi nhận được một thông báo lỗi khó hiểu:
$ gcc -static -o foo foo.c -ldl -rdynamic
/tmp/cc5LSrI5.o: In function `main':
foo.c:(.text+0x3a): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
$ ./foo bar
/lib/x86_64-linux-gnu/: cannot read file data: Is a directory
Nguồn cho foo.c
sau:
#include <dlfcn.h>
#include <stdio.h>
int foo() { printf("In foo!\n"); }
int bar() { printf("In bar!\n"); }
int main(int argc, char**argv)
{
void *handle;
handle = dlopen(NULL, RTLD_NOW|RTLD_GLOBAL);
if (handle == NULL) {
fprintf(stderr, "%s\n", dlerror());
return 1;
}
typedef void (*function)();
function f = (function) dlsym(handle, argv[1]);
if (f == NULL) {
fprintf(stderr, "%s\n", dlerror());
return 2;
}
f();
return 0;
}