GNU ld链接脚本学习

[随笔]GNU linker script,ld script,GNU链接脚本 [随笔]GNU linker script,ld script,GNU链接脚本注,此文部分内容摘抄自网络,博主(itxiebo)主要的贡献是整理编辑等。一、什么是GNU linker script?作用是什么?.lds文件,即linker script,决定了可执行映像(image)的链接方式,以及各个段的装载地址(装载域)和执行地址(运行域)。 装载地址:运行之前各段的地址; 运行地址:运行时各段 阅读详情

转载自:http://blog.chinaunix.net/space.php?uid=13701930&do=blog&id=336529

 

链接器脚本

*********** 

 每次一次链接行为都是被链接器脚本控制,这样的脚本是采用链接器命令语言写成.

   这种脚本主要用途描述如何把输入文件中各段(section)组织到输出文件,并控制输出输出文件的内存布局.大部分链接脚本也就做这些操作.有特殊需要时,链接脚本也可以直接指示链接器使用下面列出的命令执行其它行为.

   链接器总是使用链接脚本.如果没有提供自定义链接脚本则链接器使用默认脚本编译进可执行文件. 查看默认链接器脚本可以使用命令行选项'--verbose'即:ld --verbose;有些命令行选项例如'-r'、'-N'的使用会影响到默认脚本.

   如果想使用自己的链接脚本可以使用'-T'命令行选项,指定这个选项后会替换默认脚本.

   你也可以以隐含方式使用链接脚本就像命名的输入文件,好像也被链接一样.看Implicit Linker Scripts部分.

*Menu:


** Basic Script Concepts::             链接脚本基本概念

** Script Format::                        链接脚本格式

** Simple Example::                     简单样例

** Simple Commands::                 简单命令

** Assignments::                          分配值给符号(symbols)

** SECTIONS::                             段命令

**MEMORY::                                内存命令

**PHDRS::                                   PHDRS 命令

**VERSION::                               版本命令

**Expressions::                           脚本使用的表达式

**Implicit Linker Scripts::             隐示包含链接脚本



Basic Linker Script Concepts

