分类: 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:在缺省的情况下,make从makefile中的第一个目标开始执行
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常用的一些选项