Mac平台下使用nm命令檢視檔案的符號表

2021-07-09 07:01:31 字數 2463 閱讀 3383

在mac平台下,可以使用nm命令來檢視乙個檔案的符號表資訊。nm命令列工具是附帶在xcode中的,因此在使用之前請事先安裝好xcode。

nm命令的格式大致如下:

nm  [ -agnoprumxjlfpa [ s segname sectname ] ] [ - ] [ -t format ] [ [ -arch arch_flag ]... ] [ file ... ]
如果不帶任何可選引數的話,使用nm命令將會列出指定檔案中的所有符號,符號出現的次序預設按照字元排序。如果符號代表的是乙個由object c語言編寫的函式,那麼其名字將是+-[class_name(category_name) method:name:]。

對於每乙個符號,其格式是「符號值符號型別符號名」:

-a,顯示所有符號,包括那些專門用來除錯的符號。

-g,只顯示全域性符號,不顯示區域性符號。

-n,按照數字而不是預設的字元排序。

-p,不排序,按照符號在符號表中出現的次序顯示。

-r,符號按照反序顯示(預設就是按照符號名字字元排序的反序,如果帶上-p引數就是按照在符號表中出現次序的反序,如果帶上-n引數就是按照符號名數字排序的反序)。

-u,只顯示未定義的符號。

-u,不顯示未定義的符號,與-u的作用剛好相反。

-j,只顯示符號的名字,而不顯示符號對應的數值和型別。

-s segname sectname

只解析位於檔案中segname段裡sectname節內的符號。

-arch archtype

os x和ios系統都是支援所謂的肥(fat)檔案的,也就是乙個大檔案中包含了分別對不同平台支援的檔案。

預設情況下,nm會將其中每乙個平台檔案中所包含的符號都列出來。如果你只想看某乙個平台檔案中的符號,可以用這個選項指定。

例如,對於包含了32位armv7指令集和64位armv8指令集的ios可執行檔案來說,如果只想看表示32位armv7指令集部分的符號,可以加上-arch arm引數;而如果想看表示64位armv8指令集部分的符號,可以加上-arch arm64引數。

-x,將以16進製制的形式顯示符號表中所有符號每一項的值,格式如下:

-p,以簡單格式顯示每乙個符號,格式如下:

-t format,如果使用前面的-p引數,則符號的數值將使用16進製表示,但是可以再加上-t引數來指定用別的格式顯示符號的值。主要有下面幾種:

d:以10進製顯示;

o:以8進製顯示;

x:以16進製制顯示(預設)。

一般來說,在每個符號的前面,都有乙個字母來表示這個符號的型別。對於每乙個符號來說,其型別如果是小寫字母表示的的,則說明該符號是本地(local)的或者說是內部(internal)的,而如果是大寫字母表示的,則說明該符號是全域性的,也就是可供外部(external)訪問的。

一共主要有以下幾種型別:

1)u,未定義符號

表示這個符號沒有在本檔案中定義,需要解析別的檔案從而找出對應符號的定義。

例如,當前檔案呼叫另乙個檔案中定義的函式或者全域性變數,這個被呼叫的函式或全域性變數在當前檔案中就是未定義的。(但是,在定義它的檔案中,如果是函式則對應的型別是t,而如果是全域性變數則其符號型別為c)。

2)a,絕對符號

表示該符號的值是絕對的,在以後的鏈結過程中,不允許進行改變。這種型別的符號常常出現在中斷向量表中,例如用符號來表示各個中斷向量函式在中斷向量表中的位置。

3)t,定義在__text段__text區(**區)中的符號

表示該符號位於**區中,其值表示該符號在整個檔案當中的所處的位置。

有點奇怪的是符號「__mh_execute_header」竟然型別也為t,算作在**區定義的符號。

4)d,定義在__data段__data區中的符號

表明該符號位於初始化資料區中,其值表示該符號在整個檔案當中的所處的位置。

5)b,定義在__data段__bss區中的符號

表明該符號位於非初始化資料區中,其值表示該符號在bss段中的偏移。

6)c,所謂的普通(common)符號,定義在__data段__common區中的符號

普通符號是定義在乙個未初始化資料段內的符號。該符號沒有包含於乙個普通的區中,只有在鏈結過程中才進行分配,符號的值表示該符號需要的位元組數。例如在乙個c檔案中,定義int test,並且該符號在別的地方會被引用,則該符號型別即為c,否則其型別為b。

7)i,間接符號

說明這個符號是僅僅是對另乙個符號的間接引用。

8)s,其它符號

定義在除前所述其它地方的符號,例如出現在__text段__const區中的符號。

檢視 o, obj檔案符號列表,強大的nm命令

nm命令可以檢視,linux以及windows下的.o obj檔案中的符號列表,其中.o檔案可以由gcc,g 編譯得到,obj由vc編譯得到。太爽了。以後遇到undefined reference錯誤的時候就可以這個命令搞定了。舉一例子,在下面的原始碼中呼叫了乙個myprint函式 include ...

函式庫檔案中的符號表 nm命令

nm命令可以列出乙個函式庫檔案中的符號表。它對於靜態的函式庫和共享的函式庫都起作用。對於乙個給定的函式庫,nm命令可以列出函式庫中定義的所有符號,包括每個符號的值和型別。還可以給出在原程式中這個函式 符號 是在多少行定義的,不過這必須要求編譯該函式庫的時候加 l 選項。關於符號的型別,這裡我們再多討...

mac 檢視 修改檔案許可權的命令

1 檢視某個檔案許可權的命令 ls l 要檢視檔案的檔名2 檢視某個資料夾裡所有檔案 資料夾的許可權 ls l 資料夾名3 如果要檢視某個資料夾的許可權,需要在該資料夾外部目錄下執行 ls l來列印所有檔案 資料夾許可權,而無法單獨檢視某個資料夾的許可權 我們在桌面上建乙個資料夾,名字叫chmod ...