工具: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的...