【问题标题】:Executing machine codes attached at the end of an executable执行附加在可执行文件末尾的机器代码
【发布时间】:2013-10-31 14:54:06
【问题描述】:

我有一个对象文件,其中有一个 main() 函数,只需要与 crt... 链接对象即可成为可执行文件。不幸的是,我只能编译,不能将其链接为可执行文件。

所以我决定创建一个 c 程序(在具有工作 GCC 和链接器的 pc 上)在其自身末尾附加对象并执行在运行时附加的代码(模拟链接对象)。

我看到了 DL API,但我不知道如何使用它来解决我所说的问题。

请帮助我知道,我如何执行附加在可执行文件末尾的代码。

【问题讨论】:

  • 解释为什么你不能链接你的目标文件;难以理解....如果你可以运行gcc来编译(一个.c源文件到一个.o目标文件),你应该可以运行samegcc.o 链接到可执行文件中(否则,您的gcc 编译器链安装不正确)! *crt*.o 文件是您工具链的一部分!
  • 请展示或解释更多关于您的代码的信息。你有源代码和构建过程的 URL 吗?将您的代码发布为免费软件(例如在github.com 或其他地方)并展示它!

标签: linux object gcc linker arm


【解决方案1】:

避免这样做;这将是一团糟......而且它可能无法可靠地工作,至少如果程序动态链接到libc6.so(例如因为ASLR

只需使用共享对象和动态链接库(参见dynamic linker wikipage)。你需要了解dlopen(3)等。

如果您真的坚持,请花数周时间了解更多信息:阅读 Levine 在 Linker and Loaders 上的书、阅读 Advanced Linux Programming、阅读许多手册页(包括 execve(2)mmap(2)elf(5)、@987654329 @, ...) 研究execvemmap 的内核代码、GNU libcMUSL libc 源代码(有关动态链接器实现的详细信息)、x86-64 ABIABI对于您的目标处理器(是 ARM 吗?),了解更多关于 GNU binutils 等的信息。

总之,做这些乱七八糟的事情,你的生命太短暂了,除非你已经是专家,例如能够实现自己的动态链接器。

附录

显然,您的真正问题似乎是在 ARM 上使用 tinycc(我猜是在 Android 下)。然后我会在他们的邮件列表中询问(可能提供一些补丁),或者简单地使用 binutils 并制作您自己的 GNU ld linker script 以使其工作。然后问题变得完全不同并且与您的原始问题完全无关。根据 Google 搜索,以前可能有一些解决此问题的尝试。

【讨论】:

  • 感谢您的帮助。我无法链接的原因是我为 arm 编译了 tcc 。它可以编译但不能链接(目标操作系统是android)所以我决定做我说的解决方案。
  • 我在 arm-linux-gnueabi 上编译了 tcc,它完全可以在 gnueabi 上运行,没有任何问题,但是在 arm-linux-androideabi 上使用它时,编译可以工作,但链接会出现有关 crt*.o 文件的错误。我尝试使用 gcc crt* 文件,但出现有关 libc_init 和 ... 的错误
猜你喜欢
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 2015-05-13
相关资源
最近更新 更多