Linux下so動態庫查看與運行時搜索路徑的設置

ldd命令

Linux 下可以使用ldd查看可執行文件所需要的動態鏈接庫(*.so)。
注:下文用so代替動態鏈接庫文件。

// 舉個例子
~$ ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007ffe06386000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fd686b54000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd68678b000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fd68651a000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd686316000)
    /lib64/ld-linux-x86-64.so.2 (0x0000563411315000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd6860f9000)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

問題

如果ldd命令沒有找到對應的共享庫文件和其具體位置?

可能是兩種情況引起的:

1)共享庫沒有安裝在該系統中;

2)共享庫保存在/etc/ld.so.conf文件列出的搜索路徑之外的位置。

通常情況下,許多開源代碼的程序或函數庫都會默認將在即安裝到/usr/local目錄下的相應位置(如:/usr/local/bin 或 /usr/local/lib)以便於系統自身的程序或函數庫相區別。而許多linux系統的/ect/ld.so.conf 文件中默認又不包含 /usr/local/lib 。因此出現安裝了共享庫,但是卻無法找到共享庫的情況。

解決辦法:
檢查/etc/ld.so.conf文件,如果其中缺少/usr/local/lib 目錄,就添加進去;
注意:在修改了/etc/ld.so.conf 文件或者在系統中安裝了新的函數庫之後,需要運行命令 ldconfig ,該命令用來刷新系統的共享庫緩存,即 /etc/ld.so.cache 文件。爲了減少共享庫系統的庫搜索時間,共享庫系統維護了一個共享庫so名稱的緩存文件 /etc/ld.so.cache 。 因此,在安裝新的共享庫之後,一定要運行 ldconfig刷新該緩存。


strace命令

strace命令可以跟蹤進程執行過程

#include <iostream>
using namespace std;
int main() 
{
    cout << "test" << endl;
}
$ g++ -o main main.cpp
  • 1
  • 2
  • 3
  • 4
$ strace main
strace: Can't stat 'main': No such file or directory
$ strace ./main
execve("./main", ["./main"], [/* 30 vars */]) = 0
brk(NULL)                               = 0x20c6000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f195056b000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=85573, ...}) = 0
mmap(NULL, 85573, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1950556000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/usr/lib/x86_64-linux-gnu/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \235\10\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=1566440, ...}) = 0
mmap(NULL, 3675136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f194ffc6000
mprotect(0x7f1950138000, 2097152, PROT_NONE) = 0
mmap(0x7f1950338000, 49152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x172000) = 0x7f1950338000
mmap(0x7f1950344000, 13312, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1950344000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\t\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1864888, ...}) = 0
mmap(NULL, 3967488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f194fbfd000
mprotect(0x7f194fdbd000, 2093056, PROT_NONE) = 0
mmap(0x7f194ffbc000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1bf000) = 0x7f194ffbc000
mmap(0x7f194ffc2000, 14848, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f194ffc2000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0V\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=1088952, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1950555000
mmap(NULL, 3178744, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f194f8f4000
mprotect(0x7f194f9fc000, 2093056, PROT_NONE) = 0
mmap(0x7f194fbfb000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x107000) = 0x7f194fbfb000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p*\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=89696, ...}) = 0
mmap(NULL, 2185488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f194f6de000
mprotect(0x7f194f6f4000, 2093056, PROT_NONE) = 0
mmap(0x7f194f8f3000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15000) = 0x7f194f8f3000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1950554000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1950552000
arch_prctl(ARCH_SET_FS, 0x7f1950552740) = 0
mprotect(0x7f194ffbc000, 16384, PROT_READ) = 0
mprotect(0x7f194fbfb000, 4096, PROT_READ) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1950551000
mprotect(0x7f1950338000, 40960, PROT_READ) = 0
mprotect(0x600000, 4096, PROT_READ)     = 0
mprotect(0x7f195056d000, 4096, PROT_READ) = 0
munmap(0x7f1950556000, 85573)           = 0
brk(NULL)                               = 0x20c6000
brk(0x20f8000)                          = 0x20f8000
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4), ...}) = 0
write(1, "test\n", 5test
)                   = 5
exit_group(0)                           = ?
+++ exited with 0 +++
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 6

