variável de ambiente LD_LIBRARY_PATH

4

Estou tentando testar a variável de ambiente LD_LIBRARY_PATH . Eu tenho um programa test.c da seguinte forma:

int main()
{
     func("hello world");
}

Eu tenho dois arquivos func1.c e func2.c:

// func1.c
#include <stdio.h>
void func(const char * str)
{
     printf("%s", str);
}

e

// func2.c
#include <stdio.h>
void func(const char * str)
{
     printf("No print");
}

Eu quero fazer o seguinte de alguma forma:

  • Converta os arquivos func1.c e func2.c para .so - ambos com o mesmo nome func.so (eles serão colocados em pastas diferentes, digamos dir1 e dir2
  • Compilar test.c s.t. Eu só mencionei que ele tem uma dependência func.so , mas eu não digo onde está (eu quero que a variável de ambiente seja usada para encontrar isso)
  • Defina a variável de ambiente, na primeira tentativa de dir1 e, em segundo, tente dir2 para observar resultados diferentes em cada execução de test program

O acima é factível? Se sim, como fazer o passo 2?

Eu fiz o seguinte para o passo 1 (os mesmos passos para func2):

$ gcc -fPIC -g -c func1.c
$ gcc -shared -fPIC -o func.so func1.o
    
por Jake 02.09.2015 / 13:37

1 resposta

4

Use ld -soname :

$ mkdir dir1 dir2
$ gcc -shared -fPIC -o dir1/func.so func1.c -Wl,-soname,func.so
$ gcc -shared -fPIC -o dir2/func.so func2.c -Wl,-soname,func.so
$ gcc test.c dir1/func.so
$ ldd a.out
    linux-vdso.so.1 =>  (0x00007ffda80d7000)
    func.so => not found
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f639079e000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f6390b68000)
$ LD_LIBRARY_PATH='$ORIGIN/dir1:$ORIGIN/dir2' ./a.out
hello world
$ LD_LIBRARY_PATH='$ORIGIN/dir2:$ORIGIN/dir1' ./a.out
No print

-Wl,-soname,func.so (isso significa que -soname func.so é passado para ld ) incorpora o atributo SONAME de func.so na saída. Você pode examiná-lo por readelf -d :

$ readelf -d dir1/func.so 

Dynamic section at offset 0xe08 contains 25 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000e (SONAME)             Library soname: [func.so]
...

Vinculado a esse func.so com SONAME , a.out tem isso no atributo NEEDED :

$ readelf -d a.out

Dynamic section at offset 0xe18 contains 25 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [func.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
...

Sem -Wl,-soname,func.so , você receberá o seguinte por readelf -d :

$ readelf -d dir1/func.so 

Dynamic section at offset 0xe18 contains 24 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
...

$ readelf -d a.out

Dynamic section at offset 0xe18 contains 25 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [dir1/func.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
...
    
por 02.09.2015 / 13:52