问题是如何从共享库(UNIX/LINUX)获取函数地址?
我在C中编写了一些测试用例(见下文),在Ubuntu 10.04(amd64)和FreeBSD-8.2(amd64)上编译和运行.我没有感觉到任何差异,但我想知道更多关于可能的麻烦.
他们来了:
lib.c
char* f0(void) {
return "Hello, World!";
}
Run Code Online (Sandbox Code Playgroud)
main.c中
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
void *hlib, *addr;
char* (*foo)(void);
char* s;
int main(int argc, char** argv) {
if ( !(hlib = dlopen("./lib.so", RTLD_LAZY)) )
return 1;
if ( !(addr = foo = dlsym(hlib, "f0")) )
return 2;
s = foo();
printf("%p => %s\n", addr, s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在构建它:
gcc -o lib.o -c lib.c -Wall -Werror -O3 -fPIC
gcc -o lib.so -shared -nostartfiles lib.o …Run Code Online (Sandbox Code Playgroud)