GNU toolchain
时间:2007-04-13 来源:ilttv.cn
GNU toolchain(GUN开发工具链)是进行linux环境开发得基本工具,主要包括三个部分:GCC,glibc,binutils。
1、 GCC
目前GCC已经并不仅仅的代表C编译器,而是表示编译器的家族(GNU Compiler Collection),它能够编译C,C++,Ada,Object-C和Java等多种高级语言。
这里要提一下得是有关GCC版本得问题,虽然目前GCC得最新版本已经到了4.1.2,但是因为GCC与你的系统有很大的关系,不要轻易的更换你使用的GCC版本,否则很有可能引起之前好好的软件在新的版本下编译失败。对于我而言,目前我常用的还是GCC3.3,它也是debian sarge默认的GCC版本。
GCC的参数有很多,常用的有下面这些,其实主要是在我们编写简单的Makefile文件时使用。
-c 只编译不链接,生成目标文件
-S 只编译,生成汇编代码
-E 只进行预处理
-o 指定输出的文件名
-g 生成调试信息
-pg 生成gprof工具需要的额外代码
-O 进行代码优化
-W 设置产生警告信息的级别
-I 指定包含文件(头文件)的目录
-L 指定库文件目录
-D 预定义代码中使用的宏
l 如果你要使用GDB调试你的应用,不要忘记加上-g参数。
l 如果你要使用gprof工具分析程序,不要忘记加上-pg参数。
2、binutils
binutils主要包括用来创建、分析和使用二进制文件的一些工具。可能我们平时最常接触的是链接器ld和汇编器as。不过其它工具对于优化我们的程序也相当有用。如果使用的是debian,执行
dpkg –L binutils
我们就可以看到在binutils包了包含了哪些工具。
l 连接器ld
把目标文件链接为可执行文件,或库文件。ld同样有非常多的参数,最简单的情况下,通过ld生成一个可执行文件,使用类似下面的命令:
#ld –o test test.o
l 汇编器as
注意,虽然GNU汇编一般称为gas,但是命令却为as。根据不同的硬件平台,as的参数会有所不同,但是有一部分参数是每个平台都通用的。最简单的情况,将汇编语言程序test.s转换为目标文件,使用下面的命令:
#as –o test.o test.s
需要注意的一点是,GNU汇编器使用的是AT&T语法,与intel的汇编语法并不相同。
l size
列出目标文件或者归档文件(archive)中每一段的大小以及总体大小。默认情况下,对于每个目标文件以及归档文件中的每个模块产生一行输出。
l objdump
objdump不仅能够显示汇编语言目标文件的信息,而且能够将汇编文件反汇编为指令码:
#objdump –d test.o
l ar
ar建立、修改档案文件,或者从档案文件中提取成员文件。档案文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。
-d 从档案文件中删除成员文件
-q 在档案文件的末尾追加成员文件
-m 在档案文件中移动成员文件的位置
-p 打印档案文件中成员文件的内容,不替换已有的同名文件
-r 将文件插入档案文件,覆盖已有的同名文件
-t 显示档案文件中成员文件的列表
-x 从档案文件中提取成员文件
ar可以用来创建静态链接库。
l strings
显示文件中的可打印字符。一般用来查看非文本文件的内容。
l ranlib
生成档案文件的索引,并将它保存在档案文件里。这个索引列出了成员文件定义的每个符号,我们可以使用nm命令查看它。
l objcopy
可以复制一个目标文件的内容到另一个目标文件。
l addr2line
把程序的地址转换为文件名和行号。指定一个可执行文件的地址,它能够通过调试信息估算出与之关联的文件名和行号。
l readelf
显示elf文件的信息。
l nm
列出目标文件的符号。也可以列出档案文件的符号:
#nm –s libtest.a
l strip
丢弃目标文件或档案文件中的符号。strip直接修改参数指定的文件,不为修改后的文件重新命名。
l c++filt
在C++和JAVA语言里,常要用到函数重载,在汇编的层面上,需要将这些重载函数的不同版本编码为独一无二的标识符,这是通过mangling来完成的,而c++filt则完成相反的工作。
l gprof
gprof可以用来分析应用程序的执行,显示程序中每个函数的调用次数及时间,我们可以从中找出耗费处理器时间最多的函数进行优化。
使用gprof时,它会生成一个包含了函数调用图标的文件gmon.out,包含了应用程序中每个函数的计时信息。但是要注意的是,每次执行gprof,都会覆盖gmon.out,因此,如果你要对你的应用进行多次采样分析,就必须在每次执行后备份gmon.out文件。
3、glibc
glibc是提供系统调用和基本函数的C库。在glibc的包里也包括了很多很有用的工具,可能我们平时在使用的时候都不会想到它是在glibc包里J,下面是几个常用的:
l ldconfig
运行时动态的配置动态链接库。
l ldd
列出应用所依赖的动态链接库。
l locale
获取系统的locale信息。
l iconv
转换指定文件的编码形式。
l zdump
显示时区信息。
l tzselect
可以显示现有的时区,也可以显示其它时区或国家的当前时间。
参考:http://www.ednchina.com/blog/exvision/357/message.aspx