GCC技术参考重点解析

*选项前缀

所有选项都以连字符开始。它们中的一些还会用两个连字符。

例如,设定在生成的代码中携带调试信息的传统选项是:-g  。同一选项还可以用如下较长的形式,如:--debug 

前缀-f 

字母f 代表flag (标记)。大多数选项只有两种状态,开和关。

前缀-W

前缀-W 通常用来指定是否需要编译程序产生某些警告消息。

*命令行的顺序 

选项的顺序很重要。如果命令行中有两个选项,并且它们是冲突的,通常第二个选项会改变第一个选项所产生的设定,从而覆盖了第一个选项。

例如,-O3 优化选项将打开-finline-functions选项。但如果想使用-O3 选项,又要关闭函数内嵌功能,可以按下面的顺序输入选项:-O3 -fno-inline-functions  

*文件类型

编译程序通过匹配表中的后缀检查文件名,从而判断文件的内容。选项-x 可以指示编译程序忽略后缀并将文件作为某一类型对待。



-###  显示编译程序当前版本号,并显示编译和链接中每个阶段可用的所有命令,但并不执行任何命令。

-a     在可执行代码每个基本逻辑块的顶端,都会产生额外代码用来进行记录。运行一次基本逻辑块,就会记录一次。所记录的信息包括基本逻辑块的起始地址和逻辑块中的函数名称。如果同时给出选项-g ,则每个基本逻辑块所记录的信息将包括文件名和每个逻辑块的起始行。这些信息会写到文件bb.out 中

-ansi 选项指示编译程序编译符合标准的程序,但并不限制与标准不冲突的其他方式。


*术语详解:

absolute address (绝对地址):绝对地址是一个惟一的可用来指定某个内存字节的数字数值。

relative address (相对地址):相对地址是到某个已知地址的偏移。这种类型的寻址通常用于可重定位的模块(共享库),因为只有模块最高端的位置才是加载到内存中的可执行代码所需要的惟一信息。

aggregate (聚集):包含多于一个基本数据类型的数据类型。

aliasing (别名机制):同一内存地址可直接或间接地通过两个或多个不同名字(可能还有不同的数据结构)进行访问,这被叫做别名。

ANSI :( American National Standards Institute  ,美国国家标准协会) 

archive:库,文档

assembler(汇编器):一个平台相关的程序,它读取汇编语言源文件(机器代码的助记表示)并将其翻译为作为连接程序输入的二进制目标文件。 

compiler (编译程序) :读取计算机程序的源文件(或文本文件)的软件集合,可将指令翻译成计算机可执行的格式。

backtrace (回退跟踪):GNU 调试器可以打印函数名和地址的列表,它会被调用以达到程序的当前执行点。这些信息,包括函数地址和参数值,称为回退跟踪。

BFD ( Binary File Descriptor ,二进制文件描述字) :包含处理各种二进制文件格式完成各种底层操作的例程的库。

BSD :一种UNIX 操作系统。它也是几种其他现代UNIX 系统的基础。

bss:由UNIX 连接程序生成的可执行文件的未初始化数据段。它包含的数据只有地址但不包含任何空间。因此,直到程序被加载时才会分配空间。在可执行文件中,bss 变量只被赋以名字、尺寸和位置。

built in function (内嵌函数):由编译程序所生成的函数体称为内嵌函数。一个内嵌函数可以是相应标准库函数的优化版本、编译程序的附加功能或是实现诸如变长参数列表等内部使用的函数。

bytecode (字节码):编译Java 程序所生成的目标代码的可移植形式。字节码由Java 虚拟机解释以执行Java 程序。

CCP ( Conditional Code Propagation ,条件代码传播) :一种优化技术,可以发现某值对所有可能的执行路径均为常量,并用这一事实来探测和删除不可能被执行的代码。

cfront :最初的C++ 实现是一个称为cfront 的AT&T 程序。

clobber (破坏):如果存储位置(通常为一个寄存器)已经被用作一个临时工作区,它就不再保存所预期的数值,这个存储位置就称为被破坏(clobbered )了。 

coercion (自动转换):由一种基础数据类型到另一种的自动转换(没有强制类型转换或函数调用)。

COFF ( Common Object File Format ,通用目标文件格式):一种可跨系统移植的并由各种不同的汇编器和连接程序所了解的目标文件的标准格式。

