首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Mips GNU工具链简介(5)

Mips GNU工具链简介(5)

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:

ldGNU binutils工具集中的一个,是众多Linkers(链接器)的一种。完成的功能自然也就是链接器的基本功能:把各种目标文件和库文件链接起来,并重定向它们的数据,完成符号解析。Linking其实主要就是完成四个方面的工作:storage allocationsymbol managementlibrariesrelocation

ld可以识别一种Linker command Language表示的linker scriopt文件来显式的控制链接的过程。通过BFDBinary Format Description)库,ld可以读取和操作COFFcommon object file format)、ELFexecutable 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可执行文件.
继承事业,薪火相传
返回列表