【发布时间】:2015-09-23 19:45:41
【问题描述】:
我的目的是使用我自己的链接器脚本链接两个代码,同样,我创建了一个简单的链接器脚本(所有帮助来自互联网) 这是我的链接器脚本,“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,这让我回到了 undef 对 printf 的引用错误。
我可以在同一方面获得一些帮助和指导吗... PS-我知道我可能在概念上出现了错误和/或可能不知道链接器执行/工作的正确顺序。 对此的任何帮助将不胜感激。 非常感谢!
【问题讨论】:
-
这是学习 GNU ld 的一些练习吗?如果没有,只需使用
gcc进行链接,它将为您完成所有“脏活”。 -
为什么需要自定义脚本?如果目标只是将两个对象链接到可执行文件中,则不需要链接描述文件。 -lc 错误意味着在链接器搜索路径中找不到您的 libc.a。你知道它在你的系统上的什么位置吗?
-
我已经编辑了这个问题。我故意想使用自定义链接器脚本来处理更大的问题陈述。另外,我找到了libc.a的路径,尝试使用-L / -l添加它,但徒劳无功,它仍然提示“未定义对printf()的引用”错误。
-
请移除 C++ 标签。另外,你找到了错误的 libc,使用
gcc --print-file-name-libc.so来查看正确的路径。此外,当您修复库路径时,您将能够创建一个可执行文件,但它不起作用。使用gcc -v l1.o l2.o -o output查看您缺少哪些部分。