首页 > 其他分享 >ld链接脚本语法简介

ld链接脚本语法简介

时间:2023-10-29 16:00:11浏览次数:35  
标签:语句 文件 ld 简介 段名 data 链接

链接脚本由一系列语句组成,语句分两种,一种是命令语句,另外一种是赋值语句。链接脚本语法像C语言,主要有如下几点相似之处。

  • 语句之间使用分号";"作为分割符
    原则上讲语句之间都要以";"作为分割符,但是对于命令语句来说也可以使用换行来结束该语句,对于赋值详吾句来说必须以";"结束
  • 表达式与运算符
    脚本语言的语句中可以使用C语言类似的表达式和运算操作符,比如+、-、、/、+=、=、=等,甚至包括&、1、>>、<<等这些位操作符。
  • 注释和字符引用
    使用/**/作为注释。脚本文件中使用到的文件名、格式名或段名等凡是包含";"或其他的分隔符的,都要使用双引号将该名字全称引用起来,如果文件名包含引号,则很不幸,无法处理。

SECTIONS命令

SECTIONS命令基本格式为:

SECTIONS
{
    ...
    secname : {contents}
}

secname表示输出段的段名,secname后面必须有一个空格符,这样使得输出段名不会有歧义,后面紧跟着冒号和一对大括号。大括号里面的contents描述了一套规则和条件,它表示符合这种条件的输入段将合并到这个输出段中。输出段名的命名方法必须符合输出文件格式的要求,比如,如果使用ld生产一个a.out格式的文件,那么输出段名就不可以使用除".text"、".data"和".bss"之外的任何名字,因为a.out格式规定段名只允许这三个名字。

有一个特殊的段名叫"/DISCARD/",如果使用这个名字作为输出段名,那么所有符合后面contents所规定的条件的段都将被丢弃,不输出到输出了文件中。

接着,我们最应该关心的是contents这个规则。contents中可「以包含若干个条件,每个条件之间以空格隔开,如果输入段符合这些条件中的任意一个即表示这个输入段符合contents规则。条件的写法如下:
filename(sections)

filename表示输入文件名,sections表示输入段名。让我们举几个条件的例子来看看:

  • file1.o(.data)表示输入文件中名为filel.o的文件中名叫.data的身没符合条件

  • file1.o(.data .rodata)或file1.o(.data, .rodata)表示输入文件中名为filel.o的文件中的名叫.data或.rodata的段符合条件。

  • file1.o如果直接指定文件名而省略后面的小括号和段名,则表示file1.o的所有段都符
    合条件。

  • *(.data)所有输入文件中的名字为.data的文件符合条件。*是通配符,类似于正则

其他命令

命令语句 说明
ENTRY(symble) 指定符号symbol的值为入口地址(EntryPoint)。入口地址即进程执行的第一条用户空间的指令在进程地址空间的地址,它被指定在ELF文件头Elf32_Ehdr的e_entry成员中。ld有多种方法可以设置进程入口地址,它们之间的优先级按以下顺序排列(编号越靠前,优先级越高): 1.ld命令行的-e选项
2.链接脚本的ENTRY(symbol)命令
3.如果定义了_start符号,使用_start符号值
4.如果存在.text段,使用.text段的第一字节的地址
5.使用值0
STARTUP(filename) 将文件filename 作为链接过程中的第一个输入文件。
SEATCH_DIR(path) 将路径path加入到ld链接器的库查找目录。 ld会根据指定的目录去查找相应的库。
INPUT(file,file,...)
INPUT(file file ...)
将指定文件作为链接过程中的输入文件
INCLUDE filename 将指定文件包含进本链接脚本。
PROVIDE(symbol) 在链接脚本中定义某个符号。该符号再程序中可以被引用,起始前文提到的特殊符号都是由系统默认的链接脚本通过PROVIDE 命令定义在脚本中的

标签:语句,文件,ld,简介,段名,data,链接
From: https://www.cnblogs.com/lvzh/p/17795903.html

相关文章

  • 【RuoYi移动端】HbuilderX实现底部弹窗示例
    一、单选样式弹窗选择1、View页面代码<uni-popupref="textBox"type="bottom"> <viewclass="select_box"> <viewclass="select_row"v-for="(item,index)instatus"@click="selectClick(item.id)"&g......
  • PowerBuilder 中全局处理程序错误
    PowerBuilder中全局处理程序错误在systemerror事件中写入如下代码即可,程序发生错误会弹框提示并记录到错误日志文件中,不写的话只是弹框提示并且是英文 intli_ErrNo//错误编号stringls_ErrMsg//错误编号对应的中文错误信息stringls_Msg//弹出错误提示框的内容也......
  • 无涯教程-Clojure - Accessing Individual Fields函数
    可以通过与结构对象一起访问键来访问结构的各个字段。AccessingIndividual-语法:keystructure-name参数   - "key"是结构中的键值,"structure-name"是作为相应关键字的结构。返回值 - 将返回与键关联的值。以下程序显示了有关如何使用它的示例。AccessingI......
  • minio简介
     一、简介 MinIO是一个基于ApacheLicensev2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。官网:https://www......
  • Cocos 2.x-Hello World 飞机大战游戏
    Java程序员Cocos2.x初体验(Helloworld),飞机大战游戏参考野生程序君教程1.环境搭建在Cocos官网下载CocosDashboard_2.0.1.exe,安装,启动后设置编辑的目录(默认情况下,编辑器安装在C盘中,每一个版本的编辑会占用较大的空间,所以这里将编辑器安装目录配置在的D盘)在安装列表中新增......
  • PyQt5简介及Designer、Pyuic插件安装
    PyQt5简介及Designer、Pyuic插件安装swallowsonny关注IP属地:湖北0.6972019.08.0712:36:33字数765阅读15,117英文参考文档中文参考文档简介PyQt5是什么Qt是一组跨平台的c++库,实现了访问现代桌面和移动系统许多方面的高级api。这些包括定位和定位服务、多媒体、......
  • 具有意义的资料链接
    每日整理合集10.281.https://tangshusen.me/Dive-into-DL-PyTorch/#/2.https://blog.csdn.net/m0_51366201/article/details/1302279063.https://blog.csdn.net/weixin_43605214/article/details/12749504010.2910.30......
  • CPLD基础
     1、Altera特殊管脚的使用https://blog.csdn.net/yaomengzao/article/details/79927408 2、DEV_CLRn复位管脚https://mbb.eet-china.com/blog/969910-254811.html  3、always@(),alwyas@(*),always用法https://blog.csdn.net/I_am_student/article/details/122690573......
  • linux IFS(internal field separator,内部字段分隔符)
    1、简介IFS是一个shell内置变量,它是一个字符列表,列表里的每个字符是默认的字段分隔符2、查看IFS变量(1)centosset|less然后搜索字符串IFS,如下图 (2)kali的zsh环境下set|grepIFS结果如下图3、打印IFS变量因为IFS变量是空格、tab、换行,所以打印结果一片空白......
  • Java反序列化之URLDNS链
    Java反序列化之URLDNS链一、漏洞简介URLDNS链是java原生态的一条利用链,通常用于存在反序列化漏洞进行验证的,因为是原生态,不存在什么版本限制。该链有以下三个特点:不限制jdk版本,使用Java内置类,对第三方依赖没有要求目标无回显,可以通过DNS请求来验证是否存在反序列化漏洞URLD......