ld 動態鏈結庫配置

2021-07-25 04:05:59 字數 1823 閱讀 3824

一、ldconfig

ldconfig是乙個動態鏈結庫管理命令,為了讓動態鏈結庫為系統所共享,還需執行動態鏈結庫的管理命令--ldconfig。 ldconfig 命令的用途,主要是在預設搜尋目錄(/lib和/usr/lib)以及動態庫配置檔案/etc/ld.so.conf內所列的目錄下,搜尋出可共享的動態 鏈結庫(格式如前介紹,lib*.so*),進而建立出動態裝入程式(ld.so)所需的連線和快取檔案.快取檔案預設為 /etc/ld.so.cache,此檔案儲存已排好序的動態鏈結庫名字列表.

linux下的共享庫機制採用了類似於快取記憶體的機制,將庫資訊儲存在/etc/ld.so.cache裡邊。

程式連線的時候首先從這個檔案裡邊查詢,然後再到ld.so.conf的路徑裡邊去詳細找。

這就是為什麼修改了ld.so.conf要重新執行一下ldconfig的原因

補充一點,ldconfig在/sbin裡面。

ldconfig幾個需要注意的地方 

1. 往/lib和/usr/lib裡面加東西,是不用修改/etc/ld.so.conf的,但是完了之後要調一下ldconfig,不然這個library會找不到 

2. 想往上面兩個目錄以外加東西的時候,一定要修改/etc/ld.so.conf,然後再呼叫ldconfig,不然也會找不到 

比如安裝了乙個mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面,這時 就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,儲存過後ldconfig一下,新的library才能在 程式執行時被找到。 

3. 如果想在這兩個目錄以外放lib,但是又不想在/etc/ld.so.conf中加東西(或者是沒有許可權加東西)。那也可以,就是export乙個全域性變 量ld_library_path,然後執行程式的時候就會去這個目錄中找library。一般來講這只是一種臨時的解決方案,在沒有許可權或臨時需要的時 候使用。 

4. ldconfig做的這些東西都與執行程式時有關,跟編譯時一點關係都沒有。編譯的時候還是該加-l就得加,不要混淆了。 

5. 總之,就是不管做了什麼關於library的變動後,最好都ldconfig一下,不然會出現一些意想不到的結果。不會花太多的時間,但是會省很多的事。

二、ldd

作用:用來檢視程式執行所需的共享庫,常用來解決程式因缺少某個庫檔案而不能執行的一些問題。

ldd命令原理(摘自網路)

1、首先ldd不是乙個可執行程式,而只是乙個shell指令碼

2、ldd能夠顯示可執行模組的dependency,其原理是通過設定一系列的環境變數,如下:ld_trace_loaded_objects、

ld_warn、ld_bind_now、ld_library_version、ld_verbose等。當

ld_trace_loaded_objects環境變數不為空時,任何可執行程式在執行時,它都會只顯示模組的dependency,而程式並不真正執行。要不你可以在shell終端測試一下,如下:

(1) export ld_trace_loaded_objects=1

(2) 再執行任何的程式,如ls等,看看程式的執行結果

3、ldd顯示可執行模組的dependency的工作原理,其實質是通過ld-linux.so(elf動態庫的裝載器)來實現的。我們知道,ld-

linux.so模組會先於executable模組程式工作,並獲得控制權,因此當上述的那些環境變數被設定時,ld-linux.so選擇了顯示可執

行模組的dependency。

4、實際上可以直接執行ld-linux.so模組,如:/lib/ld-linux.so.2 --list program(這相當於ldd program)

ld命令和鏈結庫

ld命令和鏈結庫 1 靜態連線庫的名稱是有約定的,也就是必須的 以lib開頭,以 a 作為副檔名。所以不可能有名為my.a的靜態庫。如 你的庫可以起名為 libmy.a so 應該是動態連線庫 2 新增靜態連線庫 如果,你生成的libmy.a在 usr local lib裡面 gcc o myexe...

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...