Linux

各種libc.so之間有什麼區別和關係?

  • June 13, 2018

在 Lubntu 18.04

$ whereis libc
libc: /usr/lib/x86_64-linux-gnu/libc.a /usr/lib/x86_64-linux-gnu/libc.so /usr/share/man/man7/libc.7.gz

$ 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

$ ls -li /usr/lib/x86_64-linux-gnu/libc.so  /lib/x86_64-linux-gnu/libc.so.6 /lib/i386-linux-gnu/libc.so.6
2101838 lrwxrwxrwx 1 root root  12 Apr 16 16:14 /lib/i386-linux-gnu/libc.so.6 -> libc-2.27.so
2101796 lrwxrwxrwx 1 root root  12 May 13 20:09 /lib/x86_64-linux-gnu/libc.so.6 -> libc-2.27.so
15736469 -rw-r--r-- 1 root root 298 Apr 16 16:14 /usr/lib/x86_64-linux-gnu/libc.so

各種之間有什麼區別和關係libc.so

哪個在使用?

謝謝。

我的問題來自https://stackoverflow.com/questions/50798907/why-does-loading-the-libc-shared-library-have-libraryloader-object-is-not-cal

謝謝。

它們都有不同的用途:

  • /lib/i386-linux-gnu/libc.so.6是 32 位 x86 C 庫的符號連結,用於執行 32 位執行檔;
  • /lib/x86_64-linux-gnu/libc.so.6是 64 位 x86 C 庫的符號連結,用於執行 64 位執行檔;
  • /usr/lib/x86_64-linux-gnu/libc.so(通常)是指向 64 位 C 庫(根據需要動態或共享)和動態連結器的連結器腳本,用於連結64 位執行檔(在建構它們時)。

建構和執行程序時有三種不同類型的連結:

  • 靜態連結:建構時連結器 ( ld) 在建構期間解析程序中使用的所有對象,合併使用的對象,並生成不使用外部庫的可執行二進製文件;
  • 動態連結,在建構時:ld解析程序中使用的所有對象,但不是將它們儲存在執行檔中,它只儲存對它們的引用;
  • 執行時動態連結:執行時連結器 ( ld.so) 或動態連結器解析儲存在執行檔中的所有引用,載入所有必需的庫並在執行程序之前更新所有對象引用。

連結描述文件以連結描述文件的形式為libc.so提供說明ld

/* GNU ld script
  Use the shared library, but some functions are only in
  the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /lib/x86_64-linux-gnu/libc.so.6 /usr/lib/x86_64-linux-gnu/libc_nonshared.a  AS_NEEDED ( /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 ) )

通常動態庫僅使用符號連結設置(libfoo.so由 使用ld,並指向libfoo.so.1或由 使用的任何內容ld.so,並且本身通常是指向目前安裝的庫版本的符號連結,例如 libfoo.so.1.2.3)。在 GNU C 庫的情況下,儘管動態連結的程序仍然需要靜態庫中的一些符號,因此使用連結器腳本代替,以便連結器可以同時嘗試兩者。連結器腳本還指將在執行時使用的動態連結器(/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2上面),其名稱嵌入在執行檔中(in .interp)。

術語“動態連結器”和“動態載入器”是同義詞,可以互換使用(參見手冊ld.so)。

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