Linux執行時動態庫搜尋路徑優先順序

2021-09-01 16:12:18 字數 1428 閱讀 4378

**

library_path和ld_library_path是linux下的兩個環境變數,二者的含義和作用分別如下:

library_path環境變數用於在程式編譯期間查詢動態鏈結庫時指定查詢共享庫的路徑,例如,指定gcc編譯需要用到的動態鏈結庫的目錄。

ld_library_path環境變數用於在程式載入執行期間查詢動態鏈結庫時指定除了系統預設路徑之外的其他路徑,注意,ld_library_path中指定的路徑會在系統預設路徑之前進行查詢。

區別與使用:

開發時,設定library_path,以便gcc能夠找到編譯時需要的動態鏈結庫。

發布時,設定ld_library_path,以便程式載入執行時能夠自動找到需要的動態鏈結庫。

例外,我們還通過在/etc/ld.so.conf加入庫的所在路徑來達到與ld_library_path同樣的目的! 不同的是修改過該檔案後應該執行sudo ldconfig

補充:程式執行時動態庫的搜尋優先順序:

linux執行時動態庫搜尋路徑優先順序

1. 編譯目標**時指定的動態庫搜尋路徑(dt_runpath為空,dt_rpath不為空)。 

例如:gcc main.c -wl,-rpath,庫的路徑

2. 環境變數ld_library_path指定的動態庫搜尋路徑(對setuid/setgid的程式無效,並且可以被鏈結器選項--library-path覆蓋)

3.dt_runpath指定的動態庫搜尋路徑(-wl,--enable-new-dtags)

4. 配置檔案/etc/ld.so.conf中指定的動態庫搜尋路徑

5. 預設的動態庫搜尋路徑/lib

6. 預設的動態庫搜尋路徑/usr/lib

另外,檢視乙個程式搜尋其各個動態庫的乙個簡單方法是使用ld_debug環境變數

[astrol] $ export ld_debug=libs

[astrol] $ ./demo

使用ldd -u可以看出程式不需要鏈結的so,使用-wl,--as-needed編譯選項就可以去除不需要鏈結的so

gcc鏈結選項-l,-rpath-link和-rpath

-l: 「鏈結」的時候,去找的目錄,也就是所有的 -lfoo 選項裡的庫,都會先從 -l 指定的目錄去找,然後是預設的地方。

-rpath-link:這個也是用於「鏈結」的時候的,例如你顯示指定的需要 foo.so,但是 foo.so 本身是需要 bar.so 的,後者你並沒有指定,而是 foo.so 引用到它,這個時候,會先從 -rpath-link 給的路徑裡找。

-rpath: 「執行」的時候,去找的目錄。執行的時候,要找 .so 檔案,會從這個選項裡指定的地方去找。對於交叉編譯,只有配合 --sysroot 選項才能起作用。

也就是說:

-rpath指定的路徑會被記錄在生成的可執行程式中,用於執行時。

-rpath-link 則只用於鏈結時。

Linux 指定執行時動態庫路徑

方法一 在配置檔案 etc ld.so.conf 中指定動態庫搜尋路徑。每次編輯完該檔案後,都必須執行命令 ldconfig 使修改後的配置生效。我們通過例 1 來說明該方法。例 1 我們通過以下命令用源程式 pos conf.c 見程式 1 來建立動態庫 libpos.so gcc fpic sh...

linux 設定執行時動態庫路徑

export ld library path mnt pub libs share ld library path path和ld library path本質都是變數,所謂變數的意思就是由別人賦值產生的,直覺往往會讓我們新增和減少這個變數本身的某些路徑,實際上這是不正確的。正確的做法是我們要去修改...

Linux 指定執行時動態庫路徑

方法一 在配置檔案 etc ld.so.conf 中指定動態庫搜尋路徑。每次編輯完該檔案後,都必須執行命令 ldconfig 使修改後的配置生效。我們通過例 1 來說明該方法。例 1 我們通過以下命令用源程式 pos conf.c 見程式 1 來建立動態庫 libpos.so gcc fpic sh...