我试图交叉编译使用共享库的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代码,只想改变编译机制。
答案 0 :(得分:1)
抱歉,但您无法做到。链接器想要查看共享库,以便它知道在那里定义了哪些符号,哪些符号不定义;它需要知道如何理解链接是如何工作的。您必须将目标的共享库复制到开发系统,或者使用您引用的答案(dlopen等)中建议的显式加载,并使用dlsym()自行创建链接。 - MadScientist
您可以将文件从主机传输到构建版本。如果您不能这样做,那么链接器就无法知道哪个库中存在未解析的符号。您可以创建一个带有填充程序的虚假主机库来实现。即使您无法传输主机库(主机已锁定或其他内容),这也将起作用。这将允许您在构建计算机上进行链接,它应该通过其加载程序修补主机上的完整实现。 - 无艺术的噪音