Compiling
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
和轉換func2.c
為 .so 文件 - 都具有相同的名稱func.so
(它們將被放置在不同的文件夾中,比如dir1
和dir2
- Compile
test.c
st 我只提到它有一個依賴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.so
,SONAME
在a.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] ...