【问题标题】:How to find out which files are being linked with "-lc"?如何找出哪些文件与“-lc”链接?
【发布时间】:2019-10-22 00:45:25
【问题描述】:

花了将近一个小时来过滤输出

clang -v hello_world.c

我得到以下链接命令:

ld -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 \
/usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o \
hello_world.o /usr/lib/x86_64-linux-gnu/libc.so \
/usr/lib/x86_64-linux-gnu/crtn.o

有没有更简单的方法来确定-lc 将扩展为/usr/lib/x86_64-linux-gnu/libc.so

我需要知道使用了哪些文件,以便将它们复制到另一个系统进行交叉编译。

编辑

看来我应该使用交叉编译工具链。来自 clang 文档:

https://clang.llvm.org/docs/CrossCompilation.html

当您将交叉编译器从 zip 文件解压缩到 目录,你必须使用--sysroot=。路径是根 解压文件的目录,Clang 会查找 目录 bin、lib 包含在其中。

我在哪里可以得到他们引用的那个 zip 文件?我对x86_64-linux-gnu 目标感兴趣。

【问题讨论】:

  • 这个问题的答案取决于你为什么想知道;请解释您的更大目标。另外,我强烈怀疑您从链接命令中删除了太多内容。
  • @zwol 我需要知道使用了哪些文件,以便将它们复制到另一个系统进行交叉编译。此命令成功交叉编译 hello world。
  • @Alex,交叉编译的常用方法包括安装和使用交叉编译工具链,其中包括适当的跨 C 标准库的实现。你不应该做任何你描述的事情。
  • @Alex 这对于 hello world 来说可能已经足够了,但是为了编译任意程序,您肯定至少还需要 libgcc.alibgcc_s.so(是的,这些库在它们的名称,但 clang 编译的代码可能仍需要它们),并且您可能还需要 crtbegin.ocrtend.o(我不记得它们是否仍然有意义)。
  • @Alex ... 我也正要说 John Bollinger 刚才所说的话。

标签: c linux clang cross-compiling libc


【解决方案1】:

这将列出链接到libc.so.6的所有文件:

for i in `find . -type f -executable`
do
    j=$(ldd $i | grep libc.so.6 | wc -l)
    if [ $j -gt 0 ]
    then
        echo $i
    fi
done

如果您想知道libc.so.6 的路径是什么,请在原始问题中说明类似于:

ldd `which ld` | sed 's/^[[:space:]]libc.so.6[[:space:]]=>[[:space:]]\(.*\)[[:space:]](.*)/\1/p' | grep --color=never libc.so

会输入路径,你显然可以用任何文件名替换ldd后面的表达式。

在 cmets 中,有一种直接使用 clang 的方法,尽管它会产生很多噪音,与 ldd 方式相比,它更难排除。

clang -Wl,--verbose hello_world.c

会告诉链接器是冗长的,它最终会告诉你为每个库尝试的所有库路径。

【讨论】:

  • ... 但仅适用于共享库,不适用于静态库。这也有其他问题,尽管它确实可能会产生有用的信息。
  • 但是ldd 什么? :) 我正在尝试找出文件名。
  • @Alex 编辑了答案,我希望这是你要找的,如果不是,请进一步澄清。
  • 感谢@xception,您的最终命令可以满足我的要求。所以当遇到-lc-lm等时,没有简单的方法来询问C编译器它实际使用的是哪个文件。它们必须手动搜索。
  • @Alex 如果我们正在谈论大量文件并且性能是一个问题,但我会说只为大量文件走这条路。如果您对该脚本感兴趣,该脚本是 gentoolkit 包的一部分,可在此处获取源代码gitweb.gentoo.org/proj/gentoolkit.git
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多