GNU工具集

GNU 汇编器(简称gas)

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资源文件

一、gas使用方法

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)

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等各种格式的目标文件。

1、ld命令格式

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]

 

2、参数详解

-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 删除所有本地符号

3、常用的选项

-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的起始地址

 

 

GNU编译器(称为gcc)

gcc能够编译很多不同的高级语言。包括C、C++、Objective-C、Fortran、Java、Ada等。

一、gcc命令格式

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 指定与硬件相关的选项

 

GNU调试器(称为gdb)

一、gdb命令行格式

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]]

二、gdb参数详解

-b 设置远程调试时串行接口的线路速度

-batch 以批处理模式运行

-c 指定要分析的核心转储文件

-cd 指定工作目录

-d 指定搜索源文件的目录

-e 指定要执行的文件

-f 调试时以标准格式输出文件名和行号

-nx 不执行来自.gdbinit文件的命令

-q 安静模式-不输出介绍

-s 指定符号的文件名

-se 指定符号和药执行的文件名

-tty 设置标准输入和输出设备

-x 从指定的文件执行gdb命令

三、gdb命令

gdb命令如下:

break 在源代码中设置断点以便停止执行

watch 设置监视点,当变量到达特定值时停止执行

info 观察系统元素,比如寄存器、堆栈和内存

x 检查内存位置

print 显示变量值

run 在调试器内开始程序的执行

list 列出指定的函数或者行

next 执行程序中的下一条指令

step 执行程序中的下一条指令

cont 从停止的位置继续执行程序

until 运行程序,直到到达指定的源代码行(或者更大)

 

 

GNU objdump程序

程序员可以用objdump程序查看目标代码文件中由编译器生成的指令码。该程序不仅能够显示汇编语言代码,而且能够显示生成的原始指令码。

 

 

 

 

 

 

你可能感兴趣的:(GNU工具集)