ld链接脚本语法简介

 

主要包含命令语句和赋值语句。

 

一、语法

1、分号,作为分隔符号  

2、注释 表达式和运算符  和c一样,其中注释只有/**/

3、字符引用  段名文件名等有特殊字符,使用双引号

4、命令语句

a、ENTRY(symble)  指定入口地址,入口地址就是进程执行的第一条用户空间的指令再进程地址空间中的地址,被指定再ELF文件头的ELF32_Ehdr的e_entry成员中。

ld有多种指定程序入口方式:(优先级逐渐降低)

ld -e

entry()

_start符号

.text

0

 

b、STARTUP(filename)  将文件filename 作为链接过程中的第一个输入文件。

c、SEATCH_DIR 将路径path加入到ld链接器的库查找目录。 ld会根据指定的目录去查找相应的库。

d、INPUT(file,file,...)  将指定文件作为链接过程中的输入文件

e、INCLUDE filename 将指定文件包含进本链接脚本。

f、PROVIDE(symbol) 在链接脚本中定义某个符号。该符号再程序中可以被引用,起始前文提到的特殊符号都是由系统默认的链接脚本通过PROVIDE 命令定义在脚本中的

 

最复杂的SECTIONS

SECTIONS

{

  secname : {contents}

}

secname 表示 输出段的段名,后面必须有一个空格,使得输出段名没有歧义,后面根一个冒号和一对大括号。大括号里面的contents描述了一套规则和条件,表示符合这种条件的输入段合并到输出段中。输出段名必须符号输出文件的要求,例如:a.out 输出段名不可以是.text

.data .bss 之外的名字,因为.a.out 规定只允许这三个名。

有一个特殊的段名/DISCARD/如果使用这个名字作为输出,那么所有符合条件的段都丢弃

 

contents 规则

包含若干个条件,每个条件用空格分开,如果输入段符合任一条件,就表示符合cotents规则

输入规则 :filename(sections)

 

 

ENTRY(nomain)  //指定了程序的入口地址

SECTIONS  //链接脚本的主体

{

  . = 0x08048000 + SIZEOF_HEADERS;  //将当前虚拟地址设置为0x08048000 + sizeof_headers. 

其中 “.”表示当前虚拟地址

 SIZEOF_HEADERS 表示文件的文件头大小

 

  tinytext : {*(.text) *(.data) *(.rodata)} //将所有输入文件中的三个段合并为输出文件中的 tinytext段。

 

  /DISCARD/ : {*(.comment)}  //将输入文件的comment段丢弃

}

posted on 2014-05-21 15:08  Red_Point  阅读(7243)  评论(0编辑  收藏  举报

导航