鏈結基本一之符號

2021-08-08 12:43:59 字數 2148 閱讀 5330

工具:readelf -s 檢視檔案的符號(注意是小寫s,大寫是檢視段)

例子:

symbol table '.symtab' contains 16 entries:

num: value size type bind vis ndx name

0: 0000000000000000 0 notype local default und

1: 0000000000000000 0 file local default abs stack.c

2: 0000000000000000 0 section local default 1

3: 0000000000000000 0 section local default 3

4: 0000000000000000 0 section local default 4

5: 0000000000000000 0 section local default 5

6: 0000000000000004 4 object local default 3 static_var.2291

7: 0000000000000000 4 object local default 4 static_var2.2292

8: 0000000000000000 0 section local default 7

9: 0000000000000000 0 section local default 8

10: 0000000000000000 0 section local default 6

11: 0000000000000000 4 object global default 3 global_var

12: 0000000000000004 4 object global default com global_unint_var

13: 0000000000000000 34 func global default 1 func1

14: 0000000000000000 0 notype global default und printf

15: 0000000000000022 53 func global default 1 main

第一列是符號陣列下標,15共16個。

第二列是符號的值

第三列是符號的大小

第四列是符號型別

第五列是繫結資訊

第六列在c/c++中未使用

第七列是符號名稱

鏈結的介面--符號

可理解為鏈結的標識

在鏈結的過程中,變數和函式統稱為符號,其名稱為符號名

每乙個檔案都會有乙個符號表,記錄所有符號名。每個定義的符號都有乙個值,對於變數和函式來說,值是其位址。

符號不止有變數和函式

符號的型別:

1. 定義在本檔案的全域性符號,可以被其他檔案引用

2. 在本檔案引用的外部符號(類似宣告外部物件)

3. 區域性符號名,(偵錯程式可以通過這些符號來分析程式或奔潰時的核心轉儲檔案)

4. 段名,一般由編譯器產生,值是其起始位址

5. 行為符號,目標檔案指令和源**中**行的對應關係

6. 特殊符號:

強弱符號:

預設初始化了的全域性變數是強符號,未被初始化的是弱符號

定義初始化了的物件為弱符號: __attribute__((weak)) 物件

規則:1. 不允許同名強符號多次定義,如不同檔案中的同名全域性變數會衝突

2. 使用時強符號優先於弱符號

3. 如果所有目標檔案都是弱符號,使用占用空間最大的乙個

鏈結之符號解析

之前寫過一篇部落格講述了鏈結的來由 這篇部落格則打算講講鏈結的核心工作 符號解析和重定位。看這篇部落格之前可能需要一點基礎,大家可以先看看我上面的鏈結的文章,再來看這篇。什麼是符號解析?符號解析分為區域性符號解析和全域性符號解析,區域性的不用說。全域性符號解析因為多個目標檔案可能會定義相同的名字的全...

硬鏈結與符號鏈結

索引節點 inode 要 了解鏈結,我們首先得了解乙個概念,叫索引節點 inode 在linux系統中,核心為每乙個新建立的檔案分配乙個inode 索引結點 每個檔案 都有乙個惟一的inode號,我們可以將inode簡單理解成乙個指標,它永遠指向本檔案的具體儲存位置。檔案屬性儲存在索引結點裡,在訪問...

硬鏈結與符號鏈結

乙個inode節點可以存在任意數目的硬鏈結。在刪除硬鏈結時,該inode節點上的資料上的資料將不會受到影響。在linux系統中可以使用ln命令來建立硬鏈結。首先用touch命令建立名為link.test的檔案。然後,輸入 ln link.test link 命令,這時就建立了指向link.test的...