假设我有a.c
和b.c
来源。 b.c
中的代码调用a.c
,但a.c
从不直接调用b.c
中的任何函数。文件a.c
包含main函数。
我编译了它们,并获得了两个目标文件:a.o
和b.o
。我只能链接a.o
并获取可执行文件,生成map file
。此linker map
包含a.c
中所有函数的绝对地址。
现在我想要链接b.o
。我可以给链接器a.o
和b.o
,它会完美地工作。但由于a
没有调用b
,因此链接b.o
实际上并不需要a
的内容,只有a
内的每个函数的最终地址{ {1}}。因此,应该可以仅链接b.o
,仅链接map file
时生成的a.o
。
但是,我没有找到任何适当的标志告诉ld
它应该从地图文件中获取a的符号地址。 如何告诉ld
这样做?
我发现在网上向使用地图文件的人提及,但从未解释如何使用ld
实现。例如,一篇研究论文:
编译Contiki系统核心时,编译器生成一个映射文件,其中包含系统核心中所有全局可见函数和变量之间的映射及其地址。此地址列表用于预先链接Contiki模块。