一种生成嵌入式程序运行符号表的方法

文档序号:6466511阅读:436来源:国知局

专利名称::一种生成嵌入式程序运行符号表的方法
技术领域
:本发明涉及嵌入式软件领域,特别涉及一种生成嵌入式程序运行符号表的方法。
背景技术
:程序中各种符号(函数名、变量名、模块名等)的符号名与符号地址的对应关系,有了它,软件程序在运行过程中,可进行符号信息的获取、符号的定位以及符号名字与符号地址的对应查找,便于程序的调试、故障定位及功能扩充。现有的嵌入式软件,例如嵌入式操作系统、嵌入式应用程序等,功能简单、规模不大,在运行时没有程序运行符号表的支持,但是随着嵌入式软件的功能曰趋复杂、规模日益庞大,程序运行符号表作为调试、故障定位的重要手段,逐渐成为嵌入式软件运行时的必备组件之一。一般来说,程序的可执行文件(例如可执行可链接格式ELF)中含有符号的相关信息,但是这些信息是由编译器、链接器等工具在生成可执行文件时生成的,其信息内容是零散的,格式是固定的,不便于直接进行符号的查找及信息获取,也不便于扩充其他的信息;同时,很多嵌入式系统为了节省内存及flash空间,在加载运行嵌入式程序时,只加载了其代码、数据等基本的功能段,其他符号信息都丢掉了。这使得传统的嵌入式程序在运行时,没有运行符号表,无法进行符号地址与符号名称的相互转换。没有运行符号表,当嵌入式软件运行异常时,相应的调试、查错、故障定位工作就非常困难,且效率很低。总之,现有技术存在如下缺点嵌入式软件的运行符号表信息不全、格式死板、不便于扩充和维护;另外,有些嵌入式软件在运行时无运行符号表(如符号表信息被剥离或加载时被加载器丢弃)。
发明内容本发明的目的在于,提供一种生成嵌入式程序运行符号表的方法。本发明的生成嵌入式程序运行符号表的方法,包括下列步骤构造空符号表源文件,并将其编译为空符号表目标文件;将嵌入式系统中预先编译好的目标文件与所述空符号表目标文件进行第一次链接得到第一链接目标文件;对所述第一链接目标文件进行分析,从中提取符号信息,生成符号表源文件;并将所述符号表源文件转换为运行符号表目标文件。第二次链接,生成包含运行符号表的嵌入式程序。其中,所述构造空符号表源文件为,构造多个符号项,每个符号项包括其符号名称、地址、类型、大小以及符号所在的段的信息,并在所述空符号表源文件中定义一个含有一项空数据的全局数组。其中,可以通过链接命令ld执行相应的链接操作。其中,所述第一链接目标文件格式为可执行可链接格式ELF。另外,所述提取的符号信息,包括符号名称、地址、大小、类型。进一步地,所述符号信息以全局数组形式存在,所述全局数组的每一项表示一条符号信息,所述全局数组就是嵌入式程序运行符号表的源代码。本发明的有益效果是依照本发明的生成嵌入式程序运行符号表的方法,通过两次链接,在嵌入式软件的编译链接流程中动态生成运行符号表,并将该符号表以数组的形式编译链接到最终的嵌入式程序中,保证了嵌入式软件程序在运行时含有丰富的符号信息,且其符号表查找方便,扩展性强。图1为本发明提出的生成运行符号表的工作流程。具体实施例方式以下,参考附图详细描述本发明的生成嵌入式程序运行符号表的方法。以本发明在嵌入式操作系统上的应用为例,本发明包括下列步骤步骤100:根据嵌入式软件的原有编译规则进行编译,产生目标文件;例如,嵌入式操作系统所有源代码编译、压库后生成3个目标文件os—head.o、os—kernel.a,os—other.a。步骤200:构造一个空的符号表源文件fake—symbol—table.c,并将其编译为目标文4牛fake—symbol—table.o。其中,在步骤200中,由于嵌入式操作系统中需要知道每个符号的名称、地址、类型、大小及符号所在的段,因此,符号表中的每个符号项设计如下typedefstruct{char*name;/*符号名称*/char*addr;/*符号地址*/inttype;/*符号类型*/intsize;/*符号大小,单位字节*/intsection;/*符号所在的段*/}SYMBOL_ENTRY;/*符号表中一个符号项*/另夕卜,上述空的符号表源文件fake—symbol—table.c定义了一个仅含有一项空数据的全局数组,源文件内容如下SYMBOL—ENTRYRunning—SymbolJTable[]={{0,0,0,0,0}}。步骤300:将步骤100中生成的嵌入式程序的目标文件(os一head.o、os—kernel.a、os—other.a)与步骤200中生成的空符号表目标文件(fake—symbol—table.o)进行第一次链接,目标文件为os—first—link.o,即执行链接程序,通过链接命令(Id)进行如下操作Idos—head.oos—kernel.aos—other.afake—symbol—table.o-oos—first—link.o。步骤400:假设目标文件的格式为ELF(可执行可链接格式),则根据ELF格式的规范,对第一次链接后的目标文件os—first—link.o进行分析,从目标文件中提取各种有用的符号信息(符号名称、地址、大小、类型等),生成真正的符号表源文件symbol_table.c,该文件中包含以全局数组形式存在的符号信息,全局数组的每一项表示一条符号信息,该全局数组就是最后使用的程序运行符号表的源代码。例如,嵌入式操作系统中存在一个函数,函数名称为fbntionl,函数大小1024字节,函数地址为0xc020aa80,属性为全局函数,存在于text段。另夕卜,还存在一个变量,变量名称为variablel,变量大小4字节,变量地址为0xc260a0cc,变量属性全局变量,其存在于data段。如下所示,运行符号表中应含有这两个符号的相应信息symbol—table.c:typedefstruct{char*name;/*符号名称*/char*addr;/*符号地址*/inttype;/*符号类型1表示函数,2表示变量*/intsize;/*符号大小,单位字节*/intsection;/*符号所在的段1表示代码段,2表示数据段*/}SYMBOL—ENTRY;/*符号表中一个符号项*/SYMBOL一ENTRYRunning一Symbo1—Table[]={"funtionl",0xc020aa80,1,1024,1},{"variable1",0xc260a0cc,2,4,2},};步骤500:将步骤400中生成的运行符号表源文件symbol—table.c编译为运行符号表目标文件symbol—table.o。步骤600:将步骤100中生成的嵌入式操作系统的目标文件(os—head.o、oskemel,a、os_other.a)与步骤500生成的运行符号表目标文件(symboljable.o)进行第二次链接,从而生成最终的含运行符号表的嵌入式程序。此外,在上述步骤200和步骤500中,将空的符号表源文件编译为目标文计算机可识别的文件(例如二进制等),该技术为现有技术,本发明在此不再详细描述。综上所述,依照本发明的生成嵌入式程序运行符号表的方法,通过两次链接,在嵌入式软件的编译链接流程中动态生成运行符号表,并将该符号表以数组的形式编译链接到最终的嵌入式程序中,保证了嵌入式软件程序在运行时含有丰富的符号信息,且其符号表查找方便,扩展性强。以上是为了使本领域普通技术人员理解本发明,而对本发明所进行的详细描述,但可以想到,在不脱离本发明的权利要求所涵盖的范围内还可以做出其它的变化和修改,这些变化和修改均在本发明的保护范围内。权利要求1.一种生成嵌入式程序运行符号表的方法,其特征在于,包括下列步骤构造空符号表源文件,并将其编译为空符号表目标文件;将嵌入式系统中预先编译好的目标文件与所述空符号表目标文件进行第一次链接得到第一链接目标文件;对所述第一链接目标文件进行分析,从中提取符号信息,生成符号表源文件;并将所述符号表源文件转换为运行符号表目标文件;将所述嵌入式系统中预先编译好的目标文件与所述运行符号表目标文件进行第二次链接,生成包含运行符号表的嵌入式程序。2.如权利要求1所述的生成嵌入式程序运行符号表的方法,其特征在于,所述构造空符号表源文件为,构造多个符号项,每个符号项包括其符号名称、地址、类型、大小以及符号所在的段的信息,并在所述空符号表源文件中定义一个含有一项空数据的全局数组。3.如权利要求1或2所述的生成嵌入式程序运行符号表的方法,其特征在于,通过链接命令执行相应的链接操作。4.如权利要求1或2所述的生成嵌入式程序运行符号表的方法,其特征在于,所述第一链接目标文件格式为可执行可链接格式ELF。5.如权利要求2所述的生成嵌入式程序运行符号表的方法,其特征在于,所述提取的符号信息,包括符号名称、地址、大小、类型。6.如权利要求5所述的生成嵌入式程序运行符号表的方法,其特征在于,所述符号信息以全局数组形式存在,所述全局数组的每一项表示一条符号信息,所述全局数组就是嵌入式程序运行符号表的源代码。全文摘要本发明提供一种生成嵌入式程序运行符号表的方法,包括下列步骤构造空符号表源文件,并将其编译为空符号表目标文件;将嵌入式操作系统中预先编译好的目标文件与空符号表目标文件进行第一次链接得到第一链接目标文件;对所述第一链接目标文件进行分析,从中提取符号信息,生成符号表源文件;并将所述符号表源文件转换为运行符号表目标文件;将嵌入式操作系统中预先编译好的目标文件与运行符号表目标文件进行第二次链接,生成包含运行符号表的嵌入式程序。本发明能够在嵌入式软件的编译链接流程中动态生成运行符号表,且其符号表查找方便,扩展性强。文档编号G06F9/44GK101339507SQ20081014708公开日2009年1月7日申请日期2008年8月15日优先权日2008年8月15日发明者张华强,亮王,蒋鲲鹏,钟卫东申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1