我写了一个程序来自我解决
void hello()
{
printf("hello world\n");
}
int main(int argc, char **argv)
{
char *buf="hello";
void *hndl = dlopen(argv[0], RTLD_LAZY);
void (*fptr)(void) = dlsym(hndl, buf);
if (fptr != NULL)
fptr();
dlclose(hndl);
}
Run Code Online (Sandbox Code Playgroud)
但是我得到了"segemention fault"错误我用.so库测试了这个程序并且它可以工作但不能让它自己工作
你需要编码:
// file ds.c
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
void hello ()
{
printf ("hello world\n");
}
int main (int argc, char **argv)
{
char *buf = "hello";
void *hndl = dlopen (NULL, RTLD_LAZY);
if (!hndl) { fprintf(stderr, "dlopen failed: %s\n", dlerror());
exit (EXIT_FAILURE); };
void (*fptr) (void) = dlsym (hndl, buf);
if (fptr != NULL)
fptr ();
else
fprintf(stderr, "dlsym %s failed: %s\n", buf, dlerror());
dlclose (hndl);
}
Run Code Online (Sandbox Code Playgroud)
仔细阅读dlopen(3),总是检查那里的dlopen&dlsym功能是否成功,并dlerror在失败时使用.
并用.编译上面的ds.c文件
gcc -std=c99 -Wall -rdynamic ds.c -o ds -ldl
Run Code Online (Sandbox Code Playgroud)
不要忘记-Wall获取所有警告和-rdynamic标志(能够将dlsym自己的符号放入动态表中).
在我的Debian/Sid/x86-64系统上(gcc版本4.8.2,libc6版本2.17-93提供了-ldl我编译的内核3.11.6,binutils包2.23.90提供ld),执行./ds给出了预期的输出:
% ./ds
hello world
Run Code Online (Sandbox Code Playgroud)
乃至:
% ltrace ./ds
__libc_start_main(0x4009b3, 1, 0x7fff1d0088b8, 0x400a50, 0x400ae0 <unfinished ...>
dlopen(NULL, 1) = 0x7f1e06c9e1e8
dlsym(0x7f1e06c9e1e8, "hello") = 0x004009a0
puts("hello world"hello world
) = 12
dlclose(0x7f1e06c9e1e8) = 0
+++ exited (status 0) +++
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3813 次 |
| 最近记录: |