我的目的是使用我自己的链接器脚本链接两个代码,为此,我创建了一个简单的链接描述文件(来自互联网的所有帮助) 这是我的链接器脚本“link.lds”
SECTIONS
{
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}
我的两个简单的C代码如下。 1)l1.c
#include<stdio.h>
extern int a;
int main()
{
printf("%d",a);
return 0;
}
和 2)l2.c
int a=111;
我使用的命令是:
gcc -c l1.c l2.c
ld -o output -T link.lds l1.o l2.o -lc
执行上述步骤后,我遇到以下错误:
ld:cannot find lc
删除lc,
undefined reference to printf().
我也尝试使用-L / dirname将我带回了对printf错误的undef引用。
我可以获得一些帮助和指导...... PS-我知道我可能在概念上错了和/或可能不知道链接器执行/工作的正确顺序。 对此有任何帮助将受到高度赞赏。 非常感谢!
答案 0 :(得分:2)
由于您直接调用ld
,因此没有默认库或默认库搜索路径
如果ld
工具驱动程序间接调用gcc
,则会提供它们
以通常的方式。
除了明确告诉ld
链接libc
(-lc
)之外,还必须明确
还使用libc
选项告诉它在哪里找到-L
。 (好像是你
认为L<path>
是-l<libname>
的替代。它不是。)
因此,找出系统中libc.so
的位置。你可以这样做:
realpath $(gcc --print-file-name libc.so)
(注意,不是--print-file-name-libc.so
。@ n.m评论中有拼写错误
假设它是/usr/lib/x86_64-linux-gnu/libc.so
,就像我的系统一样。然后运行:
ld -o output -T link.lds l1.o l2.o -L/usr/lib/x86_64-linux-gnu -lc
这将解决您问题中的问题(但不一定是其他问题)。