1. 程式人生 > >linux符號表簡介

linux符號表簡介

既然在連結時,需要重定位目標檔案中引用的外部符號,顯然,連結器需要知道這些符號的定義在哪裡,為此彙編器在每個目標檔案中建立了一個符號表,符號表中記錄了這個模組定義的可以提供給其他模組引用的全域性符號。可以使用工具readelf檢視檔案中的符號表,如目標檔案foo2.o的符號表如下:
[email protected]:~/demo# readelf -s foo2.o
Symbol table '.symtab' contains 10 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 00000000     0 FILE    LOCAL  DEFAULT  ABS foo2.c
     2: 00000000     0 SECTION LOCAL  DEFAULT    1
     3: 00000000     0 SECTION LOCAL  DEFAULT    3
     4: 00000000     0 SECTION LOCAL  DEFAULT    4
     5: 00000000     0 SECTION LOCAL  DEFAULT    6
     6: 00000000     0 SECTION LOCAL  DEFAULT    7
     7: 00000000     0 SECTION LOCAL  DEFAULT    5
     8: 00000000     4 OBJECT  GLOBAL DEFAULT    3 foo2
     9: 00000000    16 FUNC    GLOBAL DEFAULT    1 foo2_func

根據輸出可見,foo2.o符號表包含10個符號。Value列表示的是符號的地址。前面我們提到,連結時連結器才會為符號分配地址,所以我們看到的符號的地址全部是0。Size列表示符號對應的實體佔據的記憶體大小,如變數foo2佔據4位元組,函式foo2_func佔據16位元組。Type列表示符號的型別,如foo2型別為OBJECT,表示變數;foo2_func型別為FUNC,表示函式。Bind列表示符號繫結的相關資訊,LOCAL表示模組內部符號,對外部不可見;GLOBAL表示全域性符號,foo2和foo2_func都屬於全域性變數。Ndx列表示該符號在哪個段,如foo2在第3個段,即“.data”段,foo2_func在第1個段,即“.text”段。Name列表示符號的名稱。

除了模組定義的符號外,符號表中也包括了模組引用的外部符號,如模組hello的符號表如下:
[email protected]:~/demo# readelf -s hello.o
Symbol table '.symtab' contains 11 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 00000000     0 FILE    LOCAL  DEFAULT  ABS hello.c
     2: 00000000     0 SECTION LOCAL  DEFAULT    1
     3: 00000000     0 SECTION LOCAL  DEFAULT    3
     4: 00000000     0 SECTION LOCAL  DEFAULT    4
     5: 00000000     0 SECTION LOCAL  DEFAULT    6
     6: 00000000     0 SECTION LOCAL  DEFAULT    7
     7: 00000000     0 SECTION LOCAL  DEFAULT    5
     8: 00000000    33 FUNC    GLOBAL DEFAULT    1 main
     9: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND foo2
    10: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND foo2_func

符號foo2和foo2_func都在模組foo2中定義,對於模組hello來說是外部符號,沒有在任何一個段中, 所以在列Ndx中,foo2和foo2_func的值是UND。UND是Undefined的縮寫,表示符號foo2、foo2_func是未定義的。

在連結時,對於模組中引用的外部符號,連結器將根據符號表進行符號的重定位。如果我們將符號表刪除了,那麼連結器在連結時將找不到符號的定義,從而不能進行正確的符號解析。如我們將foo2.o中的符號表刪除,再次進行連結,則連結器將因找不到符號定義而終止連結,如下所示:
[email protected]:~/demo/tmp# strip foo2.o
[email protected]:~/demo# gcc -o hello *.o
/usr/bin/ld: error in foo2.o(.eh_frame); no .eh_frame_hdr table will be created.
hello.o: In function 'main':
hello.c:(.text+0xb): undefined reference to 'foo2'
hello.c:(.text+0x1b): undefined reference to 'foo2_func'
collect2: error: ld returned 1 exit status

相關推薦

linux符號簡介

