mips-linux-gnu-ranlib:这又是一个历史遗留问题,在早期版本中,ar只是将.o打包到.a, 而不处理里边的符号表,linker需要一个完整的符号表,所以当时就单独写了一个ranlib来产生linker需要的符号表。 后来产生完整符号表的功能被集成到ar中了,为了兼容,故ranlib还存在,总之以后尽量不要使用ranlib。
生成完整符号表的方法:
Mips-linux-gnu-ranlib libtest.a
mips-linux-gnu-nm:
nm 的主要功能是列出目标文件中的符号,这样就可以定位和分析执行程序和目标文件中的符号信息和它的属性。
生成符号前缀的含义:
A:符号的值是绝对值,并且不会被将来的链接所改变
B:符号位于未初始化数据部分(BSS 段)
C:符号是公共的。公共符号是未初始化的数据。在链接时,多个公共符号可能以相同的名字出现。如果符号在其他地方被定义,则该文件中的这个符号会被当作引用来处理
D:符号位于已初始化的数据部分
T:符号位于代码部分
U:符号未被定义 ?:符号类型未知,或者目标文件格式特殊
使用方法:
Mips-linux-gnu-nm –A libtest.a
mips-linux-gnu-gcov:
gcov会监视一个程序的执行,并且会标识出执行了哪一行源码,哪一行没有执行。更进一步,gcov可以标识出某一行源执行的次数,这对于执行配置很有用(程序在哪里花费了大多数的时间)
gcov的参数:
-b,-branch-probabilities向输出文件输出分支频度
-c,-branch-counts 打印分支计数而不是分支频度
-n,-no-output 不创建gcov输出文件
-l,-long-file-names 创建长文件名
-f,-function-summaries 打印每一个函数的概要
-o,-object-directory .bb,.bbg,.da文件存放的目录
Gcov实例(使用的gcc测试):
Mips-linux-gnu-gcc a.c -o a -ftesage -fprofile-arcs
./a
执行a文件//
Mips-linux-gnu-gcov a.c //会自动生成a.c.gcov文件
File 'a.c'
Lines executed:83.33% of 6
a.c:creating 'a.c.gcov'
vi a.c.gcov
//就可以看到代码的执行次数
mips-linux-gnu-gcov –b a.c
//可以查看gcov的分支执行频率
mips-linux-gnu-c++filt:
大家都知道在C++和JAVA中都有函数重载的机制,编译器在编译相同重载函数时,会使用name mangling机制对函数重新命名,而链接器连接的时候就需要对此进行解析。
C++filt常用参数:
-_ 滤掉符号前的下划线
-j 使用Java语法,默认为C++
-n 不要滤掉符号前的下划线
-p 不要打印函数的参数类型
-s 指定解码方式,不同编译器的编码方式不同。
C++filt 使用实例:
dyron@harris-desktop:~/misc/module/test/tmp$ mips-linux-gnu-nm filt | grep func
080484d8 T _Z4funci
080484c4 T _Z4funcv
dyron@harris-desktop:~/misc/module/test/tmp$ mips-linux-gnu-nm filt | grep func | mips-linux-gnu-c++filt
080484d8 T func(int)
080484c4 T func()
mips-linux-gnu-strip:
strip经常用来去除目标文件中的一些符号表、调试符号表信息,以减小程序的
大小,在rpmbuild包的最后就用到。
值得注意的是,在动态库和静态库时去掉符号表可以给文件瘦身,但再链接时可能编译不过去,所以strip慎用。
Strip使用实例:
dyron@harris-desktop:~/misc/module/test/tmp$ ls -l filt
-rwxr-xr-x 1 dyron dyron 7311 2011-08-31 10:29 filt
dyron@harris-desktop:~/misc/module/test/tmp$ mips-linux-gnu-strip filt
dyron@harris-desktop:~/misc/module/test/tmp$ ls -l filt
-rwxr-xr-x 1 dyron dyron 5552 2011-08-31 10:55 filt |