【问题标题】:ld: cannot find lc -ERRORld: 找不到 lc -ERROR
【发布时间】: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 查看您缺少哪些部分。

标签: c gcc linker ld


【解决方案1】:

由于您直接调用ld,因此没有默认库或默认库搜索路径 提供,就像ldgcc 工具驱动程序间接调用一样 以通常的方式。

除了明确告诉ld 链接libc (-lc),您还必须明确 告诉它在哪里可以找到libc,使用-L 选项。 (看来你 认为L&lt;path&gt;-l&lt;libname&gt;替代。不是。)

因此找出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

这将解决您问题中的问题(但不一定是其他问题)。

【讨论】:

  • 你好,mike,忙于其他模块,现在回到这个模块。它仍然提示相同的错误。有相同的解决方案吗?我完全按照你的建议做了。
  • 是一样的。 ld: 找不到 lc
  • @ArjunJain 这是错误消息。导致它的命令行是什么?
  • 我在命令行中有错字。你的命令行工作得很好。谢谢你。我还想知道如何破译链接器映射文件。每个字段是什么意思?任何指导都会有所帮助。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 2021-10-11
  • 2013-04-08
相关资源
最近更新 更多