Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 234
ognian Avatar asked Dec 20 '10 10:12

ognian


2 Answers

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.

like image 118
jacwah Avatar answered Nov 15 '22 11:11

jacwah


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.

like image 35
Michael Dillon Avatar answered Nov 15 '22 12:11

Michael Dillon