Chinaunix首页 | 论坛 | 博客
  • 博客访问: 358993
  • 博文数量: 112
  • 博客积分: 5245
  • 博客等级: 大校
  • 技术积分: 1120
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-07 09:20
个人简介

静下来,定好方向,好好干。

文章分类
文章存档

2017年(1)

2012年(1)

2011年(5)

2010年(6)

2009年(16)

2008年(59)

2007年(24)

我的朋友

分类: LINUX

2007-11-07 12:27:58

关于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

阅读(594) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~