因此,可以明顯的觀察到Linux操作系統把程序(program)變成進程(process),要經過三個步驟:

  1. fork進程,在內核創建進程相關內核想,加載進程可執行文件

  2. 查找依賴的so,並把它映射到虛擬地址空間

  3. 初始化程序變量


動態庫鏈接時搜索路徑和運行時搜索路徑

舉個例子:
編寫一個簡單的動態鏈接庫文件

// add.h
#ifndef __ADD_H__
#define __ADD_H__
int add(int a, int b);
#endif
// add.cpp
int add(int a, int b)
{
    return a+b;
}
// main.cpp
#include <iostream>
using namespace std;
int main() 
{
    int sum = add(3, 2);
    cout << sum << endl;
}
$ g++ -fPIC -shared -o libadd.so add.cpp

// 注:這裏-ladd不能在main.cpp之前,否則連接器在鏈接main.o時找不到libadd.so
$ g++ -o main -I. -L.  main.cpp -ladd
$ ./main
./main: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

運行時報錯,找不到依賴的so文件

$ ldd main
    linux-vdso.so.1 =>  (0x00007fffaef9b000)
    libadd.so => not found
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007feb12d01000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007feb12937000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007feb1262e000)
    /lib64/ld-linux-x86-64.so.2 (0x000055794a8c2000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007feb12418000)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

一般使用設置LD_LIBRARY_PATH這個環境變量來解決

$ LD_LIBRARY_PATH=.
$ export LD_LIBRARY_PATH
$ ./main
5
  • 1
  • 2
  • 3

使用export只對當前shell有效,開啓的其他shell必須重新設置。可以把export LD_LIBRARY_PATH=xxx寫到~/.bashrc對當前用戶生效或寫入/etc/profile對所有用戶生效。可參考:linux設置環境變量

使用-L. -ladd 是一種設置相對路徑方法,也可以使用絕對路徑鏈接方法

// libadd.so 在main.cpp 後,否則報鏈接錯誤
$ g++ -o main main.cpp /home/jack/workpace/libadd.so
$ main
$ ldd main
$ ldd main
    linux-vdso.so.1 =>  (0x00007fff3ebb7000)
    /home/jack/workspace/libadd.so (0x00007fde18144000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fde17dad000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fde179e3000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fde176da000)
    /lib64/ld-linux-x86-64.so.2 (0x0000562f1c354000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fde174c4000)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

搜索路徑分兩種:

  • 鏈接時搜索路徑
    使用-L. 就屬於鏈接時搜索路徑,給ld程序鏈接時使用的搜索動態庫路徑;

  • 運行時搜索路徑
    而使用LD_LIBRARY_PATH屬於運行時搜索路徑。可以參考5.2 動態連接時執行時的搜索路徑


介紹另一種運行時搜索路徑的方式,使用-rpath或-R連接選項來指定運行時搜索路徑,其優先級高於LD_LIBRARY_PATH。可參考5.2 動態連接時執行時的搜索路徑

$ g++ -o main -L. -I. main.cpp -Wl,-rpath .
// 或
$ g++ -o main -L. -I. main.cpp -Wl,-rpath=.
// 或
$ g++ -o main -L. -I. main.cpp -Wl,-R.
$ ldd main
    linux-vdso.so.1 =>  (0x00007fff4a7f0000)
    libadd.so => ./libadd.so (0x00007fa770bbc000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa770825000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa77045b000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa770152000)
    /lib64/ld-linux-x86-64.so.2 (0x0000557d67d4b000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa76ff3c000)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

由上面可知: libadd.so => ./libadd.so (0x00007fa770bbc000)

$ readelf -d main

Dynamic section at offset 0xdf8 contains 27 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libadd.so]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [.]
 0x000000000000000c (INIT)               0x400778
 0x000000000000000d (FINI)               0x400a44
 0x0000000000000019 (INIT_ARRAY)         0x600dd8
 0x000000000000001b (INIT_ARRAYSZ)       16 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x600de8
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x400298
 0x0000000000000005 (STRTAB)             0x4004a8
 0x0000000000000006 (SYMTAB)             0x4002e0
 0x000000000000000a (STRSZ)              371 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x601000
 0x0000000000000002 (PLTRELSZ)           192 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x4006b8
 0x0000000000000007 (RELA)               0x400688
 0x0000000000000008 (RELASZ)             48 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x400648
 0x000000006fffffff (VERNEEDNUM)         2
 0x000000006ffffff0 (VERSYM)             0x40061c
 0x0000000000000000 (NULL)               0x0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 3

