【问题标题】:What is the difference between /lib/i386-linux-gnu/libc.so.6, /lib/x86_64-linux-gnu/libc.so.6 and /usr/lib/x86_64-linux-gnu/libc.so?/lib/i386-linux-gnu/libc.so.6、/lib/x86_64-linux-gnu/libc.so.6 和 /usr/lib/x86_64-linux-gnu/libc.so 有什么区别?
【发布时间】:2012-11-27 06:39:30
【问题描述】:

我在我的 Linux Mint 14 Nadia 中安装了 Matlab(a uname -a 显示:Linux Ideapad-Z570 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/ Linux),当从命令行调用它时,我会得到:“/lib64/libc.so not found”。

我按照 mathworks 的帮助在 /lib64 中创建了一个链接:

ln -s /lib/x86_64-linux-gnu/libc.so.6 .

这解决了问题。

现在,如果我找到这个库,我会得到:

locate "libc.so"
/lib/i386-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so

我将在这台计算机上使用 gcc 进行编译,我想要完整的 64 位编译。拥有所有这些不同的 libc.so 库究竟意味着什么? gnu 编译器将使用哪一个?我需要用 gcc 做任何不同的事情来编译 64 位吗?

我也愿意为我的新 i7 内核尽可能地优化!!!

【问题讨论】:

  • user1889975,嗨。您确定所有 3 个libc.sos 都不同吗?然后执行ls -l 以查找符号链接。此外,最近在混合 32/64 位系统上的 32/64 位库的默认路径发生了变化(从 /lib64/lib/tr-ip-le/),请查看此页面以获取更多信息 wiki.debian.org/Multiarch/TheCaseForMultiarch
  • 我确实检查过,它们不是符号链接。谢谢你的建议

标签: gcc 64-bit libc


【解决方案1】:

/lib/i386-linux-gnu/libc.so.6

这是 32 位版本的库。

/lib/x86_64-linux-gnu/libc.so.6

这是 64 位版本的库。

两者通常都是指向实际库文件的符号链接,通常会根据 glibc 版本号命名,例如libc-2.15.so

/usr/lib/x86_64-linux-gnu/libc.so

这不是一个库,而是一个链接脚本文件,它引用了上面的符号链接。

为什么我们需要所有这些:

首先,无论安装的 libc 版本如何,链接器都将始终搜索 libc.so,因为编译器驱动程序将始终将 -lc 选项传递给链接器。名称 libc 保持不变,表示该库的最新版本。

符号链接libc.so.6 以库的soname 命名,或多或少对应于库的ABI 版本。与libc.so 链接的可执行文件实际上包含对libc.so.6 的运行时依赖项。

如果我们想象有一天会发布一个严重不兼容 ABI 的 libc,它的 soname 可以命名为 libc.so.7,例如,这个版本可以与旧的 libc.so.6 版本共存,因此与其中一个或另一个链接的可执行文件可以共存在同一个系统中,

最后,名称libc-2.15.so 指的是libc 版本,当您安装新的libc 包时,名称将更改为libc-2.16.so。如果它与以前的版本二进制兼容,libc.so.6 链接将保持这种命名方式,现有的可执行文件将继续工作。

【讨论】:

  • 非常感谢。这对我理解原因很有帮助。
  • 为什么他们还要用.so命名链接脚本?这令人困惑。
【解决方案2】:

要找到使用哪个,您必须首先找到ld(链接器)用于查找库的顺序,如下所示:

ld --verbose | grep SEARCH

对我来说,它给了我这个输出:

SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib64"); SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib"); SEARCH_DIR("/usr/lib"); SEARCH_DIR("/usr/local/lib");

这意味着在我的计算机上,ld 按顺序查找这些目录:

  1. /usr/x86_64-unknown-linux-gnu/lib64
  2. /usr/x86_64-unknown-linux-gnu/lib
  3. /usr/lib
  4. /usr/local/lib

所以如果 libc 在 /usr/x86_64-unknown-linux-gnu/lib64 中,并且 libc 也在 /usr/lib 中,它将使用 /usr/x86_64-unknown-linux-gnu/lib64 版本,因为它被列在第一位。

【讨论】:

  • 非常有趣且乐于助人。谢谢你。就我而言,它首先列出“/lib/x86_64-linux-gnu”,所以我很适合编译 64 位代码。现在,我想完全理解这一点。为什么我的 linux 发行版会在几个不同的位置安装这个库?
  • @Alejandro,没问题!如果解决了,可以这样标记吗?
  • 对不起,但我还是想知道为什么这么多地点?这些文件是否一遍又一遍地复制?我想这可能是有原因的。当我得到这些答案时,我会将其标记为已解决。再次感谢您!
  • 是的,有。据我所知,locate ... (/lib/i386...) 的第一个结果是 32 位版本的 libc(运行 32 位应用程序所需),第二个条目(/lib/x86_64... ) 是 libc 的 64 位版本,第三个条目是第二个的符号链接。我不太清楚为什么要创建符号链接,但我认为它与其他程序或编译器的兼容性有关。
  • 其实第三个不是符号链接。但我明白你在说什么
【解决方案3】:

您创建的符号链接对 GCC 没有任何影响。 32 位版本仅在使用-m32 GCC 标志编译时使用。 GCC 不会尝试生成 32 位二进制文​​件,除非您明确告诉它(通过使用该标志)。

【讨论】:

  • 谢谢,非常清楚gcc是否会默认编译64位代码。
猜你喜欢
  • 1970-01-01
  • 2023-01-17
  • 2023-02-23
  • 2022-08-11
  • 1970-01-01
  • 2020-03-25
  • 2019-07-04
  • 2014-11-19
  • 1970-01-01
相关资源
最近更新 更多