GNU链接脚本(04) - 简要链接指令

原文:https://github.com/iDalink/ld-linker-script/tree/master/04%20%E7%AE%80%E8%A6%81%E9%93%BE%E6%8E%A5%E6%8C%87%E4%BB%A4

1、指定程序入口

        使用ENTRY指令指定程序入口。格式为如下。

ENTRY(symbol)

        其它指定入口方式如下。

  • 使用命令行-e 参数
  • 使用ENTRY(symbol)指令
  • 平台相关定义,众多平台为start
  • .text段的第一个字节
  • 地址零

二、包含其它链接脚本

INCLUDE filename

三、指定输入文件

INPUT (filenamefilename, ...)

INPUT (filename filename ...)

        如果指定INPUT (-lfile)形式时,ld会转化为lib*file*.a形式。

四、输出文件名

OUTPUT(filename)

        支持命令行-o 参数设置输出文件名。

五、设置二进制文件搜索路径

SEARCH_DIR(path)

六、设置首个输入文件

STARTUP(filename)

        设置文件为第一个输入文件,相当于在命令行指定文件为第一个参数。

七、 测试示例

        测试示例为该级目录下的01文件夹。linker script脚本如下。

ENTRY(main)
INPUT(tool.o tool_base.o)
STARTUP(app.o)
OUTPUT(app)

SECTIONS
{
  . = 0x400000;
  .text : { *(.text) }
  . = 0x8000000;
  .data : { *(.data) }
  . = 0xc000000;
  .bss : { *(.bss) }
}

八、指定输出文件格式

OUTPUT_FORMAT(bfdname) OUTPUT_FORMAT(default, big, little)

        OUTPUT_FORMAT命令指定输出文件的格式。其用法和命令行的中--oformat bfdname参数一致。

        可以通过objdump -i命令查看所有的bfd格式。本机的格式输出如下图。

BFD header file version (GNU Binutils for Debian) 2.28
elf64-x86-64
 (header little endian, data little endian)
  i386
elf32-i386
 (header little endian, data little endian)
  i386
elf32-iamcu
 (header little endian, data little endian)
  iamcu
elf32-x86-64
 (header little endian, data little endian)
  i386
a.out-i386-linux
 (header little endian, data little endian)
  i386
pei-i386
 (header little endian, data little endian)
  i386
pei-x86-64
 (header little endian, data little endian)
  i386
elf64-l1om
 (header little endian, data little endian)
  l1om
elf64-k1om
 (header little endian, data little endian)
  k1om
elf64-little
 (header little endian, data little endian)
  i386
  l1om
  k1om
  iamcu
  plugin
elf64-big
 (header big endian, data big endian)
  i386
  l1om
  k1om
  iamcu
  plugin
elf32-little
 (header little endian, data little endian)
  i386
  l1om
  k1om
  iamcu
  plugin
elf32-big
 (header big endian, data big endian)
  i386
  l1om
  k1om
  iamcu
  plugin
pe-x86-64
 (header little endian, data little endian)
  i386
pe-bigobj-x86-64
 (header little endian, data little endian)
  i386
pe-i386
 (header little endian, data little endian)
  i386
plugin
 (header little endian, data little endian)
srec
 (header endianness unknown, data endianness unknown)
  i386
  l1om
  k1om
  iamcu
  plugin
symbolsrec
 (header endianness unknown, data endianness unknown)
  i386
  l1om
  k1om
  iamcu
  plugin
verilog
 (header endianness unknown, data endianness unknown)
  i386
  l1om
  k1om
  iamcu
  plugin
tekhex
 (header endianness unknown, data endianness unknown)
  i386
  l1om
  k1om
  iamcu
  plugin
binary
 (header endianness unknown, data endianness unknown)
  i386
  l1om
  k1om
  iamcu
  plugin
ihex
 (header endianness unknown, data endianness unknown)
  i386
  l1om
  k1om
  iamcu
  plugin

         elf64-x86-64 elf32-i386 elf32-iamcu elf32-x86-64 a.out-i386-linux 
    i386 elf64-x86-64 elf32-i386 ----------- elf32-x86-64 a.out-i386-linux
    l1om ------------ ---------- ----------- ------------ ----------------
    k1om ------------ ---------- ----------- ------------ ----------------
   iamcu ------------ ---------- elf32-iamcu ------------ ----------------
  plugin ------------ ---------- ----------- ------------ ----------------

         pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big 
    i386 pei-i386 pei-x86-64 ---------- ---------- elf64-little elf64-big
    l1om -------- ---------- elf64-l1om ---------- elf64-little elf64-big
    k1om -------- ---------- ---------- elf64-k1om elf64-little elf64-big
   iamcu -------- ---------- ---------- ---------- elf64-little elf64-big
  plugin -------- ---------- ---------- ---------- elf64-little elf64-big

         elf32-little elf32-big pe-x86-64 pe-bigobj-x86-64 pe-i386 plugin srec 
    i386 elf32-little elf32-big pe-x86-64 pe-bigobj-x86-64 pe-i386 ------ srec
    l1om elf32-little elf32-big --------- ---------------- ------- ------ srec
    k1om elf32-little elf32-big --------- ---------------- ------- ------ srec
   iamcu elf32-little elf32-big --------- ---------------- ------- ------ srec
  plugin elf32-little elf32-big --------- ---------------- ------- ------ srec

         symbolsrec verilog tekhex binary ihex 
    i386 symbolsrec verilog tekhex binary ihex
    l1om symbolsrec verilog tekhex binary ihex
    k1om symbolsrec verilog tekhex binary ihex
   iamcu symbolsrec verilog tekhex binary ihex
  plugin symbolsrec verilog tekhex binary ihex

九、指定输入文件格式

TARGET(bfdname)

        该指令影响INPUTGROUP指令。等同于命令行-b bfdname参数。如果TARGET参数被使用,而OUTPUT_FORMAT参数未使用,则输出文件时指定为TARGET的最后一个参数。

十、存储别名

REGION_ALIAS(aliasregion)

        给存储单元*region*指定别名*alias*

MEMORY
  {
    RAM : ORIGIN = 0, LENGTH = 4M
  }

REGION_ALIAS("REGION_TEXT", RAM);
REGION_ALIAS("REGION_RODATA", RAM);
REGION_ALIAS("REGION_DATA", RAM);
REGION_ALIAS("REGION_BSS", RAM);

        上述例子中,RAM被指定REGION_TEXT、REGION_RODATA、REGION_DATA和REGION_BSS四个别名。

十一、断言

ASSERT(exp, message)

十二、声明外部符号

EXTERN(symbol symbol ...)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值