既然在連結時,需要重定位目標檔案中引用的外部符號,顯然,連結器需要知道這些符號的定義在哪裡,為此彙編器在每個目標檔案中建立了一個符號表,符號表中記錄了這個模組定義的可以提供給其他模組引用的全域性符號。可以使用工具readelf檢視檔案中的符號表,如目標檔案foo2.o的符號表如下: [email 

linux中物件檔案的符號symbols檢視工具nm簡介

1.nm工具作用 nm工具列出.o檔案、.a檔案、.so檔案等的符號資訊,包括諸如符號的值,符號型別及符號名稱等。所謂符號,通常指定義出的函式,全域性變數等等。 2.nm的使用方法 nm [option] filename 例如,nm -C a.out  常用的選項有:

Linux核心符號型別說明

所謂核心符號表就是在核心內部函式或變數中可供外部引用的函式和變數的符號表 符號型別 名稱 說明 A Absolute 符號的值是絕對值,並且在進一步連結過程中不會被改變 B

linux 檢視 *.a *.so 符號(zt)

objdump -tT libName.so | grep symbel symbolNamenm -D libName.so | grep symbel symbolName 很多非常熟悉windows 程序依賴那個dll,使用depends,linux使用ldd命令。

Linux動態庫(.so)符號

       最近編譯libbinder.so發現system/lib/libbinder.so只有358K,但單獨編譯生成的obj/SHARED_LIBRARIES/libbinder_intermediates/LINKED/libbinder.so有5M多

linux/mac下檢視符號方法【待補充】

Mac: 預設呼叫Xcode下的命令:objdump -t lib*.a | grep <*>          貌似只能檢視靜態庫 nm -D <libname> | grep <*>   可以檢視動態庫和靜態庫,但有時候獲取的符號表不

Linux驅動之匯出符號

Linux 2.6的“/proc/kallsyms”檔案對應著核心符號表,它記錄了符號以及符號所在的記憶體地址。   模組可以使用如下巨集匯出符號到核心符號表: EXPORT_SYMBOL(符號名); EXPORT_SYMBOL_GPL(符號名); Module.sym

Symbol Table(符號

-- 預測 smallest 是否 性能分析 .cn 變量 不能 級別 一、定義 符號表是一種存儲鍵值對的數據結構並且支持兩種操作:將新的鍵值對插入符號表中(insert);根據給定的鍵值查找對應的值(search)。 二、API 1、無序符號表 幾個設計決策: A、

linux啟動流程簡介

機器 配置文件 互聯網 local 相關信息 ade 通過 在操作 mbr 我們都知道,由於linux的穩定性,通常被作為服務器系統,要想稱為一個PHP的高手,linux是必修之課。那麽linux系統從開機到啟動,中間到底都發生了什麽?本文來簡單探討一下中間的神秘過程。 1

Linux less命令簡介

linux less 模式 一行 亮顯 空格 退出 nbsp 多個參數 less命令可以對文件或其它輸出進行分頁顯示,與moe命令相似,但是比more命令要強大許多。 在 less 中導航命令類似於 vi,如下: 1 搜索 當使用命令 less file-name 打

使用鏈實現無序符號SequentialSearchST

print 打了 tex alt println 刪除 spa equals test 這裏的關鍵問題是理解鏈表以及鏈表的循環(遍歷) 鏈表實際上就是一個內部類,而且是一個遞歸結構。未初始化時,鏈表本身為null(實際上就是在內存中沒有分配空間),其中的next也是鏈表,也

Linux的GRUB簡介

grubGRUB的功能 1. 提供選擇要啟動的內核或者系統 2. 提供交互式接口。進入GRUB後按e鍵進入GRUB的交互接口,可已經行Linux系統運行基本的選擇。 3. 基於密碼的保護:啟用內核映像,傳遞參數12341234GRUB的接口格式title:操作系統的內核或者系統的標題 root:

jprofiler+Linux+weblogic功能簡介,配置及內存泄漏分析示例

客戶 cat color 筆記 自定義 r+ htm his 統計 jprofiler簡介: jprofiler的內存視圖部分可以提供動態的內存使用狀況更新視圖和顯示關於內存分配狀況信息的視圖。所有的視圖都有幾個聚集層並且能夠顯示現有存在的對象和作為垃圾回收的對象。 一、主

Linux下監控簡介

1.4 時間 磁盤io監控 優先級 -s int 緩存 user family 1、磁盤IO監控工具 iotop 輸入命令:iotop 主要查看程序使用的磁盤IO的信息 安裝:yum -y install iotop 第一行:10:01:

關於媒體樣式簡介

rail logs int 系統 保持 libs 通過 XML 正常   對於CSS中的媒體樣式表,之前看書的時候一帶而過,今天在看Bootstrap書籍時,看到了有關知識點,在這裏註意一下這個小細節。   媒體樣式,就是通過設定使得文檔應用於何種媒體“場合”。對於CSS中

Linux集群簡介以及lvs-nat部署(一)

lvs集群;lvs-nat 隨著一個公司的不斷發展,用戶量隨之增多,對服務器的負載能力要求也逐漸增高,可采取換購高性能服務器解決負載能力問題,這叫做向上擴展。但擴展硬件終究會達到一個極限,此時便無法滿足負載要求。而且換購高性能服務器投入的資金與提高負載能力的水平並不劃算,可能投入大筆資金換來的只是20%

恢復二進制文件中的block符號

crete sym mbo pos symbol lob code 運行腳本 tar 前篇博客中,使用 楊君的小黑屋 提供的工具恢復二進制文件的符號表,只恢復了函數的符號表,本篇講述如何恢復block符號表,楊君的博客中使用IDA分析二進制文件,本篇則使用MacOS系統上體

符號、鏈接器與地址

修改 quest 地址 control response 關系 con 不同 style 符號表將標識符和其類型、位置關聯起來,當我們去處理變量,函數的聲明時,就是將這些信息組織(綁定)起來,放在表裏,當需 要知道這些函數,變量的意義時,就去這個表裏查。 重定位。鏈

Linux路由信息-route命令

當前 表示 nat dev 通過 網絡接口 targe 直接 pre 使用命令 :route route 命令 顯示和設置Linux路由表 -A:設置地址類型; -C:打印將Linux核心的路由緩存; -v:詳細信息模式; -n:不執行DNS反向查找,直接顯示數

Symbols(符號)

asp str 嘗試 img -m tps logs ram style 1、單位的機子裏面,下載的文件為:   1.1、應該是 在 微軟的官網下載的,但是沒有記錄下來具體的網址...   ZC: 本來想,通過Windbg設置的下載路徑(http://msdl.micro