17

我需要从另一个程序调用一个函数。如果另一个程序是一个库,我可以简单地使用 dlopen 和 dlsym 来获取函数的句柄。不幸的是,另一个程序是 Unix 可执行文件,并且将其构建为库不是一种选择。在可执行文件上尝试 dlopen() 会给出以下错误消息:

dlopen([...]/testprogram, 1): no suitable image found. Did find: [...]/testprogram: can't map

这并不奇怪,因为 dlopen 用于库,而不是可执行文件。有没有办法让 dlopen 和 dlsym 与可执行文件一起工作?如果没有,是否有实现相同目标的替代方法?

4

4 回答 4

10

您不能将可执行文件作为库打开。可执行文件的入口点将尝试重新初始化 C 库,并接管brk指针。这会破坏你的 malloc 堆。此外,可执行文件可能会映射到没有重定位的固定地址,如果此地址与已加载的任何内容重叠,则由于这个原因也无法映射它。

您需要将其他程序重构为库,或者为其他程序添加 RPC 接口。

请注意,这不一定适用于 PIE 可执行文件。但是,除非可执行文件是专门为dlopen()编辑而设计的,否则这是不安全的,因为main()不会运行,main()因此不会发生任何初始化。

于 2011-07-07T22:06:30.563 回答
9

在某些 ELF 系统(尤其是 Linux)上,您可以dlopen()PIE 可执行文件。使用 GCC 时,只需使用-fpieor编译可执行文件-fPIE,并将其与 链接,并使用or-pie导出适当的符号(在其他 SO 答案中更详细地解释。--dynamic-list-rdynamic

于 2011-07-07T23:31:30.917 回答
1

此处的工具正是为了做到这一点,处理 ASLR/PIE 和非 ASLR/PIE。在 x86、ARM 和 MIPS(仅限 32 位)上编译。编辑 Makefile 以设置 ARCH 参数。

http://rtfc.org.uk/cliapi.html

这是我的工具,但它似乎可以做你想做的事。让我知道它是否不适合你。

我很感激我参加这个聚会有多晚,但是,嘿。

于 2015-06-16T09:18:00.070 回答
0

添加通过 dlopen 加载可执行文件的能力被注册为被拒绝的 glibc RFE(增强请求)。有关 RFE 的详细介绍以及针对某些特殊情况的可能方法,请参见

[http://sourceware.org/bugzilla/show_bug.cgi?id=11754][1]

不包括 PIE,在幕后实现这样的功能会有很多问题。

于 2013-07-31T15:27:39.590 回答