Linux

如何使用 ld-linux.so 執行程序?

  • September 10, 2018

動態連結器可以通過執行一些動態連結程序或共享對象來間接執行(在這種情況下,不能傳遞動態連結器的命令行選項,在 ELF 情況下,動態連結器儲存在 .interp程序的一部分被執行)或直接通過執行:

/lib/ld-linux.so.*$$ OPTIONS $$ $$ PROGRAM [ARGUMENTS $$]

https://jlk.fjfi.cvut.cz/arch/manpages/man/core/man-pages/ld.so.8.en

類似的資訊可以在Program Library HOWTO中找到。

但是當我嘗試時,

$ LD_DEBUG=libs /usr/lib/ld-linux.so.2 ls
    23325: find library=ls [0]; searching
    23325:  search cache=/etc/ld.so.cache
    23325: 
ls: error while loading shared libraries: ls: cannot open shared object file

$ LD_DEBUG=libs ls
    23503: find library=libcap.so.2 [0]; searching
    23503:  search cache=/etc/ld.so.cache
    23503:   trying file=/usr/lib/libcap.so.2
...

我究竟做錯了什麼?有沒有辦法ld-linux.so直接用來執行程序?

嘗試使用完整路徑ls

[ctor@dom0 tst]$ /lib64/ld-linux-x86-64.so.2 /usr/bin/ls
afile

[ctor@dom0 tst]$ /lib64/ld-linux-x86-64.so.2 ls
ls: error while loading shared libraries: ls: cannot open shared object file

[ctor@dom0 tst]$ /lib64/ld-linux-x86-64.so.2 anyinexistentcommandhere
anyinexistentcommandhere: error while loading shared libraries: anyinexistentcommandhere: cannot open shared object file

[ctor@dom0 tst]$ ldd ls
ldd: ./ls: No such file or directory

[ctor@dom0 tst]$ ldd `type -P ls`
   linux-vdso.so.1 (0x00007fffd636c000)
   libselinux.so.1 => /lib64/libselinux.so.1 (0x000074b858cc3000)
   libcap.so.2 => /lib64/libcap.so.2 (0x000074b858abe000)
   libc.so.6 => /lib64/libc.so.6 (0x000074b8586f8000)
   libpcre.so.1 => /lib64/libpcre.so.1 (0x000074b858486000)
   libdl.so.2 => /lib64/libdl.so.2 (0x000074b858282000)
   /lib64/ld-linux-x86-64.so.2 (0x000074b85910a000)
   libpthread.so.0 => /lib64/libpthread.so.0 (0x000074b858064000)

[ctor@dom0 tst]$ LD_DEBUG=libs /lib64/ld-linux-x86-64.so.2 ls
     6380: find library=ls [0]; searching
     6380:  search cache=/etc/ld.so.cache
     6380: 
ls: error while loading shared libraries: ls: cannot open shared object file

[ctor@dom0 tst]$ LD_DEBUG=libs /lib64/ld-linux-x86-64.so.2 inexistentcommand
     6415: find library=inexistentcommand [0]; searching
     6415:  search cache=/etc/ld.so.cache
     6415: 
inexistentcommand: error while loading shared libraries: inexistentcommand: cannot open shared object file

[ctor@dom0 tst]$ LD_DEBUG=libs /lib64/ld-linux-x86-64.so.2 /usr/bin/ls
     6342: find library=libselinux.so.1 [0]; searching
     6342:  search cache=/etc/ld.so.cache
     6342:   trying file=/lib64/libselinux.so.1
     6342: 
     6342: find library=libcap.so.2 [0]; searching
     6342:  search cache=/etc/ld.so.cache
     6342:   trying file=/lib64/libcap.so.2
     6342: 
     6342: find library=libc.so.6 [0]; searching
     6342:  search cache=/etc/ld.so.cache
     6342:   trying file=/lib64/libc.so.6
     6342: 
     6342: find library=libpcre.so.1 [0]; searching
     6342:  search cache=/etc/ld.so.cache
     6342:   trying file=/lib64/libpcre.so.1
     6342: 
     6342: find library=libdl.so.2 [0]; searching
     6342:  search cache=/etc/ld.so.cache
     6342:   trying file=/lib64/libdl.so.2
     6342: 
     6342: find library=libpthread.so.0 [0]; searching
     6342:  search cache=/etc/ld.so.cache
     6342:   trying file=/lib64/libpthread.so.0
     6342: 
     6342: 
     6342: calling init: /lib64/libpthread.so.0
     6342: 
     6342: 
     6342: calling init: /lib64/libc.so.6
     6342: 
     6342: 
     6342: calling init: /lib64/libdl.so.2
     6342: 
     6342: 
     6342: calling init: /lib64/libpcre.so.1
     6342: 
     6342: 
     6342: calling init: /lib64/libcap.so.2
     6342: 
     6342: 
     6342: calling init: /lib64/libselinux.so.1
     6342: 
     6342: 
     6342: initialize program: /usr/bin/ls
     6342: 
     6342: 
     6342: transferring control: /usr/bin/ls
     6342: 
afile

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