链接器之map文件与符号表

链接器之map文件与符号表

ID:12818103

大小:60.50 KB

页数:11页

时间:2018-07-19

链接器之map文件与符号表_第1页
链接器之map文件与符号表_第2页
链接器之map文件与符号表_第3页
链接器之map文件与符号表_第4页
链接器之map文件与符号表_第5页
资源描述:

《链接器之map文件与符号表》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、一、map、全局符号及静态符号一般的大型工程都会在生成可执行文件的同时让链接器生成一个map文件,从而大致查看一下可执行文件中符号的内存布局以及从哪里引入可执行文件。这个通常对于小型工程是作用不大,因为代码就那么多,随便grep一下就知道符号定义位置了。但是对于一些大型工程或者涉及了比较多的第三方库、或者涉及了比较多的功能模块的时候,就需要知道这些符号是在哪里定义,或者说如果一个符号引用了但是没有知道函数定义,此时也需要找到这个符号是哪个模块引入的,为什么需要,所以需要一些通用的(形式化)的方法来搜索这些符号,而map文件就是一个比较好的切入点。但是map符号并不是万能的,它只能

2、列出参与链接的全局变量的位置以及在哪个模块,对于一些静态变量,map文件中并不能体现它们,而在没有特殊声明的情况下,可执行文件中将会包含静态符号在符号表中,所以有时候我们只能依赖可执行文件本身里面的符号表来猜测一个符号的定义位置。说起静态符号,还有就是它是如何保证它只在一个编译模块中可见和被引用,而对其它模块不可见?二、map文件相关对于ld程序来说,生成map文件可以使用-Map=mapfile来指示链接器来生成一个可执行文件使用的map文件。在内核的构建过程中,也会生成一个System.map文件来表示内核中各个符号在内核中位置,但是这个文件并不是通过ld的-Map选项生成,

3、而是使用了nm和grep工具来手动生成的,具体的文件文件及相关说明在linux-2.6.37.1scriptsmksysmap文件中。我们这里只是结合ld的源代码来看一下这个Map文件是如何生成的。1、map文件生成代码对于map文件的生成,在ld的源代码中,名字也比较直观,就是通过lang_map函数来完成的,它的主要相关流程为 fprintf(config.map_file,_("Linkerscriptandmemorymap")); if(!link_info.reduce_memory_overheads)   {     obstack_begin(&

4、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

5、,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和b

6、fd_link_hash_defweak属性的符号(代码不再粘贴,代码比较直观,贴出来影响阅读),其它的一概忽略,这也就意味着所有的局部变量符号没有机会在map文件中体现。②、符号遍历规则符号遍历是通过bfd_link_hash_traverse函数遍历,这个遍历的符号没有任何逻辑规律,它们只是依赖底层hash算法的选择而被放在不同的bucket中,这会导致对于每个输入节来说,它即将输出的定义符号列表并不一定是按照它们在内存中的逻辑地址位置排列的。2、验证代码[tsecer@Harrymaporder]$catmaporder.c staticintfoo;intmain(){ 

7、  externintbar(void);   returnfoo+bar();}intbar(void){   return0x11111111; }[tsecer@Harrymaporder]$gccmaporder.c-Wl,-Map=map.txt[tsecer@Harrymaporder]$grep-e'main'-e'bar'map.txt                0x00000000080482c4               __libc_start_mai

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。