有时候需要去检查哪些代码调用叻某些接口但是经常发生的问题是,某些模块实际上看不到代码,只能看到库文件这种情况下,可借助GNU工具来检查
先写个简单的測试代码:
这个符号实际上是修饰过的,不太直观可以进一步处理:
3)如果 库文件是 debug版的(可以反汇编出源码),也可以用 objdump:
另外这些工具也可以查询某个模块定义哪些可供外部使用的符号。
如果是引用外部的符号符号前会有个 "U", 表示是未定义的;如果是本模块定义的符号,之前有个 "T",表示这个符号定义在这个模块所在文件的代码段.
本文是对中第3章的实践总结(和结構相关的示意图都是用画的?)通过使用工具readelf、objdump对目标文件进行解析,学习目标文件的结构
我们的代码是存放到.text中,已初始化全局变量和局部静态变量存放在.data中未初始化全局变量和局部静态变量存放在.bss中
程序与目标文件对应关系
另外,被初始化为0的静态变量也会被放入.bss段因为未初始变量的值也是0,经过优化后被放入.bss段这样可以节省磁盘空间,因为.bss不占磁盘空间
例如下面的代码中x1会被放入.bss段,而x2被放叺.data段
初始值为0的静态变量会被放进.bss