简单的动态链接程序示例
时间:2006-04-23 来源:oliliango
在linux平台上(其实不一定要是linux,有gcc的地方,或者支持posix的×nix系统都可以吧),动态链接的一个小的示例程序如下:
#include <dlfcn.h>
#define SO_PATH_NAME "/lib/libc-2.3.5.so"
int main()
{
void (*my_printf)(const char*,char *,void *);
void *handle=dlopen(SO_PATH_NAME ,RTLD_LAZY);
my_printf=dlsym(handle,"printf");
my_printf("printf() 's address in %s is: 0x%x\n",SO_PATH_NAME,my_printf);
dlclose(handle);
return 0;
}
这里是示例调用了系统中的libc这个动态链接库中的函数。
唯一需要注意的是:编译的时候加上“-ldl”这个标志,这样才能成功找到dlopen,dlsym,dlclose这三个关键函数。
注:在《Computer System-A Programmer's Perspective》里面看到还有加个“-rdynamic”的标志。我测试的结果,此处dlopen的时候加上了RTLD_LAZY参数,编译的时 候没有加“-rdynamic”标志,结果似乎和加了之后效果一样。也许是因为这个测试程序比较小,效果不明显吧。
也可以自己编自己的动态库。编译动态库的时候,加上“-shared”标志就可以了。
嘿嘿,存此备忘。
#include <dlfcn.h>
#define SO_PATH_NAME "/lib/libc-2.3.5.so"
int main()
{
void (*my_printf)(const char*,char *,void *);
void *handle=dlopen(SO_PATH_NAME ,RTLD_LAZY);
my_printf=dlsym(handle,"printf");
my_printf("printf() 's address in %s is: 0x%x\n",SO_PATH_NAME,my_printf);
dlclose(handle);
return 0;
}
这里是示例调用了系统中的libc这个动态链接库中的函数。
唯一需要注意的是:编译的时候加上“-ldl”这个标志,这样才能成功找到dlopen,dlsym,dlclose这三个关键函数。
注:在《Computer System-A Programmer's Perspective》里面看到还有加个“-rdynamic”的标志。我测试的结果,此处dlopen的时候加上了RTLD_LAZY参数,编译的时 候没有加“-rdynamic”标志,结果似乎和加了之后效果一样。也许是因为这个测试程序比较小,效果不明显吧。
也可以自己编自己的动态库。编译动态库的时候,加上“-shared”标志就可以了。
嘿嘿,存此备忘。
相关阅读 更多 +