关于GCC:
GNU Compiler Collection
g++ -o out main.cc == gcc -o out main.cc -lstdc++
理解这个过程: .c->.i->.s->.o->.out
对应过程: 预处理->编译->汇编->链接
gcc -print-search-dirs 显示gcc自动识别的路径
sudo vi /etc/ld.so.conf 添加自己的库路径
sudo ldconfig 使用新的路径
一些编译选项:
-E 输出预处理结果,不生成文件
-S 预处理+编译,生成汇编代码
-c 预处理+编译+汇编,生成o文件
-O -O2 优化选项
-g 产生调试可用信息
-Wall 提示警告信息
-Idir include路径
-Ldir lib所在路径
-lname libname.a or libname.so 的名称
-static 优先使用静态库,若无,gcc会优先使用动态库
-fpic/fPIC 产生位置无关代码,构造共享库
-shared 产生共享库
-Dmacro == #define macro 1
-Dmacro=value
-Umacro 取消宏定义
创建静态库:
gcc -c test1.c test2.c
ar -cr libtest.a test1.o test2.o
ar -rs lib-name file-list 将目标文件加入库,并产生索引文件
ar -ds lib-name file-list 将目标文件从库中删除,并产生索引文件
ar -x lib-name file-list 不修改库文件,从中提取列表中的目标文件
gcc -o test test.o -L. -lname
注意静态库的使用,-lname应放在最后,不能先于原程序链接,否则会被GCC忽略;
创建动态库:
gcc -c -fPIC test1.c
gcc -c -fPIC test2.c
gcc -shared -fPIC -o libtest.so test1.o test2.o
使用动态库:
1.cp libtest.so /usr/lib or cp libtest.so /lib
2.LD_LIBRARY_PATH=$PWD; export LD_LIBRARY_PATH
3.gcc -o app main.c -Wl,-rpath,. -L. -ltest
4.应用程序自身完成动态库加载:
#include
...
void *handle;
int ( *dl_add )( int, int );
int ( *dl_mod )( int, int );
handle = dlopen( "/usr/lib/libtest.so", RTLD_LAZY );
dl_add = dlsym( handle, "add" );
dl_mod = dlsym( handle, "mod");
...dl_add(x, y);
...dl_mod(x, y);
dlclose( handle );
...
$ gcc -o app main.c -ldl
一些常用工具:
ldd libm.so 检查库依赖
ar选项: c生成文件 d删除文件 p打印文件列表 r插入新文件到库 t显示文档内容 x从库中抽取文件
ranlib static-lib-name
nm -s a.out 显示符号列表
objdump选项: f显示头信息 h显示段信息 d反汇编 a显示库文件信息
size a.out 显示文件各段大小
strings 显示文件中可打印的信息
关于GDB:
GNU开源组织发布的一个强大的linux下的程序调试工具.
基本命令:
file kill list next不进入函数 step进入函数 run quit break shell不离开gdb执行shell命令
help "help break" "set args" "show args" "set var x=4"设置变量值
"attach app_PID" "detach app_PID"
gdb app / gdb app app_PID 调试正在运行的程序
until运行程序直到退出循环体 finish运行程序直到从函数返回
stepi/nexti机器指令的单步调试 continue继续执行 "return value"停止函数运行,返回value
查看栈信息:
bt
bt 顶上面n层
bt <-n> 底下面n层
frame /frame addr 切换当前栈
up 向上移动n层
down 向下移动n层
info frame 查看当前栈信息
查看运行时数据:
print var 打印变量值
print 'foo.c'::var
print func::var
print array
print *array@10 列出前10个
print array[5]@10 列出5-15
print/x i /d i /t i二进制显示
查看内存:
examine 简称 x
x/nfu 0xaddr
n 显示n个单位的内存
f 显示的格式,s字符串,i指令,u十六进制
u 每个单元字节数,默认4,b单字节,h双字节,w四字节,g八字节
查看源代码:
list
list
list
list
list
自动显示:
display
undisplay
delete display
disable display
enable display
break命令:
break
break
break +/-offset
break filename:linenum
break filename:function
break if i==100
enable /disable
clear func1
clear test.c:func1
clear 8 清除该行号断点
delete 6 删除该断点号断点
watch命令:
一般用来观测某表达式的值是否变化,若有就停下.
watch 观察变化则停
rwatch 被读则停
awatch 被读写则停
info app 查看程序状态
info args
info locals 查看局部变量
info catch
info display
info watchpoints
info break /info breakpoints
coredump的分析
1.先执行ulimit -c unlimited
2.运行错误后生成core.
3.gdb app core or gdb app -c core 可调用core的内容
4.在gdb中用bt pi等命令查看现场
break [n] & watch [var]要在启动r之后停下再设
b [n] if
info all-registers
阅读(605) | 评论(0) | 转发(0) |