LD_LIBRARY_PATH 환경 변수

LD_LIBRARY_PATH 환경 변수

LD_LIBRARY_PATH환경변수를 테스트하려고 합니다 . 다음과 같은 프로그램이 있습니다 test.c.

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

func1.c와 func2.c라는 두 개의 파일이 있습니다.

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

그리고

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

어떻게든 다음을 수행하고 싶습니다.

  • func1.c및 .so 파일로 변환 func2.c- 둘 다 이름이 동일합니다 func.so(예: dir1dir2
  • st 컴파일 중 test.c종속성이 있다고만 언급했지만 func.so어디에 있는지는 알려주지 않았습니다(환경 변수를 사용하여 이를 찾고 싶었습니다).
  • 환경 변수를 설정하고, 처음에 시도하고 dir1, 두 번째에 시도하고 , 프로그램을 실행할 때마다 다른 출력을 dir2관찰하십시오 .test

위의 내용이 가능한가요? 그렇다면 2단계는 어떻게 해야 할까요?

1단계에서 다음을 수행했습니다(func2에서도 동일한 단계).

$ gcc -fPIC -g -c func1.c
$ gcc -shared -fPIC -o func.so func1.o

답변1

사용 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(이것은 -soname func.so출력에 ld포함된 속성으로 전달됨을 의미합니다 SONAME. ) func.so다음을 통해 확인할 수 있습니다 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]
...

func.so그리고 link SONAMEa.out속성은 다음과 같습니다 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]
...

그렇지 않은 경우 -Wl,-soname,func.so다음과 같은 결과를 얻게 됩니다 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]
...

관련 정보