Compiling

LD_LIBRARY_PATH 環境變數

  • September 2, 2015

我正在嘗試測試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和轉換func2.c為 .so 文件 - 都具有相同的名稱func.so(它們將被放置在不同的文件夾中,比如dir1dir2
  • Compile test.cst 我只提到它有一個依賴func.so,但我沒有告訴它它在哪裡(我希望使用環境變數來找到它)
  • 設置環境變數,第一次嘗試dir1,第二次嘗試觀察每次程序dir2執行的不同輸出test

以上可行嗎?如果是這樣,如何執行第 2 步?

我為步驟 1 執行了以下操作(對於 func2 的步驟相同):

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

使用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.soSONAMEa.outNEEDED屬性中具有:

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

引用自:https://unix.stackexchange.com/questions/227007