Wednesday, September 28, 2022

Linux ldd - 列出動態函式庫的工具

引言
有時候,當執行一些 Linux 程序時,系統會回報一個莫名其妙的錯誤:

-bash: ./executableABC: No such file or directory

遇到這個情況,大部分人都會想:
明明我的程序就在,為什麼系統會找不到它呢 ?

其實,它找不到的不是程序本身,而是它需要的 dependencies。

所以,這個時候,使用 ldd 找出所有需要的 dynamic libraries,就是其中一個最常見的除錯方法。

---

方法
使用方法十分簡單,只需要 ldd "executable name" 即可。

例子:

ldd executableABC

./executableABC: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by ./executableABC)
./executableABC: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by ./executableABC)
./executableABC: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by ./executableABC)

        linux-vdso.so.1 (0x00007ffdd8146000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fdda6ca6000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fdda6ca0000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fdda6c95000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fdda6a7b000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fdda692c000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fdda6911000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdda671d000)
        ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fdda6cd3000)

由以上的訊息可見,程序需要 libc.so.6 以及其他 dependencies,
查找後發現,系統並沒有把它們成功安裝好。

故此,只需把所有 dependencies 都用 apt / 其他 package manager 安裝好,
程序就可以成功運行。