如何自我dlopen可执行二进制文件

我为dlopen编写了一个程序

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);

}

但我收到“分段错误”错误,我使用.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);

}

仔细阅读dlopen(3),始终检查那里的dlopendlsym函数是否成功,并dlerror在失败时使用。

并用编译上面的ds.c文件

  gcc -std=c99 -Wall -rdynamic ds.c -o ds -ldl

不要忘记-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

乃至:

  % 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) +++

以上是 如何自我dlopen可执行二进制文件 的全部内容, 来源链接: utcz.com/qa/404946.html

回到顶部