============================


   为更好描述链接器脚本语言,我们要定义些基本概念和名词.

   链接器把所有输入文件组织到单个输出文件.输出文件和输入文件都是以特定数据格式存放,就是众所周知的'目标文件'格式.每个文件都被称作目标文件,输出文件通常称作可执行文件,但是为表达方便也称其为目标文件.每个目标文件(排除特殊情况)都有一个段列表.有时我们把输入文件中的段称作输入段(input section),类似地,也会将输出文件段叫它输出段.

   目标文件中每个段都有一个名字和大小,大部分段也有一个与其关联的数据块,称其为'段注释'.段可是标记为'可装入的(loadable)',意思是输出文件运行时上下文是要被装入内存;没有注释的段标记为'可分配的',意思是在内存的这块区域应该被分配,但是没有任何其它内容装入这里(某些情况下必须被置0).既不是可装入又不是可分配的典型段就是调试信息类的.

   每个可装入的或者可分配的输出段会有两个地址:VMA--虚拟内存地址,LMA--装入内存地址.VMA是输出文件运行是段的地址,LMA是段被装入的位置地址,多数情况下两个地址相同.也有不同的情况,例如一个数据地段被装入ROM,当程序启动时将这个数据段拷贝到RAM(这种技术通常用于初始化ROM系统的全局变量.此时ROM地址是LMA,RAM地址是VMA.

   你可以使用带有'-h'命令行选项的objdump显示目标文件的段.

   每个目标文件也都有一个符号列表,称作符号表(symbol table),符号可以是已定义或未定义的.每个符号具有名字、地址等其它信息.当编译C或C++源程序成目标文件,对于每个定义的函数、全局和静态变量都会产生一个符号;每个未定义函数、全局变量作为输入文件的地址将转变成未定义符号.

   显示目标文件中符号可以使用下面两个命令:

     #nm obj

     #objdump -t obj

Linker Script Format

====================

   链接脚本是文本文件.

   链接脚本由命令串构成,每个命令要么是关键字,可能带有参数;要么是指定的符号.使用分号(';')分割命令,空格在处理时被忽略.

   类似文件、格式名字这样的字符串通常可以直接输入,如果文件名包含其它字符像点('.')号等其它字符分割文件名字,可是使用双引号("")包含.没有情况会在文件名中使用双引号.

   链接脚本像C一样可以包含注释,也使用'/*'和'*/',在C里注释作为空格处理.

Simple Linker Script Example
============================
    不少链接脚本是比较简单明了.
    最简单的链接脚本只有一个命令'SECTIONS',使用'SECTIONS'命令描述输出文件内存布局.
    'SECTIONS'命令是非常强大的,在这我们将解释它的简单用法.现在假设你的程序只是由单一代码段、初始化数段和未初始化数据段,分别对应'.text'、'.data'、'.bss'的段名.再假设输入文件中也只出现这些段.
    在这个例子中,制定代码段装入地址在0x10000,数据段开始在0x8000000,下面脚本即是脚本描述:
     SECTIONS
     {
       . = 0x10000;
       .text : { *(.text) }
       . = 0x8000000;
       .data : { *(.data) }
       .bss : { *(.bss) }
     }
    关键字'SECTIONS'作为命令,后面跟随的是花括弧中包含符号分配和输出描述串.
    在'SECTIONS'里面第一行特殊符号'.'是用作位置计数.如果你没有以其它方式指定输出段地址(其它方式以后在讲解),则地址被设置成位置计数的当前值.位置计数依从输出区大小增长,在'SECTIONS'命令起始处位置计数赋值为0.
    第二行定义输出区'.text',冒号是语法必须的,现在可以忽略.输出区名字后面的花括弧内,列出所有输入区名字,他们将被安置到输出区中.'*'是通配符,匹配任何文件名.表达式'*(.text))意思是所有输入文件的输入区.
    因为位置计数在输出区中定义为0x10000,链接器就会设置输出文件'.text'地址到0x10000.
    剩下行定义输出文件'.data'和'.bss'区,链接器将安排'.data'输出区在地址0x8000000.链接器安排好'.data'输出区后,位置计数的值将是0x8000000加'.data'输出大小,作用就是链接器在内存中紧跟'.data'输出区安排'.bss'输出区.
    链接器确保每个输出区是对齐的,需要时通过增长位置计数.这个例子中指定'.text'和'.data'区地址将满足强制对齐,但是链接器可能会建立间隙在'.data'和'.bss'之间.
    到此为止,这就是一个简单而又完整的链接脚本.
 
Simple Linker Script Commands
=============================
 
    这部分中讲述简单的链接器脚本命令.
 
* Menu:
 
* Entry Point::                 设置入口点
* File Commands::               文件处理命令
* Format Commands::             目标文件格式命令
* Miscellaneous Commands::      其它链接命令
 
Setting the entry point
-----------------------
     程序执行的第一条指令称作'入口点'(entry point).你可以使用链接器脚本命令设置入口点,它的参数是符号名字:
     ENTRY(SYMBOL)
     有几种方式设置入口点,链接器按照顺序设置每个入口点,知道有一个成功:
     *'-e' ENTRY命令行选项
     *'ENTRY(SYMBOL)命令使用在脚本中
     *符号'start'地址,当然要预先定义'start'
     *'.text'区第一个字节地址
     *地址0
 
Commands dealing with files
---------------------------
    几个处理文件的脚本命令.
    'INCLUDE FILENAME':在当前位置包含进脚本文件FILENAME,在当前目录和'-L'指定目录搜索FILENAME,嵌套调用可达10层深度.
  
    `INPUT(FILE, FILE, ...)'
    `INPUT(FILE FILE ...)':输入命令促使链接器在链接时包含命名的文件,就像在命令行指定名字.
    例如,在链接时总是要包含'subr.o',但是有不愿每次链接时设置它,那么就可以在脚本中写'INPUT(subr.o)'.
    其实,如果个人喜欢,你可以在脚本中列出所有输入文件,每次调用链接器不带任何东西除了'-T'选项.
 
    链接器首先尝试打开当前目录下文件,如果没有找到,则链接器搜索库文件路径.查看'-L'描述在*Note Command Line Options: Options.
    如果使用'INPUT(lFILE)',ld将转换名字为'libFILE.a',类似命令行参数'-l'.
    当在隐含脚本文件使用'INPUT'命令,文件需要包含链接脚本也要包含,这可能影响档案文件所搜.
   
    `GROUP(FILE, FILE, ...)'
    `GROUP(FILE FILE ...)':这个命令类似'INPUT',但是所有命名文件完全是归档文件,它们被重复搜索直到不再有未定义的参考(references).请看'-('的描述在*Note Command Line Options: Options.
 
    `OUTPUT(FILENAME)':命名输出文件,使用`OUTPUT(FILENAME)'在脚本文件中和在命令行使用'-o FILENAME'完全相同.如果两者都使用,则命令行优先.
    你也可以使用'output'命令定义默认输出文件名,不同于通常使用的'a.out'.
   
    `SEARCH_DIR(PATH)':添加路径到ld所搜归档库的路径列表中.使用这个命令效果和命令行'-L PATH'完全相同,如果两者都使用链接器将都搜索,命令行指定的路径优先搜索.
    
   
    `STARTUP(FILENAME)':此命令类似'INPUT',除却文件变成第一个被链接的,就像在命令行首先指定,这在使用固定系统很有用,因为入口点永远在第一个文件的开始.

 

GNU链接器(LD):链接脚本分析——以stm32MP135 SoC链接脚本为例 GNU链接器(LD):链接脚本分析——以stm32MP135 SoC链接脚本为例。 阅读详情

相关推荐

GUN+ld中文使用手册

GUN+ld中文使用手册.pdf 非常详细的链接脚本教程

GNU链接脚本详解

每一个链接都是由链接脚本控制的,链接脚本是用链接命令语言编写的脚本。链接都会用到一个链接脚本,如果你没有指定自己的脚本,就会使用默认的链接脚本。可以用 "--verbose" 命令行选项显示默认的连接脚本。指定命令行参数,比如 '-r'、'-N'都会影响默认的链接脚本。也可以用 '-T' 来指定自己的链接脚本,也可以隐式地把自己的连接脚本当成链接输入文件,就像普通的链接文件一样,参见链接文件说明。如上图,链接器是将多个对象文件链接成可执行程序。链接器输入文件:目标文件或链接脚本文件;

私房菜 2029

GNU_LD_手册.pdf_GNU_ld手册_GNULD参考手册_

GNU LD 详细的参考手册,用户可以直接查看相关语法和特殊用法。

GNU ld 详解

GNU ld 命令就是链接器,用于将 *.o 文件链接到一起。执行以下操作: 1、重新分配地址(*.o文件中的地址都是相对地址,只有链接到一起才能确定最终的地址) 2、建立符号关联(例如,调用另外一个*.o文件的函数,是通过符号来查找的,具体不详述) ld 往往是编译工作的最后一个被调用的程序(一般流程: 编译预处理, 编译, 汇编, 链接, [optional] strip )

smfwuxiao的专栏 6097

Win32逆向必备:X32dbg中窗口句柄查看与消息断点的高级用法

本文深入探讨了X32dbg在Win32逆向工程中的高级应用,重点解析窗口句柄查看与消息断点的实战技巧。通过MFC程序逆向案例,详细介绍了如何利用窗口句柄层次结构、条件断点设置及消息映射表定位等技术,快速捕获关键业务逻辑,提升逆向分析效率。

nginx7reverse的博客 1017

Linux服务器 离线安装oracle

Linux服务器 离线安装oracle

xie_bro的博客 4259

GNU ld基本用法

1、什么是ld?它有什么作用? ld是GNU binutils工具集中的一个,是众多Linkers(链接器)的一种。完成的功能自然也就是链接器的基本功能:把各种目标文件和库文件链接起来,并重定向它们的数据,完成符号解析。Linking其实主要就是完成四个方面的工作:storage allocation、symbol management、libraries、relocation。 ld可以识别一...

qq_36412526的博客 3062

华为OD机试真题 - 矩阵匹配 牛客网

2024华为OD机试真题,代码包含语言java、js、python、c 代码基本都有详细注释。 题目描述 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式: N M K N*M矩阵 输出描述 N*M 的矩阵中可以选出 M! / N! 种组合数组,每个组合数组种第 K 大的数中的最小值。无需考虑重复数字,直接取字典排序结果即可。

2301_76543445的博客 498

GNU ld(链接器)的主要功能

intmain (int argc, char **argv) // 主程序入口#endif。

leimeili的博客 1206

保姆级教程:用GROMACS 2022.4的拉伸模拟(SMD)加速蛋白-蛋白组装过程

本文详细介绍了如何使用GROMACS 2022.4的拉伸分子动力学模拟(SMD)技术加速大蛋白组装过程。通过CHARMM36力场和SMD技术,将传统需要数月的蛋白结合过程缩短至数天,大幅提升模拟效率。文章包含参数设计、索引组创建、周期性边界处理等实战技巧,并提供了完整的GPU加速工作流和常见问题解决方案。

weixin_30338481的博客 446

常用元器件使用方法13:物理层接口芯片DP83848的使用方法

介绍: DP83848是以太网物理层接口芯片,具有多种型号,从便于焊接角度考虑LQFP-48封装较为合适,采用LQFP-48封装的芯片,有2种型号,分别为DP83848I和DP83848C,如下图所示。 其主要区别是使用温度不同,如下图所示。 这2种芯片芯片网上均有销售,按理说DP83848C价格应该更加便宜,实际不然,DP83848I的价格低于DP83848C,考虑或与芯片的出货量...

snmplink的博客 1万+

Linux 链接脚本详解

转载地址: http://hubingforever.blog.163.com/blog/static/171040579201192472552886/ 一、 概论 每一个链接过程都由链接脚本(linker script, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局.

6056

高级数据库--作业及答案

中科大金培权老师的高级数据库课程作业及答案

一杯水果茶!足矣~ 1658

GNU-ld链接脚本学习

weixin_44582175的博客 133

OGRE 3D----2. QGRE + QQuickView

将 OGRE(面向对象图形渲染引擎)集成到使用 QQuickView 的 Qt Quick 应用程序中,可以在现代灵活的 UI 框架中提供强大的 3D 渲染功能。本文将指导您如何在 QQuickView 环境中设置 OGRE。

charce_you的专栏 914

服务器搭建原神私服教程

项目的稳定版分支提供了编译好的服务端程序,但是博主觉得还是用dev版本的比较好。dev版本需要自己编译的,不要听到编译这两个字就头大,相反,这个服务端的编译相当简单。把文件中的两个IP地址127.0.0.1修改为你服务器的地址,修改完成后按 esc 输入 :wq。Mongodb作为服务端的数据库使用,我们这里安装最新版的Mongodb5。注意:如果想要使用最新版的服务端,必须安装>=17版本的java。tmux可以保证你关掉控制台的时候,程序依然继续运行。至此,服务端所需要的运行环境全部配置完成。

用最简单的方式说最重要的事!服务器、存储、云计 算、A智能的大数据产品、游戏开发技术。致力于广 大开发者、政企用户、各项机构等,构建云上世界提供全方位云计算解决方案。旨在打造差异化的开放式闭环生态系统帮助用户快速构建稳定、安全的云计算环境。 1万+

GNU/GCC链接脚本导学(其实你在用,但你也许并没注意到)

1. 哪些人可以不需要学GNU-ld链接脚本?    1)所有事务都交给编译器自动完成的,只需要写代码的    2)只使用商业性编译器    3)只使用avr,并且不需要实现复杂功能的 2. 哪些人可以考虑去学GNU-ld链接脚本?    1)希望比makefile更进一步控制程序的产生    2)希望在自己需要的存储地址上保存自己指定的数据    3)希望实现程序在存储空间中的模块化或特殊结构的

