ARM GNU 工具链在使用gprof中的一个bug
万俟高峻
2023-12-01
最近发现了ARM GNU 工具链在使用gprof中时存在一个bug,描述如下:
版本为:gcc-3.2.1+glibc-2.3.1+binutils-2.13.2。这个bug存在于glibc-2.3.1至目前的最新版本(2.3.5)。搭建的工具链为ARM版本。
现象:gcc -pg(或gcc -pg -O2)选项编译的动态程序运行不生成gmon.out
文件。静态程序不存在问题。
解决:
下面两点都要注意。
1)使用-O2选项的时候必须加上-fno-omit-frame-pointer参数。这是因为在进行函数剖视的时候,会通过fp来进行栈回溯,必须保证函数入口的结构不能被优化掉。这一点可以参考glibc-2.3.1/sysdeps/arm/machine-gmon.h文件中。函数_mcount()的实现,使用-pg选项后,会在每个程序的每个函数入口插入_mcount()。
可以在specs文件中禁止-O2和-pg同时使用。
2)先说明一下crt1.o gcrt1.o crti.o crtn.o crtbegin.o crtend.o这几个文件,在链接的时候,这几个文件会和你要编译的程序链接。
3)还有一个现象,就是如果你的程序(动态编译)使用了l
ibm.so这个库,或者你在编译的时候加上-lm选项,你会发现生成了gmon.out这个文件,但是不好用。这是因为程序运行时动态加载了libm.so,这个函数的init段中会调用call_gmon()这个函数