mips-linux-gnu-addr2line:
Addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址
和可执行镜象转换成文件名、函数名和源代码行数的工具。
Addr2line 的参数简介:
-e
选项来指定可执行映像是 test。
-f
可以告诉工具输出函数名
Addr2line 的使用实例(android分析crash错误):
I/DEBUG ( 3411): #00 pc 00000000
I/DEBUG ( 3411): #01 pc 000527e8 /system/lib/libandroid_runtime.so
I/DEBUG ( 3411): #02 pc 0000f1f4 /system/lib/libdvm.so
这就是出问题时候的栈,pc等于00000000 说明遇到了空指针,因为在栈里,所以查上一层指针000527e8, 就可以分析到具体代码到哪一行了。
dyron@harris-desktop:~/project/test/android-2.2$ mips-linux-gnu-addr2line
-f -e out/target/product/tulip/symbols/system/lib/libandroid_runtime.so 000527e8
??
/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其实主要就是完成四个方面的工作:storage allocation、symbol management、libraries、relocation。
ld可以识别一种Linker command Language表示的linker scriopt文件来显式的控制链接的过程。通过BFD(Binary Format Description)库,ld可以读取和操作COFF(common object file format)、ELF(executable and linking format)、a.out等各种格式的目标文件。
Ld的参数简介:
-b TARGET 设置目标文件的文件格式
-e ADDRESS 设置目标文件的开始地址
-EB 链接big-endian的目标文件
-EL 链接small-endian的目标文件
-l LIBNAME 创建执行程序时要链接的库文件(比如某个库为test,则可以为-ltest)
-L DIRECTORY 寻找要链接的库文件时搜索的文件路径
-o FILE 设置输出文件的名字
-s 去除输出文件中的所有符号信息
-S 去除输出文件中的调试符号信息
-T FILE 读取链接描述脚本,以确定符号等的定位地址
-v 输出ld的版本信息
-x 去除所有的局部符号信息
-X 去除临时的局部符号信息,默认情况下会设置这个选项
-Bstatic 创建的输出文件链接静态链接库
-Bdynamic 创建的输出文件链接动态链接库
-Tbss ADDRESS 设置section bss的起始地址
-Tdata ADDRESS 设置section data的起始地址
-Ttext ADDRESS 设置section text的起始地址
Ld的例用实例
举个内核的例子:
mips-linux-gnu-ld -T arch/mips/boot/compressed/ld.script -Ttext 0x80600000 -Bstatic -EL -o arch/mips/boot/compressed/vmlinuz arch/mips/boot/compressed/head.o arch/mips/boot/compressed/misc.o arch/mips/boot/compressed/piggy.o
ld.script是链接脚本,-o 是输出的文件名, -Ttext是设定text段的地址为0x80600000, -EL链接为小端文件。
再举个小例子,我们的程序开始过程:
gcc -c a.c
//编译成.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可执行文件. |