在可执行文件上使用dlopen()

Jef*_*eff 13 unix executable dlopen

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

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

这并不奇怪,因为dlopen用于库,而不是可执行文件.有没有办法让dlopen和dlsym使用可执行文件?如果没有,是否有另一种方法可以达到同样的目的?

bdo*_*lan 8

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

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

请注意,这不一定适用于PIE可执行文件.但是,除非可执行文件是专门为dlopen()ed编写的,否则这是不安全的,因为main()不会运行,main()因此不会进行任何初始化.

  • 正如这里所讨论的:http://stackoverflow.com/questions/6617099/call-function-in-unrelated-executable-linux/6619977#6619977,对于PIE可执行文件这个答案是错误的,它实际上是一种特殊形式的共享库(甚至有ET_DYN e_type). (4认同)

nin*_*alj 7

在某些ELF系统(尤其是Linux)上,您可以使用dlopen()PIE可执行文件.使用GCC时,只需使用-fpie或编译可执行文件-fPIE,并将其链接-pie,然后使用--dynamic-list或导出相应的符号-rdynamic(在其他SO答案中有更详细的解释).