專利名稱::一種生成嵌入式程序運(yùn)行符號(hào)表的方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及嵌入式軟件領(lǐng)域,特別涉及一種生成嵌入式程序運(yùn)行符號(hào)表的方法。
背景技術(shù):
:程序中各種符號(hào)(函數(shù)名、變量名、模塊名等)的符號(hào)名與符號(hào)地址的對應(yīng)關(guān)系,有了它,軟件程序在運(yùn)行過程中,可進(jìn)行符號(hào)信息的獲取、符號(hào)的定位以及符號(hào)名字與符號(hào)地址的對應(yīng)查找,便于程序的調(diào)試、故障定位及功能擴(kuò)充?,F(xiàn)有的嵌入式軟件,例如嵌入式操作系統(tǒng)、嵌入式應(yīng)用程序等,功能簡單、規(guī)模不大,在運(yùn)行時(shí)沒有程序運(yùn)行符號(hào)表的支持,但是隨著嵌入式軟件的功能曰趨復(fù)雜、規(guī)模日益龐大,程序運(yùn)行符號(hào)表作為調(diào)試、故障定位的重要手段,逐漸成為嵌入式軟件運(yùn)行時(shí)的必備組件之一。一般來說,程序的可執(zhí)行文件(例如可執(zhí)行可鏈接格式ELF)中含有符號(hào)的相關(guān)信息,但是這些信息是由編譯器、鏈接器等工具在生成可執(zhí)行文件時(shí)生成的,其信息內(nèi)容是零散的,格式是固定的,不便于直接進(jìn)行符號(hào)的查找及信息獲取,也不便于擴(kuò)充其他的信息;同時(shí),很多嵌入式系統(tǒng)為了節(jié)省內(nèi)存及flash空間,在加載運(yùn)行嵌入式程序時(shí),只加載了其代碼、數(shù)據(jù)等基本的功能段,其他符號(hào)信息都丟掉了。這使得傳統(tǒng)的嵌入式程序在運(yùn)行時(shí),沒有運(yùn)行符號(hào)表,無法進(jìn)行符號(hào)地址與符號(hào)名稱的相互轉(zhuǎn)換。沒有運(yùn)行符號(hào)表,當(dāng)嵌入式軟件運(yùn)行異常時(shí),相應(yīng)的調(diào)試、查錯(cuò)、故障定位工作就非常困難,且效率很低??傊?,現(xiàn)有技術(shù)存在如下缺點(diǎn)嵌入式軟件的運(yùn)行符號(hào)表信息不全、格式死板、不便于擴(kuò)充和維護(hù);另外,有些嵌入式軟件在運(yùn)行時(shí)無運(yùn)行符號(hào)表(如符號(hào)表信息被剝離或加載時(shí)被加載器丟棄)。
發(fā)明內(nèi)容本發(fā)明的目的在于,提供一種生成嵌入式程序運(yùn)行符號(hào)表的方法。本發(fā)明的生成嵌入式程序運(yùn)行符號(hào)表的方法,包括下列步驟構(gòu)造空符號(hào)表源文件,并將其編譯為空符號(hào)表目標(biāo)文件;將嵌入式系統(tǒng)中預(yù)先編譯好的目標(biāo)文件與所述空符號(hào)表目標(biāo)文件進(jìn)行第一次鏈接得到第一鏈接目標(biāo)文件;對所述第一鏈接目標(biāo)文件進(jìn)行分析,從中提取符號(hào)信息,生成符號(hào)表源文件;并將所述符號(hào)表源文件轉(zhuǎn)換為運(yùn)行符號(hào)表目標(biāo)文件。第二次鏈接,生成包含運(yùn)行符號(hào)表的嵌入式程序。其中,所述構(gòu)造空符號(hào)表源文件為,構(gòu)造多個(gè)符號(hào)項(xiàng),每個(gè)符號(hào)項(xiàng)包括其符號(hào)名稱、地址、類型、大小以及符號(hào)所在的段的信息,并在所述空符號(hào)表源文件中定義一個(gè)含有一項(xiàng)空數(shù)據(jù)的全局?jǐn)?shù)組。其中,可以通過鏈接命令ld執(zhí)行相應(yīng)的鏈接操作。其中,所述第一鏈接目標(biāo)文件格式為可執(zhí)行可鏈接格式ELF。另外,所述提取的符號(hào)信息,包括符號(hào)名稱、地址、大小、類型。進(jìn)一步地,所述符號(hào)信息以全局?jǐn)?shù)組形式存在,所述全局?jǐn)?shù)組的每一項(xiàng)表示一條符號(hào)信息,所述全局?jǐn)?shù)組就是嵌入式程序運(yùn)行符號(hào)表的源代碼。本發(fā)明的有益效果是依照本發(fā)明的生成嵌入式程序運(yùn)行符號(hào)表的方法,通過兩次鏈接,在嵌入式軟件的編譯鏈接流程中動(dòng)態(tài)生成運(yùn)行符號(hào)表,并將該符號(hào)表以數(shù)組的形式編譯鏈接到最終的嵌入式程序中,保證了嵌入式軟件程序在運(yùn)行時(shí)含有豐富的符號(hào)信息,且其符號(hào)表查找方便,擴(kuò)展性強(qiáng)。圖1為本發(fā)明提出的生成運(yùn)行符號(hào)表的工作流程。具體實(shí)施例方式以下,參考附圖詳細(xì)描述本發(fā)明的生成嵌入式程序運(yùn)行符號(hào)表的方法。以本發(fā)明在嵌入式操作系統(tǒng)上的應(yīng)用為例,本發(fā)明包括下列步驟步驟100:根據(jù)嵌入式軟件的原有編譯規(guī)則進(jìn)行編譯,產(chǎn)生目標(biāo)文件;例如,嵌入式操作系統(tǒng)所有源代碼編譯、壓庫后生成3個(gè)目標(biāo)文件os—head.o、os—kernel.a,os—other.a。步驟200:構(gòu)造一個(gè)空的符號(hào)表源文件fake—symbol—table.c,并將其編譯為目標(biāo)文4牛fake—symbol—table.o。其中,在步驟200中,由于嵌入式操作系統(tǒng)中需要知道每個(gè)符號(hào)的名稱、地址、類型、大小及符號(hào)所在的段,因此,符號(hào)表中的每個(gè)符號(hào)項(xiàng)設(shè)計(jì)如下typedefstruct{char*name;/*符號(hào)名稱*/char*addr;/*符號(hào)地址*/inttype;/*符號(hào)類型*/intsize;/*符號(hào)大小,單位字節(jié)*/intsection;/*符號(hào)所在的段*/}SYMBOL_ENTRY;/*符號(hào)表中一個(gè)符號(hào)項(xiàng)*/另夕卜,上述空的符號(hào)表源文件fake—symbol—table.c定義了一個(gè)僅含有一項(xiàng)空數(shù)據(jù)的全局?jǐn)?shù)組,源文件內(nèi)容如下SYMBOL—ENTRYRunning—SymbolJTable[]={{0,0,0,0,0}}。步驟300:將步驟100中生成的嵌入式程序的目標(biāo)文件(os一head.o、os—kernel.a、os—other.a)與步驟200中生成的空符號(hào)表目標(biāo)文件(fake—symbol—table.o)進(jìn)行第一次鏈接,目標(biāo)文件為os—first—link.o,即執(zhí)行鏈接程序,通過鏈接命令(Id)進(jìn)行如下操作Idos—head.oos—kernel.aos—other.afake—symbol—table.o-oos—first—link.o。步驟400:假設(shè)目標(biāo)文件的格式為ELF(可執(zhí)行可鏈接格式),則根據(jù)ELF格式的規(guī)范,對第一次鏈接后的目標(biāo)文件os—first—link.o進(jìn)行分析,從目標(biāo)文件中提取各種有用的符號(hào)信息(符號(hào)名稱、地址、大小、類型等),生成真正的符號(hào)表源文件symbol_table.c,該文件中包含以全局?jǐn)?shù)組形式存在的符號(hào)信息,全局?jǐn)?shù)組的每一項(xiàng)表示一條符號(hào)信息,該全局?jǐn)?shù)組就是最后使用的程序運(yùn)行符號(hào)表的源代碼。例如,嵌入式操作系統(tǒng)中存在一個(gè)函數(shù),函數(shù)名稱為fbntionl,函數(shù)大小1024字節(jié),函數(shù)地址為0xc020aa80,屬性為全局函數(shù),存在于text段。另夕卜,還存在一個(gè)變量,變量名稱為variablel,變量大小4字節(jié),變量地址為0xc260a0cc,變量屬性全局變量,其存在于data段。如下所示,運(yùn)行符號(hào)表中應(yīng)含有這兩個(gè)符號(hào)的相應(yīng)信息symbol—table.c:typedefstruct{char*name;/*符號(hào)名稱*/char*addr;/*符號(hào)地址*/inttype;/*符號(hào)類型1表示函數(shù),2表示變量*/intsize;/*符號(hào)大小,單位字節(jié)*/intsection;/*符號(hào)所在的段1表示代碼段,2表示數(shù)據(jù)段*/}SYMBOL—ENTRY;/*符號(hào)表中一個(gè)符號(hào)項(xiàng)*/SYMBOL一ENTRYRunning一Symbo1—Table[]={"funtionl",0xc020aa80,1,1024,1},{"variable1",0xc260a0cc,2,4,2},};步驟500:將步驟400中生成的運(yùn)行符號(hào)表源文件symbol—table.c編譯為運(yùn)行符號(hào)表目標(biāo)文件symbol—table.o。步驟600:將步驟100中生成的嵌入式操作系統(tǒng)的目標(biāo)文件(os—head.o、oskemel,a、os_other.a)與步驟500生成的運(yùn)行符號(hào)表目標(biāo)文件(symboljable.o)進(jìn)行第二次鏈接,從而生成最終的含運(yùn)行符號(hào)表的嵌入式程序。此外,在上述步驟200和步驟500中,將空的符號(hào)表源文件編譯為目標(biāo)文計(jì)算機(jī)可識(shí)別的文件(例如二進(jìn)制等),該技術(shù)為現(xiàn)有技術(shù),本發(fā)明在此不再詳細(xì)描述。綜上所述,依照本發(fā)明的生成嵌入式程序運(yùn)行符號(hào)表的方法,通過兩次鏈接,在嵌入式軟件的編譯鏈接流程中動(dòng)態(tài)生成運(yùn)行符號(hào)表,并將該符號(hào)表以數(shù)組的形式編譯鏈接到最終的嵌入式程序中,保證了嵌入式軟件程序在運(yùn)行時(shí)含有豐富的符號(hào)信息,且其符號(hào)表查找方便,擴(kuò)展性強(qiáng)。以上是為了使本領(lǐng)域普通技術(shù)人員理解本發(fā)明,而對本發(fā)明所進(jìn)行的詳細(xì)描述,但可以想到,在不脫離本發(fā)明的權(quán)利要求所涵蓋的范圍內(nèi)還可以做出其它的變化和修改,這些變化和修改均在本發(fā)明的保護(hù)范圍內(nèi)。權(quán)利要求1.一種生成嵌入式程序運(yùn)行符號(hào)表的方法,其特征在于,包括下列步驟構(gòu)造空符號(hào)表源文件,并將其編譯為空符號(hào)表目標(biāo)文件;將嵌入式系統(tǒng)中預(yù)先編譯好的目標(biāo)文件與所述空符號(hào)表目標(biāo)文件進(jìn)行第一次鏈接得到第一鏈接目標(biāo)文件;對所述第一鏈接目標(biāo)文件進(jìn)行分析,從中提取符號(hào)信息,生成符號(hào)表源文件;并將所述符號(hào)表源文件轉(zhuǎn)換為運(yùn)行符號(hào)表目標(biāo)文件;將所述嵌入式系統(tǒng)中預(yù)先編譯好的目標(biāo)文件與所述運(yùn)行符號(hào)表目標(biāo)文件進(jìn)行第二次鏈接,生成包含運(yùn)行符號(hào)表的嵌入式程序。2.如權(quán)利要求1所述的生成嵌入式程序運(yùn)行符號(hào)表的方法,其特征在于,所述構(gòu)造空符號(hào)表源文件為,構(gòu)造多個(gè)符號(hào)項(xiàng),每個(gè)符號(hào)項(xiàng)包括其符號(hào)名稱、地址、類型、大小以及符號(hào)所在的段的信息,并在所述空符號(hào)表源文件中定義一個(gè)含有一項(xiàng)空數(shù)據(jù)的全局?jǐn)?shù)組。3.如權(quán)利要求1或2所述的生成嵌入式程序運(yùn)行符號(hào)表的方法,其特征在于,通過鏈接命令執(zhí)行相應(yīng)的鏈接操作。4.如權(quán)利要求1或2所述的生成嵌入式程序運(yùn)行符號(hào)表的方法,其特征在于,所述第一鏈接目標(biāo)文件格式為可執(zhí)行可鏈接格式ELF。5.如權(quán)利要求2所述的生成嵌入式程序運(yùn)行符號(hào)表的方法,其特征在于,所述提取的符號(hào)信息,包括符號(hào)名稱、地址、大小、類型。6.如權(quán)利要求5所述的生成嵌入式程序運(yùn)行符號(hào)表的方法,其特征在于,所述符號(hào)信息以全局?jǐn)?shù)組形式存在,所述全局?jǐn)?shù)組的每一項(xiàng)表示一條符號(hào)信息,所述全局?jǐn)?shù)組就是嵌入式程序運(yùn)行符號(hào)表的源代碼。全文摘要本發(fā)明提供一種生成嵌入式程序運(yùn)行符號(hào)表的方法,包括下列步驟構(gòu)造空符號(hào)表源文件,并將其編譯為空符號(hào)表目標(biāo)文件;將嵌入式操作系統(tǒng)中預(yù)先編譯好的目標(biāo)文件與空符號(hào)表目標(biāo)文件進(jìn)行第一次鏈接得到第一鏈接目標(biāo)文件;對所述第一鏈接目標(biāo)文件進(jìn)行分析,從中提取符號(hào)信息,生成符號(hào)表源文件;并將所述符號(hào)表源文件轉(zhuǎn)換為運(yùn)行符號(hào)表目標(biāo)文件;將嵌入式操作系統(tǒng)中預(yù)先編譯好的目標(biāo)文件與運(yùn)行符號(hào)表目標(biāo)文件進(jìn)行第二次鏈接,生成包含運(yùn)行符號(hào)表的嵌入式程序。本發(fā)明能夠在嵌入式軟件的編譯鏈接流程中動(dòng)態(tài)生成運(yùn)行符號(hào)表,且其符號(hào)表查找方便,擴(kuò)展性強(qiáng)。文檔編號(hào)G06F9/44GK101339507SQ20081014708公開日2009年1月7日申請日期2008年8月15日優(yōu)先權(quán)日2008年8月15日發(fā)明者張華強(qiáng),亮王,蔣鯤鵬,鐘衛(wèi)東申請人:中興通訊股份有限公司