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使用可执行文件?如果没有,是否有另一种方法可以达到同样的目的?
您无法将可执行文件作为库打开.可执行文件的入口点将尝试重新初始化C库,并接管brk指针.这会破坏你的malloc堆.此外,可执行文件可能映射到没有重定位的固定地址,如果此地址与已加载的任何内容重叠,则也不可能出于此原因映射它.
您需要将其他程序重构为库,或将RPC接口添加到其他程序.
请注意,这不一定适用于PIE可执行文件.但是,除非可执行文件是专门为dlopen()ed编写的,否则这是不安全的,因为main()不会运行,main()因此不会进行任何初始化.