关于linux程序的map文件,网络上资料很少,大概看了下map文件,虽然理解的不是很透彻,但是还是对程序的编译、运行、内存分配有了一点新的认识。
1). map文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,是整个程序工程信息的静态文本,通常由linker生成。(抄至网络)
map文件保存整个工程的静态文本信息,里面有所有函数的入口地址。
通过查看map文件,我们可以找到代码段(.text),全局未初始化区(.bss),数据段(.data),还有些不懂的.pdata、.edata、.rsrc、.stab等。
(编译原理是硬伤,有时间一定要学学。)
2). linux下编译生成map文件
g++ -g mapFile.cpp -Wl,-Map,mapFile.map
3). map文件的作用是,我们可以根据程序产生错误地址在map文件中找到相应的函数、变量地址。
在这里,我有一个疑问: 一直以为程序编译后的地址为逻辑地址(段选择符+偏移地址),根据段选择符找到段基址、加上偏移地址才得到线性地址,但是在map文件中得到的却是线性地址。
为什么会是这样呢?网上找到个答案,但不敢完全认同。
Linux中逻辑地址等于线性地址。为什么这么说呢?因为Linux所有的段(用户代码段、用户数据段、内核代码段、内核数据段)的线性地址都是从 0x00000000 开始,长度4G,这样 线性地址=逻辑地址+ 0x00000000,也就是说逻辑地址等于线性地址了。
还是有很多的疑惑和不确定,暂且记录下来,待我知识体系完善了,再来更新吧。
结论:去学习、思考、实践、创新,否则只能生活在自以为是的那么一个小圈子里自“愚”自乐。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)