COMDAT (Common Data ,通用数据):可以在不只一个目标文件中被复制的一种数据或可执行项(或项目的集合)。

common block (公用块):GNU 连接程序创建一个公用块作为全局变量的分配空间。如果不同的目标文件多次声明了相同的全局变量,它们会被解析为公用块中单独的一个变量。

common (通用):可为公用块分配的全局变量属性。

compilation unit (编译单元)可被编译为单独目标文件的单独源代码单位。它通常就是单独的一个源文件,但也可以包含其他辅助编译的源代码。

cross compile (交叉编译) :使用一种编译程序创建在完全不同平台上执行的可执行文件。

CPP (C Preprocessor ,C 预处理程序):预处理程序读取程序源码,并处理其中的指示字以产生源码的修改版本。

cruft :随着软件的发展,以及经历了修改bug 和更新的若干周期,它的部分代码已不再使用但仍然保留在源码中。这种代码称为cruft 。cruft 的尺寸范围可由一两行无用代码到整个源文件模块。由于很难识别cruft ,去除cruft 往往很困难。

CSE (Common Subexpression Elimination ,通用子表达式消除):一种优化技术,它可以识别重复的表达式并重用它的值,而不是再次执行相应的计算。

ctor:构造函数constructor 的通用缩写。

CVS (Concurrent Version System ,同步版本系统):一种版本控制系统,它可以维护文本文件的版本历史信息。设计它是为使广泛分布于各地的不同开发者可同时访问。

data :由UNIX 连接程序生成的可执行文件的一部分,其中包含的数据具有初始值。该段包含的项具有名字、大小,且会分配相应的空间包含它的数值。

DBX:一种交互式调试器,它可以用来一行行地跟踪程序的执行。DBX 是一种命令行调试器,但在许多变体中它具有X GUI 界面和emacs 界面

DCE (Dead Code Elimination ,不可达代码去除) :一种删除不可能被执行的代码的优化技术。

dead code (不可达代码):在优化期间,可能留下某些代码但从不会被执行。这些就是不可达代码。优化器应该去除这些代码。

demangle:解析出编码在已经拆分(mangle )了的函数名中的描述信息的过程。

deprecated (已废止的):任何不再需要的编译程序的选项或功能被称为是已废止的。

dereference (去引用):表达式可能会涉及保存在指针中的地址。用这种方式使用的指针就称为是去引用的。

