Hello Stack Overflow社区,
我正在开展一个c项目,将多个c程序交错为一个二进制文件,可以将交错程序作为踏板或叉子运行,以便进行基准测试。
因此,我在所需程序的每个程序文件夹中运行make,并将所有带有“ld -r”的.o文件预链接到一个新的.o文件。之后,我为每个“大”.o文件添加一个特定的命名函数,除了运行每个程序的main()并提供argc和argv之外什么都不做。然后我使用objcopy来定位每个全局符号,除了未知的符号和我应该运行main()的特定函数之一。最后,我将这些被操纵的.o文件与我的程序链接在一起,该程序将特定的命名函数作为线程或叉子或者在另一个之后运行。
现在问题/问题: 我遇到了静态库的问题。我使用ffmpeg进行测试,它构建了静态库,如libavcodc和libavutil等。不幸的是,“ld -r”没有链接.a文件。所以我试图用ar -x提取这些库,然后以上面提到的方式将提取的.o文件链接到“大”的新.o文件。但我没有工作,因为libavcodec和libavutil都包含文件ff_inverse.o。当我构建ffmpeg时,这显然不是问题,ffmpeg将链接这些静态库。但是,两个库都包含它,因此必须有一个机制来做出选择,ff_inverse.o可以使用和链接。所以我的问题:这是如何工作的?区别在哪里?
答案 0 :(得分:0)
ld使用普通链接的方式是优先考虑库。首先在命令行中列出的库首先链接,并且仅当符号仍然未解析时才会移动到下一个库。链接静态库时,它会忽略每个.o文件的名称,因为名称是不必要的,只需要导出的符号。您可能希望通过按排序顺序提取库来模拟该行为。