链接共享库而不实际拥有它

时间:2014-01-14 14:47:50

标签: gcc compiler-errors makefile arm reverse-engineering

我试图交叉编译使用共享库的arm汇编代码:/system/lib/libxyz.so(在主机设备上),并使用动态链接器:/ system / bin / linker - 也位于主机设备上。

所以我编译:

arm-eabi-gcc -mcpu="cortex-a9"  -Wl,-dynamic-linker=/system/bin/linker -llibxyz.so -Wl,--unresolved-symbols=ignore-all -nostdlib topsecret.S -o topsecret

我也用:

-Wl,--unresolved-symbols=ignore-all

要忽略任何未定义的符号,因为我在编译时没有真正拥有它们 - 我正在使用asm代码来调用正确的地址。

我得到的琐碎错误是:

arm-eabi/bin/ld cannot find -llibxyz.so, collect2: ld returned 1 exit status

我真的不想拥有libxyz.so库,我希望编译器忽略错误,并将依赖项添加到ELF Header。 我试过--Wl, - 不按需要,-Wl, - 根据需要参数,但这没有帮助。

问题是我是否可以忽略错误,伪造库或任何其他解决方案,这些解决方案将为我提供在标题中具有依赖性的良好二进制文件。

Link shared library in gcc without file? 这个解决方案并不好,因为我不想改变asm代码,只想改变编译机制。

1 个答案:

答案 0 :(得分:1)

抱歉,但您无法做到。链接器想要查看共享库,以便它知道在那里定义了哪些符号,哪些符号不定义;它需要知道如何理解链接是如何工作的。您必须将目标的共享库复制到开发系统,或者使用您引用的答案(dlopen等)中建议的显式加载,并使用dlsym()自行创建链接。 - MadScientist

您可以将文件从主机传输到构建版本。如果您不能这样做,那么链接器就无法知道哪个库中存在未解析的符号。您可以创建一个带有填充程序的虚假主机库来实现。即使您无法传输主机库(主机已锁定或其他内容),这也将起作用。这将允许您在构建计算机上进行链接,它应该通过其加载程序修补主机上的完整实现。 - 无艺术的噪音