我有一个对象文件,其中有一个 main() 函数,只需要与 crt... 对象链接即可成为可执行文件。不幸的是,我只能编译,不能将其链接为可执行文件。
所以我决定创建 ac 程序(在具有工作 GCC 和链接器的 pc 上)以在自身末尾附加对象并执行在运行时附加的代码(模拟链接对象)。
我看到了 DL API,但我不知道如何使用它来解决我所说的问题。
愿某人帮助我知道,我如何执行附加在可执行文件末尾的代码。
避免这样做;这将是一团糟....而且它可能无法可靠地工作,至少如果程序动态链接到 libc6.so
(例如因为ASLR)
只需使用共享对象和动态链接库(参见动态链接器维基页面)。您需要了解dlopen(3)等。
如果您真的坚持,请花数周时间了解更多信息:阅读 Levine 的关于Linker and Loaders的书、阅读Advanced Linux Programming、阅读许多手册页(包括execve(2)、mmap(2)、elf(5)、ld。 so(8) , ...) 研究 and 的内核代码execve
、mmap
GNU libc和MUSL libc源代码(有关动态链接器实现的详细信息)、x86-64 ABI或目标处理器的ABI(是ARM?),了解有关 GNU binutils等的更多信息,等等等等。
简而言之,做这些乱七八糟的事情你的生命太短暂了,除非你已经是专家,例如能够实现你自己的动态链接器。
显然,您的真正问题似乎是在 ARM 上使用tinycc(我猜是在 Android 下)。然后我会在他们的邮件列表中询问(可能提供一些补丁),或者简单地使用 binutils 并制作你自己的 GNU ld链接器脚本以使其工作。然后问题变得完全不同并且与您的原始问题完全无关。根据谷歌搜索,以前可能有一些解决这个问题的尝试。