当前位置: 首页 > 面试题库 >

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

殷承恩
2023-03-14
问题内容

我为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) +++


 类似资料:
  • vendor 文件是什么? 任何一个 Composer 程序包想要传递给安装包的用户的命令行脚本都应该被列为 vendor 文件。 如果包包含了包用户不需要的其他脚本(如构建或编译脚本),则代码不应被列为 vendor 文件。 它是如何定义的? 它是通过将 bin 键添加到项目中来定义的 composer.json。它被指定为文件数组,因此可以为任何给定项目添加多个二进制文件。 { "bi

  • 问题内容: 首先,我已经在Google上进行了搜索,但只找到了将压缩文件(例如)嵌入到Shell脚本中的示例。 基本上,如果我有一个打印字符串的C程序(),请说 Hello World! 。 我编译它以获得可执行的二进制文件 现在我有一个shell脚本 我要问的是是否有可能将二进制( hello )嵌入到shell脚本中,以便在我运行时 它执行二进制文件以打印 Hello World! 。 澄清

  • 本文向大家介绍Python编译为二进制so可执行文件实例,包括了Python编译为二进制so可执行文件实例的使用技巧和注意事项,需要的朋友参考一下 通过cpython把python的文件转换为二进制文件,达到代码保护的目的 1、下载Cython-0.28.2.tar.gz python setup.py install安装 2、创建你需要打包成二进制的python文件 3、创建一个setup.py

  • 我正在将一个CLI库从Ruby移植到Node.js。在我的代码中,我会在必要时执行几个第三方二进制文件。我不确定如何在Node中最好地完成这一点。 下面是Ruby中的一个示例,我调用PrinceXML将文件转换为PDF: 节点中的等价代码是什么?

  • 问题内容: 我有一个包含两个简单的Java swing文件的程序。 如何为程序制作可执行的jar文件? 问题答案: jar文件只是包含Java文件集合的文件。为了使jar文件可执行,你需要指定 Class在jar文件中的位置。示例代码如下。 编译你的类。要制作一个jar,你还需要创建一个清单文件()。例如, 将编译后的输出类文件(JarExample.class,JarExample $ 1.cl

  • 我有一个可执行的二进制文件,我需要运行它,以交互方式从中读取,并在它请求输入时写入 我说的是交互式shell,但在web浏览器中,例如: 只要二进制产生输出,我想把它发送到浏览器 一旦二进制请求用户输入,我希望用户从浏览器写入输入 现在我已经用做了同样的事情,我用管道与正在运行的进程通信,它工作得很好,但是我必须在运行二进制之前传递所有必需的输入 以下是我迄今为止编写的代码: 任何帮助都将不胜感激