閱讀933 返回首頁    go 微軟 go windows


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)
          這個宏定義名就是用戶要知道的錯誤信息。

最後更新:2017-04-03 05:39:29

  上一篇:go TraceView性能分析工具介紹
  下一篇:go error: tic: undefined symbol: _nc_check_termtype2 ? tic could not build /usr/share/terminfo