由上面可知:Library rpath: [.] 表示運行時庫的搜索路徑。

因此,libadd.so的路徑已經被寫入了可執行文件中。注意:這裏寫入的是libadd.so的相對路徑,當然也可以寫入絕對路徑。

$ g++ -o main -L. -I. main.cpp -Wl,-rpath=/home/jack/workspace -ladd
$ ldd main
    linux-vdso.so.1 =>  (0x00007ffeed3b3000)
    libadd.so => /home/jack/workspace/libadd.so (0x00007ff2bc9e6000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff2bc64f000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff2bc285000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff2bbf7c000)
    /lib64/ld-linux-x86-64.so.2 (0x0000555d79140000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff2bbd66000)

$ readelf -d main

Dynamic section at offset 0xdf8 contains 27 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libadd.so]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [/home/jack/workspace]
 0x000000000000000c (INIT)               0x400788
 0x000000000000000d (FINI)               0x400a54
 0x0000000000000019 (INIT_ARRAY)         0x600dd8
 0x000000000000001b (INIT_ARRAYSZ)       16 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x600de8
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x400298
 0x0000000000000005 (STRTAB)             0x4004a8
 0x0000000000000006 (SYMTAB)             0x4002e0
 0x000000000000000a (STRSZ)              392 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x601000
 0x0000000000000002 (PLTRELSZ)           192 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x4006c8
 0x0000000000000007 (RELA)               0x400698
 0x0000000000000008 (RELASZ)             48 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x400658
 0x000000006fffffff (VERNEEDNUM)         2
 0x000000006ffffff0 (VERSYM)             0x400630
 0x0000000000000000 (NULL)               0x0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

除了上面介紹的動態庫運行時搜索路徑設置方法之外,還可以通過設置LD_RUN_PATH環境變量,它也是把路徑編譯到可執行文件中,它只設置運行時搜索路徑。

$ export LD_RUN_PATH=/home/jack/workspace
$ g++ -I. -L. -o main main.cpp -ladd
./main
5
$ ldd main
    linux-vdso.so.1 =>  (0x00007ffdd91e3000)
    libadd.so => /home/jack/workspace/libadd.so (0x00007f2748338000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f2747fa1000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2747bd7000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f27478ce000)
    /lib64/ld-linux-x86-64.so.2 (0x000055e88eb4a000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f27476b8000)

$ readelf -d main

Dynamic section at offset 0xdf8 contains 27 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libadd.so]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [/home/jack/workspace]
 0x000000000000000c (INIT)               0x400788
 0x000000000000000d (FINI)               0x400a54
 0x0000000000000019 (INIT_ARRAY)         0x600dd8
 0x000000000000001b (INIT_ARRAYSZ)       16 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x600de8
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x400298
 0x0000000000000005 (STRTAB)             0x4004a8
 0x0000000000000006 (SYMTAB)             0x4002e0
 0x000000000000000a (STRSZ)              392 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x601000
 0x0000000000000002 (PLTRELSZ)           192 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x4006c8
 0x0000000000000007 (RELA)               0x400698
 0x0000000000000008 (RELASZ)             48 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x400658
 0x000000006fffffff (VERNEEDNUM)         2
 0x000000006ffffff0 (VERSYM)             0x400630
 0x0000000000000000 (NULL)               0x0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 4

另外也可以通過配置/etc/ld.so.conf文件來設置動態庫運行時搜索路徑,使用root權限在其中加入/home/jack/workspace路徑,然後使用ldconfig命令將/etc/ld.so.conf加載到ld.so.cache中即可。
具體可參考ldd命令


這麼多方式設置動態庫的運行時搜索路徑,它們的優先級如下:

  1. LD_RUN_PATH設置的路徑
  2. 鏈接器使用-rpath或-R選項設置的路徑
  3. LD_LIBRARY_PATH設置的路徑
  4. /etc/ld.so.conf配置的路徑
  5. /usr/lib/和 /lib/

其中LD_RUN_PATH和鏈接器使用-rpath或-R選項都是設置可執行文件中的Library rpath。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章