directive (指示字) :1. 源代码中使用井号(#) 开头的命令,它由预处理程序处理。2. 在汇编语言中,一条指示字就是一条针对汇编器的指令,而不是产生代码的操作码。汇编器指示字也称为伪操作。

entry point (入口点) :可执行程序中的地址,程序从这里开始执行并称为入口点。

fetch (读取):当计算机由内存中的程序读取指令并加载到CPU 执行时,这称为指令的读取。

FPU (Floating Point Unit ,浮点处理单元):同CPU 一起工作处理浮点操作的硬件处理器。

GPL ( General Public License ,通用公共许可证) 

i18n :单词internationalization 的简写形式,它由字母i 开头,后跟18 个字符,最后是字母n 。

inline (内联):一个函数的实体(或其他相似的语言成分)被包含在函数的调用点。就是说函数体将在代码中内嵌展开,而不是只作为对另一处函数体的一次调用。

insn:一种机器语言或RTL 中间语言指令。

jar :一种包含一个或多个Java 类文件的档案文件。该文件还包含一个清单,是一个包含jar 文件中类名列表的文本文件。

JVM (Java Virtual Machine ,Java 虚拟机) :一个程序,它可从标准Java 字节码格式的文件中读取指令并执行。向一个平台上移植JVM 和标准类库实际上就是向该平台移植了所有的Java 程序。

lexical analysis (词法分析) :也称为词法扫描,词法分析就是从程序源文件中读取输入字符流,并按照某种方式组合它们,形成名字、数字以及标点。由一些字符集合构成的单元称为一个token 。

library (库):库是一个包含一个或多个目标文件的文件,它可以链接到其他目标文件组成可执行文件。静态库就是包含由连接程序永久链接到可执行程序的模块的库。静态库也称为文案。共享库就是包含可以临时链接到可执行程序并在执行时进行真正链接的模块的库。共享库也称为动态库。动态链接的程序就是包含到这些函数的引用的可执行程序,当程序执行时,它会从动态库中加载这些函数。参见静态库和相对地址。

life analysis (生命周期分析):确定哪个数值应该留在寄存器中可供后用的过程,同时也确定哪个寄存器不会被使用,因为其中包含的数值不再使用。

linkage (链接):当调用函数时,必须用标准方法来存储和读取传递给函数的参数以及函数所返回的数值。这种协议称为链接,而且是混合两种语言时要解决的主要问题。

linker (链接程序):一种平台相关的程序,可将一组目标文件(某些必须由库中析取)组合在一起生成一个可执行程序。

lvalue (左值):一种任意类型的表达式,可以解析为内存单元的某个地址。这个术语源于left value ,就是指赋值语句中左边的部分的值。

macro (宏):在预处理程序中,使用#define 指示字声明的名字及其值就是一个宏,之后会用它来替代源码中的文本。

rvalue (右值):任何可以得到一个数值的表达式。该名词源于右值(right value ),是指在赋值语句中右边的表达式所计
算出的数值。

Makefile (make 程序的描述文件) :包含一组由make 命令编译和连接程序用到的规则的文件,它也会根据文件的日期和时间戳执行一些其他任务。makefile 通常被命名为makefile 或Makefile 。

mangle:C++ (和Java )编译程序修改成员函数(以及方法)的名字,来依据其参数个数和类型生成一个惟一名。这一称为mangling 的过程允许重载简单成员函数(和方法)。

marshaling (列集):将传递给远程函数的参数以及由远程函数返回的值进行串行化(转变为可以发送的字节流)的动作,这称为列集。将一个规整化的流转化为数据的过程称为反列集(unmarshaling )。

member function (成员函数):在C++ 中,在类中定义的函数是类的一个成员并称为成员函数。除非成员函数被声明为静态的,否则成员函数永远会在该类的某个对象的上下文中被调用并具有this 指针,它可以在函数中引用该对象。

method (方法) :Java 中的方法就是类中定义的函数,它是类定义的一部分。除非方法被声明为静态的,否则方法始终会在类的对象的上下文中被调用并且具有this 指针,它可以在函数中引用该对象。Java 中的方法就如同C++ 中的成员函数。

MFC ( Microsoft Foundation Class ,微软基础类):包装Win32 用户接口API 的类的层次。

mirror (镜像) :复制其他Internet 站点的站点,可以使下载文件更方便。

multilib :如果单个目标机需要多于一种版本的库,这就是multilib 。例如,某平台可能具有浮点运算单元或没有,因此同样的数学库就需要使用不同选项设置编译两次,并使其可以在相应的配置下链接相应的程序。

NLM (Netware Loadable Module ,Netware 可加载模块):可执行程序,它已被格式化为可以在NetWare 系统上执行。

NLS ( Native Language Support ,本地语言支持):GCC 编译程序的一种能力,它可以以本地语言(而非美国英语)输出诊断消息。NLS 是i18n 和l10n 的组合。

noop (空操作):汇编语言指令,但它什么也不做。它通常用来作为填充字插入到可执行代码中,或用来作为分支目标处的指令。

object (对象):1. 在面向对象编程中,对象就是数据项的集合,以及用于操作这些数据项的方法(或函数)。参见类。2. 编译过程的输出是目标文件(或目标代码),因为运行编译程序或连接程序的目的就是生成这种格式的文件。

opcode (操作码) :计算机CPU 的一条指令。操作码可以是一条指令,能够完成两个数的相加、向寄存器加载一个数、在内存中保存一个数值,或是硬件知道如何操作的其他指令。操作码是机器指令的一部分,不包括数据。

peephole optimization (窥孔优化) :一种优化技术,它仅检查相连的几条指令,以确定它们是否可由一组已改进的指令替换。

PIC ( Position Independent Code  ,位置独立代码):适合用于共享库的代码,因为它可被保存在内存中的任何一个位置并从那里开始执行。所有的内部地址都是相对于内部偏移,或是对全局表的引用。

platform (平台):某种特定计算机硬件和操作系统的组合。编译程序必须被配置为可在某特定的操作系统和某特定的硬件计算机上运行。平台也称为主机或目标机。

PMF ( Pointer to Member Function ,成员函数指针):C++ 中一种特殊数据类型,它可以保存到某个对象的成员函数的地址。

preprocessor (预处理程序):一种文本处理器,它可以读取程序源代码并用数值(或其他名字)替换名字,使用文本替换扩展宏,以及评估表达式以确定哪些代码可以被去除。

RTL (Register Transfer Language ,寄存器传送语言):由某语言源代码所生成的内部代码,并可由此输出汇编语言。在RTL 格式下,仍可能执行优化和其他操作。

runtime (运行时):也称作运行时软件包,由于它们在应用程序运行时会被调用,运行时是函数的集合,它同编译程序一同发行并链接到被编译的程序。

scheduler (调度器):如果机器能够一次执行多条指令,指令可以被调整(调度),这样一些较快的指令就可以与一条较慢的指令同时执行。

scope (作用域):一个定义可以被识别的区域。在C 中,函数定义的变量的作用域是整个函数。定义在由括号括起的代码块中的变量的作用域是那个代码块,在函数外定义的变量可以由很多函数引用。

stringize (字串化):预处理程序采取的动作,可将宏参数转化为一个引用的字串,而非简单地将其插入到源码中。

strip :strip 命令可以用来去除可执行文件中的所有调试信息。根据编译到可执行程序中的调试信息的多少,缩减的尺寸可能是非常惊人的。

stderr (Standard Error ,标准错误):每个UNIX 程序在开始执行时均打开该输出流,默认情况下定向到终端上。通常该流可用来输出错误消息。

stdin (Standard Input ,标准输入) :每个UNIX 程序在开始运行时均打开该输入流,默认情况下会从键盘中读取所敲击的内容。

stdout (Standard Output ,标准输出):每个UNIX 程序在开始执行时均打开的输出流,默认情况下定向到终端上。通常该流可以用来进行输出。

strength reduction (强度弱化):一种优化技术,它可以用代价较低的操作取代代价高的操作,例如用加法或移位操作取代乘法操作。

stub :一种本地函数,当它被本地程序调用时,会将调用信息打包,并将调用发送给真正的函数,即位于另一台计算机上的函数。

tail call (尾调用):如果函数最后一条语句递归地调用自身,这一逻辑可以变成一个循环而非调用,这样可以节省栈空间。同样的优化技术可以用来在两个或多个函数间进行递归的相互调用——这种优化也叫同属调用。

text (文本):由UNIX 连接程序产生的可执行文件中包含的可执行代码段。

thunk (块) :用来产生地址的一块代码。

time slice (时间片) :操作系统允许进程在其停止并由另一个进程使用时间片前执行的时间量。

trap (陷阱):一种发送给正在运行的程序的硬件信号,它用来指出硬件检测到的程序执行错误。

unalias (去别名):去除所有对内存的调用,但一种可能的到内存位置的引用就是为该单元去别名。

unroll (循环展开):为了优化代码,足够小并且具有固定循环次数的循环可以通过复制代码相应的次数被展开,并且循环可以被删除。

UTF-8 (Unicode Transformation Format ,Unicode 传输格式):ASCII 文本文件可被当作就是UTF-8 编码的。

vague linkage (模糊连接) :目标文件包含的信息可用于链接和运行程序,但除了数据以外的其他内容也需要解析地址引用。一个例子就是C++ 中的虚函数。 

variadic macro (变长宏) :变长宏就是具有可变参数个数的宏。GCC 预处理程序具备对可变参数宏进行扩展的能力,这种宏会将参数列表的文本保存在名为__VA_ARGS__ 的变量中。

vector (向量) :一组具有相同类型和尺寸的数据项的连续集合。

volatile (易变的) :内存中的某单元可能会在其他地方被修改(没有常规的途径),这被称为易变的。

vtable ( virtual function table  ,虚函数表) :面向对象语言的对象维护内部表,称为vtables ,它包含函数的地址。通过替换这些地址,子类可以重载
并替代父类中选中的函数。

width (宽度):术语宽度通常指基本数据类型的相对尺寸。例如,在C 中,char 可能需要1 个字节,short 可能需要2 个字节。在这种情况下,称short 比char 宽。

word (字) :本地机器整数的尺寸。在16 位机器中,字是16 位的,在32 位机器中,字是32 位的。

whitespace (空白) :空白字符就是通常情况下不可见的字符,并会在编译现代自由格式语言时作为输入被忽略。它们通常是空格、制表符、竖直制表符、进纸符、换行符和回车符。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FeelTouch Labs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值