【问题标题】:Can I dynamically load an executable on linux?我可以在 linux 上动态加载可执行文件吗?
【发布时间】:2011-06-14 16:22:18
【问题描述】:

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

【问题讨论】:

  • 当 python 抱怨时,你用来构建 .SO 的编译标志是什么?
  • SO 工作得很好,当我构建一个可执行文件时,事情就没有工作了。对于我使用的exe:g++ -Wl,-rpath,。 -Wl,-rpath-link,build/debug/final -o build/debug/final/dummy build/debug/intermediate/dummy/projects/dummy/main.o
  • 如果添加-shared arg,是否不再可执行?

标签: python c linux dynamic-linking


【解决方案1】:

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

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

【讨论】:

  • 谢谢。是的,我可以将所有代码移动到共享对象。我正在为一个团队构建工具,所以我不想把它强加给我所有的程序员。
【解决方案2】:

尝试使用-pie 选项链接可执行文件(如果有可能的话)。

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

【讨论】:

  • 谢谢!那是一个很好的指针。除了 -pie 我还必须与 -Wl,--export-dynamic 链接。效果很好。
  • @samwise:如果-Wl,--export-dynamic 感觉太冗长,你也可以将-rdynamic 传递给编译器驱动程序...
  • @samwise:或者,如果您不想从可执行文件中导出所有符号,请使用 --dynamic-list,如:stackoverflow.com/questions/6292473/… 中所述
猜你喜欢
  • 1970-01-01
  • 2019-06-10
  • 2021-02-14
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
相关资源
最近更新 更多