我可以在Linux上动态加载可执行文件吗?

问题描述:

我写了一个测试框架,使用'nm'来检查共享库并查找测试函数。然后我使用Python的ctypes库来动态加载共享对象并执行测试功能。有没有办法做到这一点与可执行文件?当我对可执行模块尝试相同的技巧时,Python报告说它无法动态加载可执行文件。我可以在Linux上动态加载可执行文件吗?

+0

python抱怨时用于构建.SO的编译标志是什么? – tMC 2011-06-14 16:39:23

+0

SO工作正常,当时我构建了一个可执行文件,它无法正常工作。对于我使用的exe文件:g ++ -Wl,-rpath ,. -Wl,-rpath-link,build/debug/final -o build/debug/final/dummy build/debug/intermediate/dummy/projects/dummy/main.o – samwise 2011-06-14 16:51:42

+0

如果添加'-shared'参数,是吗?不再可执行? – tMC 2011-06-14 16:58:45

如果这是您自己的应用程序,您可以重新安排构建,以便您的可执行文件只有main() { real_main(); }real_main()位于libapp.so。然后你可以用你现有的代码测试libapp.so

如果可以加载另一个可执行文件,它可能涉及加载ld.so并让它来完成这项工作。如果您运行/lib/ld-linux.so(在Linux上),它将打印包含信息的节。

+0

谢谢。是的,我可以将我的所有代码移动到共享对象。我正在为一个团队构建工具,所以我宁愿不要强迫所有我的程序员。 – samwise 2011-06-14 16:53:29

尝试将可执行文件链接到-pie选项(如果您有可能,请执行此操作)。

(在this feature request上找到此选项,用于向dlopen添加对可执行文件的支持 - dlopen用于加载共享对象)。

+2

谢谢!这是一个伟大的指针。除-pie外,我还必须链接-Wl, - export-dynamic。精彩地工作。 – samwise 2011-06-14 18:38:37

+0

@samwise:如果'-Wl, - export-dynamic'感觉过于冗长,您也可以将'-rdynamic'传递给编译器驱动程序... – ninjalj 2011-06-14 18:54:14

+0

@samwise:或者,如果您不想导出所有符号从可执行文件中,使用'--dynamic-list'解释如下:http://stackoverflow.com/questions/6292473/how-to-call-function-in-executable-from-my-library/6298434#6298434 – ninjalj 2011-06-14 18:56:14