GNU汇编器(称为gas)是UNIX环境下最流行的汇编器。
和大多数其他开发软件包不同,GNU汇编器不在单独的包中发布。它和GNU binutils包中的其他开发软件捆绑在一起。binutils包中包含的程序如下:
addr2line 把地址转换为文件名和行号
ar 创建、修改和展开文件存档
as 把汇编语言代码汇编为目标代码
c++filt 还原c++符号的过滤器
gprof 显示程序简档信息的程序
ld 把目标代码文件转换为可执行文件的连接器
nlmconv 把目标代码转换为Netware Loadable Module格式
nm 列出目标文件中的符号
objcopy 复制和翻译目标文件
objdump 显示来自目标文件的消息
ranlib 生成存档文件内容的索引
readelf 按照ELF格式显示来自目标文件的消息
size 列出目标文件或者存档文件的段长度
strings 显示目标文件中的可打印字符串
strip 丢弃符号
windres 编译Microsoft Windows资源文件
as [-a[cdhlns][=file]] [-D] [--defsym sym=val]
[-f] [--gstabs] [--gstabs+] [--gdwarf2] [--help]
[-I dir] [-J] [-K] [-L]
[--listing-lhs-width=NUM] [--listing-lhs-width2=NUM]
[--listing-rhs-width=NUM] [--listing-cont-lines=NUM]
[--keep-locals] [-o objfile] [-R] [--statistics] [-v]
[-version] [--version] [-W] [--warn] [--fatal-warnings]
[-w] [-x] [-z] [--target-help] [target-options]
[--|files...]
-a 指定输出中包含哪些清单
-D 包含它用于向下兼容,但是被忽略了
--defsym 在汇编源代码之前定义符号和值
-f 快速汇编,跳过注释和空白
--gstabs 包含每行源代码的调试信息
--gstabs+ 包含专门的gdb调试信息
-I 指定搜索包含文件的目录
-J 不警告带符号溢出
-K 包含它用于向下兼容,但是被忽略了
-L 在符号表中保存本地符号
--listing-lhs-width 设置输出数据列的最大宽度
--listing-lhs-width2 设置连续行的输出数据列的最大宽度
--listing-rhs-width 设置输入源代码行的最大宽度
--listing-cont-lines 设置输入的单一行在清单中输出的最大行数
-o 指定输出目标文件的名称
-R 把数据段合并进文本段
--statistics 显示汇编使用的最大空间赫尔总时间
-v 显示as的版本号
-W 不显示警告信息
-- 对于源文件使用标准输入
GNU连接器ld用于把目标代码文件链接为可执行文件,或者库文件。。链接其实主要就是完成四个方面的工作:storage allocation、symbol management、libraries、relocation。
ld可以识别一种Linker command Language表示的linker scriopt文件来显式的控制链接的过程。通过BFD(Binary Format Description)库,ld可以读取和操作COFF(common object file format)、ELF(executable and linking format)、a.out等各种格式的目标文件。
ld的命令格式如下:
ld [-o output] objfile...
[-Aarchitecture] [-b input-format] [-Bstatic]
[-Bdynamic] [-Bsymbolic] [-c commandfile] [--cref]
[-d|-dc|-dp]
[-defsym symbol=expression] [--demangle]
[--no-demangle] [-e entry] [-embedded-relocs] [-E]
[-export-dynamic] [-f name] [--auxiliary name]
[-F name] [--filter name] [-format input-format]
[-g] [-G size] [-h name] [-soname name] [--help]
[-i] [-lar] [-Lsearchdir] [-M] [-Map mapfile]
[-m emulation] [-n|-N] [-noinhibit-exec]
[-no-keep-memory] [-no-warn-mismatch] [-0level]
[-oformat output-format] [-R filename] [-relax]
[-r|-Ur] [-rpath directory] [-rpath-link directory]
[-S] [-s] [-shared] [-sort-common]
[-split-by-reloc count] [-split-by-file]
[-T commandfile]
[--section-start sectionname=sectionorg]
[-Ttext textorg] [-Tdata dataorg] [-Tbss bssorg]
[-t] [-u sym] [-V] [-v] [--verbose] [--version]
[-warn-common] [-warn-constructors]
[-warn-multiple-gp] [-warn-once]
[-warn-section-align] [--whole-archive]
[--no-whole-archive] [--wrap symbol] [-X] [-x]
-b 指定目标代码输入文件的格式
-Bstatic 只使用静态库
-Bdynamic 只使用动态库
-Bsymbolic 把引用捆绑到共享库中的全局符号
-c 从指定的命令文件读取指令
-cref 创建跨引用表
-d 设置空格给通用符号,即使指定了可重定位输出
-defsym 在输出文件中创建指定的全局符号
--demangle 在错误消息中还原符号名称
-e 使用指定的符号作为程序的厨师执行点
-E 对于ELF格式文件,把所有符号添加到动态符号表
-f 对于ELF格式共享对象,设置DT_AUXILIARY名称
-F 对于ELF格式共享对象,DT_TILTER名称
-format 指定目标代码输入文件的格式(和-b相同)
-g 被忽略。用于提供和其他工具的兼容性
-h 对于ELF格式共享对象,设置DT_SONAME名称
-i 执行增量连接
-l 把指定的存档文件添加到要连接的文件清单
-L 把指定的路径添加到搜索库德目录清单
-M 显示连接映射,用于诊断目的
-Map 创建指定的文件来包含连接映射
-m 模拟指定的连接器
-N 指定读取/写入文本和数据段
-n 设置文本段为只读
-noinhibit-exec 生成输出文件,即使出现非致命连接错误
-no-keep-memory 为内存使用优化连接
-no-warn-mismatch 允许连接不匹配的目标文件
-O 生成优化了的输出文件
-o 指定输出文件的名称
-oformat 指定输出文件的二进制格式
-R 从指定的文件读取符号名称和地址
-r 生成可重定位的输出(称为部分连接)
-rpath 把指定的目录添加到运行时库搜索路径
-rpath-link 指定搜索运行时共享库的目录
-S 忽略来自输出文件的调试器符号信息
-s 忽略来自输出文件的所有符号信息
-shared 创建共享库
-sort-common 在输出文件中不按照长度对符号进行排序
-split-by-reloc 按照指定的长度在输出文件中创建额外的段
-split-by-file 为每个目标文件在输出文件中创建额外的段
--section-start 在输出文件中指定的地址定位指定的段
-T 指定命令文件(和-c相同)
-Ttext 使用指定的地址作为文本段的起始点
-Tdata 使用指定的地址作为数据段的起始点
-Tbss 使用指定的地址作为bss段的起始点
-t 在处理输入文件时显示它们的名称
-u 强制指定符号在输出文件中作为未定义符号
-warn-common 当一个通用符号和另一个通用符号结合时发出警告
-warn-constructors 如果没用使用任何全局构造器,则发出警告
-warn-once 对于每个未定义符号只发出一次警告
-warn-section-align 如果为了对齐而改动了输出段地址,则发出警告
--whole-archive 对于指定的存档文件,在存档中包含所有文件
-X 删除所有本地临时符号
-x 删除所有本地符号
-b TARGET 设置目标文件的文件格式
-e ADDRESS 设置目标文件的开始地址
-EB 链接big-endian的目标文件
-EL 链接small-endian的目标文件
-l LIBNAME 创建执行程序时要链接的库文件(比如某个库为test,则可以为-ltest)
-L DIRECTORY 寻找要链接的库文件时搜索的文件路径
-o FILE 设置输出文件的名字
-s 去除输出文件中的所有符号信息
-S 去除输出文件中的调试符号信息
-T FILE 读取链接描述脚本,以确定符号等的定位地址
-v 输出ld的版本信息
-x 去除所有的局部符号信息
-X 去除临时的局部符号信息,默认情况下会设置这个选项
-Bstatic 创建的输出文件链接静态链接库
-Bdynamic 创建的输出文件链接动态链接库
-Tbss ADDRESS 设置section bss的起始地址
-Tdata ADDRESS 设置section data的起始地址
-Ttext ADDRESS 设置section text的起始地址
gcc能够编译很多不同的高级语言。包括C、C++、Objective-C、Fortran、Java、Ada等。
gcc的命令行格式如下:
gcc [-c|-S|-E] [-std=standard]
[-g] [-pg] [-Olevel]
[-Wwarn...] [-pedantic]
[-Idir...] [-Ldir...]
[-Dmacro[=defn]...] [-Umacro]
[-foption...] [-mmachine-option...]
[-o outfile] infile...
-c 编译或者汇编代码,但是不进行连接
-S 编译后停止,但是不进行汇编
-E 预处理后停止,但是不进行编译
-o 指定要使用的输出文件名
-v 显示每个编译阶段使用的命令
-std 指定使用的语言标准
-g 生成调试信息
-pg 生成gprof制作简档要使用的额外代码
-O 优化可执行代码
-W 设置编译器警告消息级别
-pedantic 按照C标准发布强制性诊断清单
-I 指定包含文件的目录
-L 指定库文件的目录
-D 预定义源代码中使用的宏
-U 取消任何定义了的宏
-f 指定用于控制编译器行为的选项
-m 指定与硬件相关的选项
gdb命令行格式:
gdb [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps] [-tty=dev]
[-s symfile] [-e prog] [-se prog] [-c core] [-x cmds] [-d dir]
[prog[core|procID]]
-b 设置远程调试时串行接口的线路速度
-batch 以批处理模式运行
-c 指定要分析的核心转储文件
-cd 指定工作目录
-d 指定搜索源文件的目录
-e 指定要执行的文件
-f 调试时以标准格式输出文件名和行号
-nx 不执行来自.gdbinit文件的命令
-q 安静模式-不输出介绍
-s 指定符号的文件名
-se 指定符号和药执行的文件名
-tty 设置标准输入和输出设备
-x 从指定的文件执行gdb命令
gdb命令如下:
break 在源代码中设置断点以便停止执行
watch 设置监视点,当变量到达特定值时停止执行
info 观察系统元素,比如寄存器、堆栈和内存
x 检查内存位置
print 显示变量值
run 在调试器内开始程序的执行
list 列出指定的函数或者行
next 执行程序中的下一条指令
step 执行程序中的下一条指令
cont 从停止的位置继续执行程序
until 运行程序,直到到达指定的源代码行(或者更大)
程序员可以用objdump程序查看目标代码文件中由编译器生成的指令码。该程序不仅能够显示汇编语言代码,而且能够显示生成的原始指令码。