Linux各種
各種libc.so
之間有什麼區別和關係?
在 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
?哪個在使用?
謝謝。
謝謝。
它們都有不同的用途:
/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
頁)。