lds文件学习笔记--实例讲解

本文详细介绍了链接脚本的使用,包括SECTIONS命令来定义输出段,ENTRY设置程序入口,INPUT指定链接输入文件,OUTPUT定义输出文件名,以及如何使用通配符和赋值操作。同时,讲解了链接器如何处理输入输出节的布局,并提供了示例进行说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官方文档:https://sourceware.org/binutils/docs-2.30/ld/index.html#SEC_Contents
下面通过链接脚本和实例进行讲解说明:

SECTIONS

SECTIONS {
  outputa 0x10000 :
    {
    all.o
    foo.o (.input1)
    }

  outputb :
    {
    foo.o (.input2)
    foo1.o (.input1)
    }

  outputc :
    {
    *(.input1)
    *(.input2)
    }
}

最简单的链接脚本可以只包含SECTIONS,其中outputa、outputb等都是输出文件中的sections的名称,其后跟随的中括号里面的内容是相应的输入部分。
这段代码告诉链接器读取all.o文件的所有部分,并将它们放置在输出文件的.outputa的开头,该部分的起始地址为0x10000。文件foo.o中的所有名为.input1的部分随即被放置在all.o内容的后面。
foo.o文件中.input2 sections的部分被放到输出文件的.outputb部分,其次是foo1.o文件中的.input1 sections。
*为通配符,匹配所有文件,将所有文件中的.input1和 .input2 sections都写到.outputc section。
由于.outputb和.outputc sections都没有定义起始地址,因此它们的内容紧跟在.outputa后面。

简单脚本命令

ENTRY

ENTRY(__start)

设置程序运行的第一条指令所在的位置,此处为__start。
INPUT

INPUT(file, file,)

设置每次链接时都要用到的文件,相当于-l file。若设为INPUT(-lfile),则会被转化为-libfile.a。
OUTPUT

OUTPUT(filename)

设置输出文件的名称,相当于 -o filename
INCLUDE

INCLUDE filename

设置链接脚本,这个文件会从当前文件夹中被搜索,或者从-L选项后面的文件夹下搜索。
SEARCH_DIR

SEARCH_DIR(path)

设置搜索归档库的路径,相当于 -L path

赋值

简单赋值

symbol = expression ;
symbol += expression ;
symbol -= expression ;
symbol *= expression ;
symbol /= expression ;
symbol <<= expression ;
symbol >>= expression ;
symbol &= expression ;
symbol |= expression ;

symbol必须是已定义的,其中.是一种特殊的符号,表示地址,只能在SECTIONS里面使用,expression同c语言。
PROVIDE
用于定义被引用但未定义的符号

PROVIDE(symbol = expression);

当symbol已被定义时,使用该已有定义;若symbol未被定义且被引用,则使用PROVIDE中的定义。

定义在高级语言中的symbol和定义在链接脚本中的symbol不同,前者在内存中存储,而后者只有地址,而没有具体的被分配的内存和value,因此高级语言访问脚本symbol时,只能涉及地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值