Glibc

指定本地 libc 是否呼叫全域 libc?

  • September 3, 2015

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

LD_LIBRARY_PATH=$PATH_TO_MY_CUSTOM_LIBC foo

全域定義的 libc 是否用於執行上面給出的任何命令?


為了上下文:考慮您的 libc 在您的機器上物理存在並且可以訪問,但由於某種原因不能使用的情況。給定一個登錄的 shell,為了執行一個特定的命令,你需要提供一個不同的 libc。

指定LD_LIBRARY_PATH內聯,會將其設置為工作 libc 的位置,而無需呼叫全域定義的。

為了在本地定義新的環境變數,全域定義的 libc 會被呼叫嗎?

不,動態連結不是 libc 的一部分/lib/libc.so.6,它是 libc 的功能/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.

因此,您的問題的答案是“是的,但是……”。

引用自:https://unix.stackexchange.com/questions/227094