Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1123304
  • 博文数量: 414
  • 博客积分: 10030
  • 博客等级: 上将
  • 技术积分: 4440
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-05 21:42
文章分类

全部博文(414)

文章存档

2011年(1)

2009年(1)

2008年(412)

我的朋友

分类: LINUX

2008-10-11 08:45:10

OBJCOPY

可以将一种格式的目标内容进行转换,并输出为另一种格式的目标文件。

它使用GNU BFD(binary format description)库读/写目标文件,通过这个BFD库,objcopy能以一种不同于源目标文件的格式生成新的目标文件

makefile里面用-O binary选项来生成原始的二进制文件,即通常说的image文件

OBJDUMP

显示一个或多个目标文件的信息,由其选项来控制显示哪些信息

一般来说,objdump只对那些要编写编译工具的程序员有帮助,但是我们通过这个工具可以方便的查看执行文件或者库文件的信息

-F文件名:显示文件的文件头的内容

-D目标文件名:对目标文件进行反汇编

其余的MAN下就可以知道了。

GDB:调试工具,大家都知道了吧

具体的:断点,监视,修改变量,单步执行,堆栈显示,远程调试,显示/修改寄存器的值,比PRINTF好用多了哈

正常的过程:

1. r/run:启动可执行文件,接着出错

2. where:看看在哪里出的错误啊,此时会看到代码,而不是一坨

3. List:列出源码

4. Break行数:在可疑点第几行设置断点

5. Next:一步步执行看看

6. Print string:显示下返回什么东东

*******************************************************************************

MAKE

我之前就有过过于Makefile的写法的文章,这里不再说了,说点之前没有提到的东西

Make可以识别出makefile中哪些文件已经被修改,并且在再次编译的时候只编译这些文件,从而提高编译的效率

Make会检查文件的修改和生成时间戳,如果目标文件的修改或者生成时间戳比它的任意一个依赖文件旧,则make就执行makefile文件中描述的相应,以便更新目的文件

只更新那些需要更新的文件,而不重新处理那些并不过时的文件

特点:

适合于支持多文件构成的大中型软件项目的编译,链接,清除中间文件等工作

提供和识别多种默认规则,方便对大型软件项目的管理

支持对多目录的软件项目进行递归管理

对软件项目具有很好的可维护性和扩展性

default goal:在缺省的情况下,makemakefile中的第一个目标开始执行

Make的工作过程类似一次深度优先遍历过程

使用变量可以降低错误风险,简化makefile

例:objects变量($(objects)

objects = main.o kbd.o command.o \

             display.o insert.o search.o files.o utils.o

edit : $(objects)

             cc -o edit $(objects)

变量可以被用来贮存一个文件名列表。贮存可执行文件名。如用变量代替编译器名。贮存编译器FLAG

.PHONY : clean

clean :

rm edit $(objects)

.PHONY是一个伪目标,是假定该目标不存在,进行相应的更新或其他操作
若工作目录存在同名文件,则.Phony不工作。

$@扩展成当前规则的目的文件名

$<扩展成依赖列表中的第一个依赖文件

$^扩展成整个依赖列表(除掉了里面所有重复的文件名)

小例子:

CC = gcc
CFLAGS = -Wall -O -g
foo.o : foo.c foo.h bar.h
 $(CC) $(CFLAGS) -c $< -o $@

设置目标Phony Targets

设定目标,目标不是一个文件,其目的是为了让一些命令得以执行

使用PHONY显式声明设定目标,.PHONY: clean

使用设定目标实现多个目的,all: prog1 prog2

设定目的也可以用来描述一些其他的动作。例如,想把中间文件和可执行文件删除,可以在makefile里设立这样一个规则:
clean:

      $rm *.o exec_file

前提是没有其它的规则依靠这个'clean'目的,它将永远不会被执行。但是,如果你明确的使用命令'make clean'make会把这个目的做为它的主要目标,执行那些rm命令

Makefile中的函数:

使用方法:

$(函数名参数列表)

例如:$(substfrom,to,text)函数是说把text中的from串换成to

具体的$(subst ee,EE,feet on the street)相当于`fEEt on the strEEt'

$(patsubstpattern,replacement,text)

Patsubst是匹配替换的缩写

它需要3个参数——第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要被处理的由空格分隔的字列。

例如,处理那个经过上面定义后的变量,
OBJS = $(patsubst %.c,%.o,$(SOURCES))
这行将处理所有在SOURCES字列中的字(一列文件名),如果它的结尾'.c',就'.o''.c'取代。注意这里的%符号将匹配一个或多个字符,而它每次所匹配的字串叫做一个’(stem)在第二个参数里,%被解读成用第一参数所匹配的那个柄。

$(wildcardpattern)

它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。

你可以像下面所示使用这个命令:
SOURCES = $(wildcard *.c)
这行会产生一个所有以'.c'结尾的文件的列表,然后存入变量SOURCES里。当然你不需要一定要把结果存入一个变量。

Makefile的四种条件语句

ifeq...else...endif

ifneq…else…endif

ifndef…else…endif

ifndef...else…endif

*******************************************************************************

LD常用的链接器

ld软件的作用是把各种目标文件(.o文件)和库文件链接在一起,并定位和函数地址,最终生成可执行程序

gcc可以间接的调用ld,使用gcc-Wl参数可以传递参数给ld

使用命令:ld --help可以列出ld常用的一些选项

 

阅读(479) | 评论(0) | 转发(0) |
0

上一篇:linux内核分析二

下一篇:什么是SSH

给主人留下些什么吧!~~