INSISTARS注册过商标是S吗?还有哪些分类可以注册?

在一些老的连接脚本上,你有时会看到'[COMMON]'。这个符号现在已经过时了, 它等效于'*(COMMON)'。 

输入节和垃圾收集 

当连接时垃圾收集正在使用中时('--gc-sections'),这在标识那些不应该被排除在外的节时非常有用。这 

接下来的例子是一个完整的连接脚本。它告诉连接器去读取文件'all.o'中的所有节,并把它们放到输出节 


每一个关键字后面都跟上一个圆括号中的要存入的值。表达式的值被存在当前的定位计数器的值处。 

‘BYTE’,‘SHORT’,‘LONG’‘QUAD’命令分别存储一个,两个,四个,八个字节。存入字节后,定位计 


数器的值加上被存入的字节数。 

比如,下面的命令会存入一字节的内容1,后面跟上四字节,其内容是符号'addr'的值。 

当使用64位系统时,‘QUAD’和‘SQUAD’是相同的;它们都会存储8字节,或者说是64位的值。而如果软硬件 


系统都是32位的,一个表达式就会被作为32位计算。在这种情况下,‘QUAD’存储一个32位值,并把它零扩展 

如果输出文件的目标文件格式有一个显式的endianness,它在正常的情况下,值就会被以这种endianness存储 


当一个目标文件格式没有一个显式的endianness时, 值就会被以第一个输入目标文件的endianness存储。 

注意, 这些命令只在一个节描述内部才有效,而不是在它们之间, 所以,下面的代码会使连接器产生一个错 

而这个才是有效的: 

你可能使用‘FILL’命令来为当前节设置填充样式。它后面跟有一个括号中的表达式。任何未指定的节内内存 


区域(比如,因为输入节的对齐要求而造成的裂缝)会以这个表达式的值进行填充。一个'FILL'语句会覆盖到 
它本身在节定义中出现的位置后面的所有内存区域;通过引入多个‘FILL’语句,你可以在输出节的不同位置 
拥有不同的填充样式。 

这个例子显示如何在未被指定的内存区域填充'0x90': 

‘FILL’命令跟输出节的‘=FILLEXP’属性相似,但它只影响到节内跟在‘FILL’命令后面的部分,而不是 


整个节。如果两个都用到了,那‘FILL’命令优先。 

有两个关键字作为输出节命令的形式出现。 


这个命令告诉连接器为每一个输入文件创建一个符号。而符号的名字正好就是相关输入文件的名字。 

这个命令一直是a.out目标文件格式特有的。 它一般不为其它的目标文件格式所使用。 


当使用a.out目标文件格式进行连接的时候, 连接器使用一组不常用的结构以支持C++的全局构造函 
数和析构函数。当连接不支持专有节的目标文件格式时, 比如ECOFF和XCOFF,连接器会自动辩识C++ 
全局构造函数和析构函数的名字。对于这些目标文件格式,‘CONSTRUCTORS’命令告诉连接器把构造 
函数信息放到‘CONSTRUCTORS’命令出现的那个输出节中。对于其它目标文件格式,‘CONSTRUCTORS’ 
WORD是入口的数量,紧跟在后面的是每一个构造函数和析构函数的地址,再然后是一个零WORD。编译 
器必须安排如何实际运行代码。对于这些目标文件格式,GNU C++通常从一个`__main'子程序中调用 
析构函数,或者直接从函数'exit'中运行。 

对于像‘COFF’或‘ELF’这样支持专有节名的目标文件格式,GNU C++通常会把全局构造函数与析构 


函数的地址值放到'.ctors'和'.dtors'节中。把下面的代码序列放到你的连接脚本中去,这样会构建 
出GNU C++运行时代码希望见到的表类型。 

如果你正使用GNU C++支持来进行优先初始化,那它提供一些可以控制全局构造函数运行顺序的功能, 

通常,编译器和连接器会自动处理这些事情,并且你不必亲自关心这些事情。但是,当你正在使用 


C++,并自己编写连接脚本时,你可能就要考虑这些事情了。 

输出节的丢弃。 

连接器不会创建那些不含有任何内容的输出节。这是为了引用那些可能出现或不出现在任何输入文件中的输入 


节时方便。比如: 

如果至少在一个输入文件中有'.foo'节,它才会在输出文件中创建一个'.foo'节 

如果你使用了其它的而不是一个输入节描述作为一个输出节命令,比如一个符号赋值,那这个输出节总是被 


创建,即使没有匹配的输入节也会被创建。 

一个特殊的输出节名`/DISCARD/'可以被用来丢弃输入节。任何被分配到名为`/DISCARD/'的输出节中的输入 


节不包含在输出文件中。 

上面,我们已经展示了一个完整的输出节描述,看下去就象这样: 

每一个输出节可以有一个类型。类型是一个放在括号中的关键字,已定义的类型如下所示: 


这个节应当被标式讵不可载入,所以当程序运行时,它不会被载入到内存中。 

支持这些类型名只是为了向下兼容,它们很少使用。它们都具有相同的效果:这个节应当被标式讵不 
可分配,所以当程序运行时,没有内存为这个节分配。 

连接器通常基于映射到输出节的输入节来设置输出节的属性。你可以通过使用节类型来重设这个属性, 


比如,在下面的脚本例子中,‘ROM’节被定址在内存地址零处,并且在程序运行时不需要被载入。 
‘ROM’节的内容会正常出现在连接输出文件中。 

每一个节有一个虚地址(VMA)和一个载入地址(LMA);出现在输出节描述中的地址表达式设置VMS 

连接器通常把LMA跟VMA设成相等。你可以通过使用‘AT’关键字改变这个。跟在关键字‘AT’后面的表达式 


LMA指定节的载入地址。或者,通过`AT>LMA_REGION'表达式, 你可以为节的载入地址指定一个内存区域。 

这个特性是为了便于建立ROM映像而设计的。比如,下面的连接脚本创建了三个输出节:一个叫做‘.text’ 


后一个叫做‘.bss’是用来放置未初始化的数据的,其地址从'0x3000'处开始。符号'_data'被定义为值 

这个连接脚本产生的程序使用的运行时初始化代码会包含象下面所示的一些东西,以把初始化后的数据从ROM 


映像中拷贝到它的运行时地址中去。注意这节代码是如何利用好连接脚本定义的符号的。 

你可以通过使用`>REGION'把一个节赋给前面已经定义的一个内存区域。 

这里有一个简单的例子: 

我要回帖

更多关于 S商标 的文章

 

随机推荐