denniswuu的专栏 1856

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ld链接脚本与booter

ld链接脚本与booter      question:内核原文件里面extern了一堆变量:extern char _ftext, _etext, _fdata, _edata, _end;但是用source insight在内核的源码目录里面压根就找不到这些变量的定义。最初怀疑这些变量定义在汇编文件中,于是使用命令: grep _ftext `find ./ -name

WGS_007的专栏 1899

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

链接脚本学习

最近学习链接脚本,看了三本书《GNU-ld链接脚本浅析.pdf》、《GUN ld中文使用手册.pdf》和《链接器与加载器》。《链接器与加载器》这本书,内容太多就是大致浏览即可。再稍微仔细点看《GNU ld中文使用手册》内容比较多,不用特别仔细看,了解概念即可。再细读《GNU-ld链接脚本浅析.pdf》,内容少,精炼,对于初学者够用了。

hexiechina2010的专栏 822

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

GNU/GCC链接脚本导学

<br />学习前提: <br />    1)有winavr的使用经验 <br />    2)有x86汇编基础(要求会的指令不多,有记忆即可,忘了的随时上网搜) <br /><br /> 3. 我推荐的学习顺序: <br />    1)《程序的链接和装入及Linux下动态链接的实现》:http://www-128.ibm.com/developerworks/cn/linux/l-dynlink/ <br />      如果你对编译和链接过程有一定了解,也有反编译库文件、目标文件

689

The GNU linker

http://sourceware.org/binutils/docs/ld/ GNU-ld链接脚本浅析 http://blogold.chinaunix.net/u/13991/showart_177822.html [Linux命令] ld中文使用手册完全版(译) http://www.cnblogs.com/huqingyu/archive/2005/02/28/110468...

weixin_30869099的博客 236

【免费下载】 GNU-ld-V2.30中文手册

GNU-ld-V2.30中文手册 【下载地址】GNU-ld-V2.30中文手册 GNU-ld-V2.30中文手册欢迎来到GNU-LD V2.30中文手册页!这份详尽的文档是专为那些希望深入了解并掌握GNU链接器——GNU ld——强大功能的开发者准备的 ...

gitblog_06629的博客 791

GNU-ld链接脚本浅析

0. Contents 1. 概论 2. 基本概念 3. 脚本格式 4. 简单例子 5. 简单脚本命令 6. 对符号的赋值 7. SECTIONS命令 8. MEMORY命令 9. PHDRS命令 10. VERSION命令 11. 脚本内的表达式 12. 暗含的连接脚本 1. 概论 每一个链接过程都由链接脚本(linker script, 一般以l

古月居 1479

GNU ld 链接脚本(Linker Script)简介

表2. 指定目标文件格式的链接脚本命令命令格式意义备注输出文件的格式与命令行选项--oformat bfdname同义输出文件的格式与选项-EB -EL有关指定输入文件的BFD格式与命令行选项-b bfdname同义表示指定输出文件的格式默认为elf32-i386,如果使用链接选项-EB,则选择大端模式的输出格式elf32-i386,如果使用链接选项-EL,则选择小端模式的输出格式elf32-i386。这个例子中三个输出格式的名称是一样,当然也可以指定为不同的值。

3668
上一篇: 带版本号的符号 versioned symbol
下一篇: 绕过libsafe的保护--覆盖_dl_lookup_versioned_symbol技术
RunBoying
博客等级 码龄17年 41粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值