天天看點

VxWorks 符号表

符号表初始化          符号表用于建立符号名稱、類型和值之間的關系。其中,名稱為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來完成交叉調試。

      符号表同步

         主機和目标機使用不同的符号表,在主機上使用的各種工具并不能通路目标機上所有的内容,工具都是通過主機上target server和目标機上target agent進行通信的,主機和目标機都不能直接通路對方的符号資訊。主機和目标機都維護着自己的符号表,當添加符号時,将符号加入到其中一個表中,在wshell上添加的符号到了主機符号表,而tshell上添加的符号就到了目标機符号表中,預設時兩個表互不共享,可以通過添加符号表同步元件------include_sym_tbl_sync,這樣符号會在主機和目标機之間福祉,兩符号表會同步更新。

          主機和目标機使用不同的符号表,系統啟動時兩個符号表的内容是一樣的,當動态加載目标子產品後,兩個符号表就不一緻了,從wshell中加載目标子產品後,卻想從tshell引用該子產品符号,或者從tshell加載後,想用主機工具調試該子產品,因為wshell或tshell都看不見對方加載的子產品,可能出現下面錯誤:

           error:module contains undefined symbol

           unresolved symbol

           fatal error: unresolvable symbol

         要解決此問題就需要使用符号表同步機制,vxworks提供了symsynclib庫來完成符号表同步,系統運作中,從主機或目标機添加的符号都可以被對方看見,symsynclib會在目标機建立同步任務tsymsyc,該任務被當作wtx工具與主機的target server相連,任務啟動時,會立即同步符号表。如果不再需要同步符号表,可以手動将tsymsync懸挂起來,以提高目标機性能。

       錯誤狀态

          若vxworks庫函數執行出現問題,函數會傳回error值,并設定錯誤狀态表示具體的原因和位置。

          錯誤狀态庫errnolib用于擷取和設定任務和中斷的錯誤狀态值errno,vxworks每個任務和中斷都有自己的errno,任務的errno存放在tcb中,為任務私有,中斷的errno存放在中斷棧中,隻要字啊中斷處理函數中errno都有效。

         vxworks的errno值由4byte構成,高字表明發生錯誤的庫,各庫對應的值在“taget/h/vwmodnum.h”中定義,低字表示該庫發生的具體錯誤,在相應庫的頭檔案中定義。約定vxworks系統子產品使用高字值,範圍為1~500,其他值可以由應用子產品使用,對低字值沒有規定。

         usrlib提供printerrno函數來顯示具體錯誤資訊,printerrno根據輸入的errno值,在statsymtbl中查找到對應的錯誤資訊,并顯示在标準輸出上。

         ----> printerrno 0xd0003

         0xd0003 = s_ioslib_invalid_file_descriptor

         "s_"表示狀态,ioslib為發生錯誤的庫名稱,invalid_file_descriptor表示該庫具體的錯誤。

         若想在tshell或程式中調用printerrno來顯示錯誤資訊,程式映像中需包含錯誤代碼元件---include_stat_sym_tbl ,以在目标機建立statsymtbl。‘

         如果不能使用printerrno,也可以手動查找頭檔案得到錯誤資訊,比如“d0003”,先在vwmodnum.h查找“d”對應的庫,“d”換算成十進制“13”,查到m_ioslib:              #define m_ioslib        (13 << 16)

         再到ioslib庫自己的頭檔案ioslib.h中查找具體錯誤,其中“0003”對應的宏定義為:

           # define s_ioslib_invalid_file_descriptor     (m_ioslib | 3)

          這個宏定義名就是使用者要知道的錯誤資訊。