How to set the dynamic linker path for a shared library?

11,859

Solution 1

ld doesn't include a .interp section if -shared is used, as @MichaelDillon already said. You can however provide this section yourself.

const char interp_section[] __attribute__((section(".interp"))) = "/path/to/dynamic/linker";

The line above will save the string "/path/to/dynamic/linker" in the .interp section using GCC attributes.

If you're trying to build a shared object that's also executable by itself, check this question out. It has a more comprehensive description of the process.

Solution 2

The INTERP segment only goes into binaries which need to load the ELF interpreter (ld.so) in the first place. A shared library has no INTERP segment because the ELF interpreter is already loaded before the shared library is loaded.

Share:
11,859
ognian
Author by

ognian

Updated on June 23, 2022

Comments

  • ognian
    ognian almost 2 years

    I want to compile a shared library with an .interp segment.

    #include <stdio.h>
    
    int foo(int argc, char** argv) {
    
        printf("Hello, world!\n");
        return 0;
    
    }
    

    I'm using the following commands.

    gcc -c -o test.o test.c
    ld --dynamic-linker=blah -shared -o test.so test.o
    

    I end up without an INTERP segment, as if I never passed the --dynamic-linker=blah option. Check with readelf -l test.so. When building an executable, the linker processes the option correctly and puts an INTERP segment in the program header. How to do I make it work for shared libraries too?

  • Jonathan Ben-Avraham
    Jonathan Ben-Avraham almost 8 years
    This is only true by default. You can make a shared object executable on its own by adding an INTERP section as @jacwah writes in his reply to the OP. For example, the glibc shared object is also an executable as you can see by doing readelf -a /lib/x86_64-linux-gnu/libc.so.6 | grep INTERP.