vxworks之符號表
阿新 • • 發佈:2019-02-04
符號表初始化
符號表用於建立符號名稱、型別和值之間的關係。其中,名稱為null結尾的任意字串;型別為標識各種符號的整數;值為一個字元指標。符號表主要用來作為目標模組載入的基礎,但在需要名稱和值關聯的任何時候都看使用。 執行系統中一般存在兩個符號表結構sysSymTbl和statSymTbl。sysSymTbl為目標機的系統符號表,通過程式或tShell動態載入的目標模組的符號模組的符號都新增到該符號表中,sysSymTbl和statSymTbl兩個標識本身頁包含在該系統符號表中。statSymTbl中包含errno的資訊,若相在tShell中使用printErrno命令,就必須包含該符號表。 主機的Target Server只使用一個符號表,看通過全域性變數tgtSymTbl訪問。 vxWorks中符號表函式庫symLib,提供用於符號表操作的相關函式。系統符號表允許同名衝突,同名符號回加入符號表而不報錯,當引用符號時,系統預設使用symFindByName查詢,所以最新加入的符號總會先找到,代替老符號完成引用。同名符號的存在還帶來另一個問題,不能確保查詢到的符號是自己載入模組的,即不能保證group號。主機symlib庫中函式用於維護主機符號表tgtSymTbl。 vxWorks的符號表與編譯器的符號表吧同,vxWorks的符號表時動態存在系統中的,由symLib提供的函式進行維護,在執行過程中可以增加和刪除符號,主要用於目標模組的動態載入,與目標模組的格式無關。而編譯器中的符號表時靜態的,由編譯器和聯結器在建立程式映像時生成並使用,主要用於符號的靜態解析,幫助建立映像,它們的格式和目標型別有關。交叉偵錯程式中原始碼除錯,頁時由靜態符號表支援的,這種符號表佔用很大的程式映像空間,當程式釋出時,可以去掉(不使用 -g 選項)。 vxWorks需要主機工具在映像生成時完成一些準備工作來建立系統符號表,sysSymTbl和statSymTbl對應兩個主機工具makeSymTbl.exe和makeStatTbl.exe,用於生成符號陣列以編譯進入程式映像。工具makeSymTbl.exe用於建立包含SYMBOL型別陣列的symTbl.c檔案,包含目標模組中所有全域性符號的名稱、地址和型別,該全域性陣列名稱為standTbl,其大小為standTblSize,存放在程式映像的data段中。工具makeStatTbl.exe用於建立狀態程式碼SYMBOL陣列,包含一些標頭檔案中定義的所有狀態程式碼的名稱和值,所有狀態程式碼以“S-”開頭,一般庫標頭檔案中都有這樣的定義。,該全域性陣列名成為statTbl,其大小為statTblSize,statSymTbl主要由printErrno函式使用,也可以由應用程式使用,輸出確定意義的狀態資訊,存放在程式映像的data段中。 符號表初始方式有build-in和downloaded兩種方式,使用內建符號表時,符號時Vxworks程式映像的一部分;下載符號表則和VxWorks映像分離,由目標機單獨下載Sym檔案獲得符號。若使用下載符號表,使用主機工具xsym,生成符號模組檔案VxWorks.sym,該檔案和普通目標模組一樣,只是沒有data和bss段,下載到目標機後,和普通目標模組一樣動態載入,模組中的符號會新增到系統符號表。 目標機符號表時完成動態載入、連線,以及除錯的輔助機制,映像有沒有符號表都不影響程式正常執行,除錯時,只要不從目標機上動態載入目標模組,程式映像符號都靜態連線解析,目標機上也可以沒有符號,主機開發工具都使用主機符號表tgtSymTbl來完成交叉除錯。 符號表同步