- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(链接器之Map文件与符号表
一、map、全局符号及静态符号一般的大型工程都会在生成可执行文件的同时让链接器生成一个map文件,从而大致查看一下可执行文件中符号的内存布局以及从哪里引入可执行文件。这个通常对于小型工程是作用不大,因为代码就那么多,随便grep一下就知道符号定义位置了。但是对于一些大型工程或者涉及了比较多的第三方库、或者涉及了比较多的功能模块的时候,就需要知道这些符号是在哪里定义,或者说如果一个符号引用了但是没有知道函数定义,此时也需要找到这个符号是哪个模块引入的,为什么需要,所以需要一些通用的(形式化)的方法来有哪些信誉好的足球投注网站这些符号,而map文件就是一个比较好的切入点。但是map符号并不是万能的,它只能列出参与链接的全局变量的位置以及在哪个模块,对于一些静态变量,map文件中并不能体现它们,而在没有特殊声明的情况下,可执行文件中将会包含静态符号在符号表中,所以有时候我们只能依赖可执行文件本身里面的符号表来猜测一个符号的定义位置。说起静态符号,还有就是它是如何保证它只在一个编译模块中可见和被引用,而对其它模块不可见?二、map文件相关对于ld程序来说,生成map文件可以使用-Map=mapfile来指示链接器来生成一个可执行文件使用的map文件。在内核的构建过程中,也会生成一个System.map文件来表示内核中各个符号在内核中位置,但是这个文件并不是通过ld的-Map选项生成,而是使用了nm和grep工具来手动生成的,具体的文件文件及相关说明在linux-\scripts\mksysmap文件中。我们这里只是结合ld的源代码来看一下这个Map文件是如何生成的。1、map文件生成代码对于map文件的生成,在ld的源代码中,名字也比较直观,就是通过lang_map函数来完成的,它的主要相关流程为?fprintf (config.map_file, _(\nLinker script and memory map\n\n));? if (! link_info.reduce_memory_overheads)??? {????? obstack_begin (map_obstack, 1000);????? for (p = link_info.input_bfds; p != (bfd *) NULL; p = p-link_next)??? bfd_map_over_sections (p, init_map_userdata, 0);??????bfd_link_hash_traverse?(link_info.hash,?sort_def_symbol, 0);??? }? lang_statement_iteration ++;??print_statements?();其中的主要准备工作由bfd_link_hash_traverse (link_info.hash, sort_def_symbol, 0)语句完成,它遍历整个链接过程中所有的符号表,然后对其中的每个符号执行sort_def_symbol函数,这个函数的功能主要是将这个符号追加到符号定义节的userdata链表的最后,供之后执行的print_statements函数可以在遍历各个输入节的时候打印输入节的map信息。这里对于 bfd_link_hash_traverse (link_info.hash, sort_def_symbol, 0);语句实现要注意两个细节:①、输出符号性质在sort_def_symbol函数的定义中,它只会追加类型为bfd_link_hash_defined和bfd_link_hash_defweak属性的符号(代码不再粘贴,代码比较直观,贴出来影响阅读),其它的一概忽略,这也就意味着所有的局部变量符号没有机会在map文件中体现。、符号遍历规则符号遍历是通过bfd_link_hash_traverse函数遍历,这个遍历的符号没有任何逻辑规律,它们只是依赖底层hash算法的选择而被放在不同的bucket中,这会导致对于每个输入节来说,它即将输出的定义符号列表并不一定是按照它们在内存中的逻辑地址位置排列的。2、验证代码[tsecer@Harry maporder]$ cat maporder.c?static int foo;int main(){??? extern int bar(void);??? return foo + bar();}int bar(void){??? return 0?}[tsecer@Harry maporder]$ gcc maporder.c -Wl,-Map=map.txt[tsecer@Harry maporder]$ grep -
您可能关注的文档
最近下载
- 2023中国宫腔镜诊断与手术临床实践指南(最全版).docx VIP
- 天然富锌土地划定与标识.pdf VIP
- 2019新人教版高中物理必修三全册重点知识点归纳总结(复习必背)_可有哪些信誉好的足球投注网站.pdf VIP
- 动静脉置管护理 (3).ppt VIP
- 医疗用品与设备的消毒与安全使用.pptx VIP
- 终止妊娠的护理.pptx VIP
- 沪教版2024-2025学年六年级上册同步提升讲义第02讲数轴相反数(六类知识点+八大题型+强化训练)(学生版+解析).docx VIP
- 顶管专项施工方案.doc VIP
- CPK-SPC-minitab操作培训教程.ppt VIP
- 传感器应用技术教学教案.docx VIP
文档评论(0)