mips-linux-gnu-gcc:
mips-linux-gnu-objcopy:
mips-linux-gnu-ar:
mips-linux-gnu-gcov:
gcov是一个保险测试工具。当构建一个程序时,gcov会监视一个程序的执行,并且会标识出执行了哪一行源码,哪一行没有执行。
mips-linux-gnu-objdump:
显示一个或者更多目标文件的信息。使用选项来控制其显示的信息。它所显示的信息通常只有编写编译工具的人才感兴趣。
mips-linux-gnu-as:
是 GNU 汇编器,主要用来编译 GNU C 编译器 gcc 输出的汇编文件,它将汇编代码转换成二进制代码,并存放到一个object 文件中,该目标文件将由连接器 ld 连接
mips-linux-gnu-gdb:
GNU调试器。允许调试用C\C++和其他语言编写的应用程序。它的基本运行方式是在shell环境下用命令方式进行调试程序和显示数据。如果加上一些图形前端(如DDD等软件),则可以在一个更方便的图形环境下调试程序
mips-linux-gnu-ranlib:
产生归档文件索引,并将其保存到这个归档文件中。在索引中列出了归档文件各成员所定义的可重分配目标文件。
mips-linux-gnu-c++:
mips-linux-gnu-gdbtui:
mips-linux-gnu-readelf:
mips-linux-gnu-c++filt:
解码 C++ 符号名,连接器使用它来过滤 C++ 和 Java 符号,防止重载函数冲突。
mips-linux-gnu-gprof:
mips-linux-gnu-size:
列出目标文件每一段的大小以及总体的大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。
mips-linux-gnu-cpp:
GNU预处理器,主要用于扩展用户源程序的头文件和宏定义。cpp是GNU C编译器的预处理器。cpp是一个宏指令处理器,GNU C编译器在编译前自动使用cpp对用户程序进行转换。cpp之所以被称为宏指令处理器是因为它允许用户定义宏指令(长结构的简写)。
mips-linux-gnu-ld:
GNU链接器,主要用于确定相对地址,把多个object文件、起始代码段、库等链接起来,并最终形成一个可执行文件。
mips-linux-gnu-strings:
打印某个文件的可打印字符串,这些字符串最少 4 个字符长,也可以使用选项 -n 设置字符串的最小长度。默认情况下,它只打印目标文件初始化和可加载段中的可打印字符;对于其它类型的文件它打印整个文件的可打印字符,这个程序对于了解非文本文件的内容很有帮助。
mips-linux-gnu-g++:
基本符合ISO标准的C++编译器。
mips-linux-gnu-nm:
mips-linux-gnu-strip:
mips-linux-gnu-ar:
ar 用于建立、修改、提取归档文件,一个归档文件,是包含多个被包含文件的单个文件(也可以认为归档文件是一个库文件)。
被包含的原始文件的内容、权限、时间戳、所有者等属性都保存在归档文件中,并且在提取之后可以还原
主要参数:
r - replace existing orinsert new file(s) into the archive
v - beverbose
生成归档文件的方法:
Mips-linux-gnu-ar –rvlibtest.a inputa.o inputb.o
这又是一个历史遗留问题,在早期版本中,ar只是将.o打包到.a,而不处理里边的符号表,linker需要一个完整的符号表,所以当时就单独写了一个ranlib来产生linker需要的符号表。后来产生完整符号表的功能被集成到ar中了,为了兼容,故ranlib还存在,总之以后尽量不要使用ranlib。
nm 的主要功能是列出目标文件中的符号,这样就可以定位和分析执行程序和目标文件中的符号信息和它的属性。
生成符号前缀的含义:
A:符号的值是绝对值,并且不会被将来的链接所改变
B:符号位于未初始化数据部分(BSS段)
C:符号是公共的。公共符号是未初始化的数据。在链接时,多个公共符号可能以相同的名字出现。如果符号在其他地方被定义,则该文件中的这个符号会被当作引用来处理
D:符号位于已初始化的数据部分
T:符号位于代码部分
U:符号未被定义?:符号类型未知,或者目标文件格式特殊
mips-linux-gnu-gcov:
gcov会监视一个程序的执行,并且会标识出执行了哪一行源码,哪一行没有执行。更进一步,gcov可以标识出某一行源执行的次数,这对于执行配置很有用(程序在哪里花费了大多数的时间)
gcov的参数:
-b,-branch-probabilities向输出文件输出分支频度
-c,-branch-counts
-n,-no-output
-l,-long-file-names
-f,-function-summaries
-o,-object-directory
Gcov实例(使用的gcc测试):
File'a.c'
Linesexecuted:83.33% of 6
a.c:creating 'a.c.gcov'
via.c.gcov
mips-linux-gnu-gcov –b a.c
mips-linux-gnu-c++filt:
大家都知道在C++和JAVA中都有函数重载的机制,编译器在编译相同重载函数时,会使用namemangling机制对函数重新命名,而链接器连接的时候就需要对此进行解析。
C++filt常用参数:
-_
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 Tfunc(int)
080484c4 Tfunc()
mips-linux-gnu-strip:
strip经常用来去除目标文件中的一些符号表、调试符号表信息,以减小程序的
大小,在rpmbuild包的最后就用到。
值得注意的是,在动态库和静态库时去掉符号表可以给文件瘦身,但再链接时可能编译不过去,所以strip慎用。
-rwxr-xr-x 1 dyron dyron 73112011-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 -lfilt
-rwxr-xr-x 1 dyron dyron 55522011-08-31 10:55 filt
mips-linux-gnu-gprof:
打印出程序运行中各个函数消耗的时间,可以帮助程序员找出众多函数中耗时最多的函数。产生程序运行时候的函数调用关系,包括调用次数,可以帮助程序员分析程序的运行流程。
Gprof的原理就是在加上-pg选项上,在编译和链接的时候,编译器在每个函数中都加入了一个名为gcount的函数,每个运行函数都会调用它,用来在内存中生成函数调用图。非常有用的一个工具,这里只是一个皮毛,等下次深入分析它的线程。
Gporf参数简介:
-A得到一个带注释的“源代码清单”,它会注释源码,指出每个函数的执行次数。这需要在编译的时候增加-g选项。
dyron@harris-desktop:~/misc/module/test/tmp$ gcc -pg a.c-o filt
dyron@harris-desktop:~/misc/module/test/tmp$ gprof -bfilt gmon.out
Flatprofile:
Each sample counts as 0.01seconds.
index % time
[1]
-----------------------------------------------
[2]
-----------------------------------------------
[3]
-----------------------------------------------
Index by functionname
mips-linux-gnu-size:
mips-linux-gnu-as:
GNUAS是GNU汇编器,主要用于把汇编代码转换成二进制代码,并存放到一个object文件中。
大家都知道从源码到程序分为4个过程,AS做的工作就是第3步,将汇编指令码转换为二进制的文件。
As 的使用实例(可用gcc-c hello.s –ohello.o代替):
Mips-linux-gnu-as hello.s –ohello.o
strings的功参简单,就是显示文件中的可打印字符,常用来在二进制文件中查找字符串。
-t{o,x,d}
--target=bfdname
[tulip]dyron@harris-desktop:~/misc/module/test/tmp$mips-linux-gnu-strings /usr/bin/uptime
它使用 GNU BFD(binary format description)库读 / 写目标文件,通过这个 BFD 库,objcopy 能以一种不同于源目标文件的格式生成新的目标文件
Objcopy命令的常用参数(太有用的命令了,参数一大堆):
-Ibfdname或—input-target=bfdname用来指明源文件的格式,bfdname是BFD库中描述的标准格式名,如果没指明,则objcopy自己分析
-Obfdname
-Fbfdname
-Rsectionname
-S
-g
objcopy -I binary -Oelf32-i386 -B i386 inputfile outputfile
mips-linux-gnu-readelf:
显示一个或多个 ELF 格式的目标文件信息。
-e
-s
-r
-a
dyron@harris-desktop:~/misc/module/test/tmp$mips-linux-gnu-readelf -s filt
mips-linux-gnu-objdump:
-d
-D
-S
mips-linux-gnu-addr2line:
Addr2line工具(它是标准的 GNU Binutils中的一部分)是一个可以将指令的地址
和可执行镜象转换成文件名、函数名和源代码行数的工具。
I/DEBUG
I/DEBUG
I/DEBUG
这就是出问题时候的栈,pc等于00000000 说明遇到了空指针,因为在栈里,所以查上一层指针000527e8,就可以分析到具体代码到哪一行了。
dyron@harris-desktop:~/project/test/android-2.2$mips-linux-gnu-addr2line
??
/home/dyron/project/test/android-2.2/frameworks/base/core/jni/android_database_SQLiteDebug.cpp:129
mips-linux-gnu-ld:
ld是GNU binutils工具集中的一个,是众多Linkers(链接器)的一种。完成的功能自然也就是链接器的基本功能:把各种目标文件和库文件链接起来,并重定向它们的数据,完成符号解析。Linking其实主要就是完成四个方面的工作:storageallocation、symbolmanagement、libraries、relocation。
ld可以识别一种Linker commandLanguage表示的linkerscriopt文件来显式的控制链接的过程。通过BFD(Binary FormatDescription)库,ld可以读取和操作COFF(common object fileformat)、ELF(executable and linkingformat)、a.out等各种格式的目标文件。
-e ADDRESS 设置目标文件的开始地址
-EB
-EL
-lLIBNAME
-LDIRECTORY
-oFILE
-s
-S
-TFILE
-v
-x
-X
-Bstatic
-Bdynamic
-TbssADDRESS
-Tdata ADDRESS设置section data的起始地址
-Ttext ADDRESS设置section text的起始地址
举个内核的例子:
mips-linux-gnu-ld -T arch/mips/boot/compressed/ld.script -Ttext0x80600000 -Bstatic -EL -o arch/mips/boot/compressed/vmlinuzarch/mips/boot/compressed/head.o arch/mips/boot/compressed/misc.oarch/mips/boot/compressed/piggy.o
ld -dynamic-linker /lib/ld-linux.so.2/usr/lib/crt1.o /usr/lib/crti.o -lc a.o /usr/lib/crtn.o//链接成elf可执行文件.