0

The dynamic linker can be run either indirectly by running some dynamically linked program or shared object (in which case no command-line options to the dynamic linker can be passed and, in the ELF case, the dynamic linker which is stored in the .interp section of the program is executed) or directly by running:

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

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

Similar info can be found in Program Library HOWTO.

But when I try,

$ 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
...

What am I doing wrong? Is there a way to use ld-linux.so directly to run a program?

2

Try using full path for 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
  • 1
    That’s exactly it, you need to specify the path if the binary isn’t in the current directory. Note that /usr/bin/ls will only work on distros which have merged / and /usr; /bin/ls should work everywhere. – Stephen Kitt Sep 10 '18 at 11:18

Your Answer

By clicking "Post Your Answer", you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.