指定本地libc会调用全局libc吗?

指定本地libc会调用全局libc吗?

如果我运行命令 foo 并指定要使用的不同 libc,如下所示:

LD_LIBRARY_PATH=$PATH_TO_MY_CUSTOM_LIBC foo

全局定义的 libc 是否用于运行上面给出的任何命令?


为了上下文:考虑这样一种情况:您的 libc 在您的计算机上物理存在且可访问,但由于某种原因无法使用。给定登录的 shell,为了执行特定命令,您需要提供不同的 libc。

指定LD_LIBRARY_PATH内联,会将其设置为工作 libc 的位置,而无需调用全局定义的 libc。

为了在本地定义新的环境变量,全局定义的 libc 是否会被相同地调用?

答案1

不。动态链接不是 libc 意义上的一部分/lib/libc.so.6,它是 的功能/lib/ld.so(它们在过去几年中都对文件名和路径进行了一些更改,但本质是相同的)。

是的ld.so,动态链接器也是一个共享库。加载它是大多数 Linux 二进制文件在调用其main()函数之前所做的第一件事。

虽然ld.so它是 libc 的不同文件,但它的源代码和编译的二进制形式也是 gnu libc 发行版的一部分。

链接ld.so来自硬编码代码块,由 gcc 提供给每个 Linux ELF 二进制文件。它的路径也被硬编码到二进制文件中。你不能轻易改变,尽管如果需要的话是可以改变的。

如果您libc.so.6使用备用LD_LIBRARY_PATH设置覆盖,该库将用您自己的库取代有序的 libc,但它仍将由正常的ld.so.

因此,你的问题的答案是“是的,但是......”。

答案2

当您执行问题中给出的命令时:

LD_LIBRARY_PATH=$PATH_TO_MY_CUSTOM_LIBC bash -c 'foo'
  • 执行时bash使用路径中提供的 libc($PATH_TO_MY_CUSTOM_LIBC如果路径中存在)。它是尊重该环境变量的链接器/加载器。
  • 在 bash(您称之为foo)内执行的命令将使用 libc,该 libc 可以通过本身查阅的链接器/加载器定期在系统中找到/etc/ld.so.cache

相关内容