编译工具链
- 编译:gcc g++ 常用
- 链接:ld
创建,修改和从归档文件中提取文件:ar
1) 打包.o文件生成静态库:ar -crv libmylib.a *[obj1.o obj2.o]
2) 查看静态库中的符号 ar -t libmylib.a
3) 提取静态库中的文件 ar -x libmylib.a [file] (一般先用-t 选项看下要提取的文件名,然后进行提取)去掉符号表(debug info): strip, 去除后可以通过file命令查看,其用法如下:
想进一步看下strip做了什么,我们可以通过readelf -S file 查看下section head- 查看符号表:nm
- 查看文件中的可打印字符串:strings
- 查看堆栈地址对应的代码行:addr2line
- 查看目标文件的信息:objdump
- 拷贝和加工目标文件:objcopy
- 查看ELF文件的信息:readelf —— 有点类似objdump,只适用于Executable and Linkable Format(可执行与可链接格式)
正常情况下,使用前三个工具就可以工程编译了
调试工具
gdb
这个工具就不介绍了,只言片语扯不清,可以参考用GDB调试程序 序列文章
addr2line
当程序出现core dump时,经常会打印出堆栈地址,这时侯可以根据该堆栈地址来查找程序中对应的出错行,使用方式如下:
|
|
其中,filename为堆栈对应的库或者可执行文件(需要式no stripped形式的,否则结果会出现??), addr 为堆栈地址
c++filt
为了支持函数重载,c++引入了name mangle机制,将同名函数名称进行改编,来区分不同的函数。以c++中的find 函数来说,其存在多种重载形式,我们可以用下面的命令查看:
|
|
其结果如下:
然后用c++filt工具可以查看其对应的具体形式:
|
|
得到结果如下: