ld -verbose

在使用链接器的时候,没有指定脚本会使用默认脚本,通过该命令查看

通过 T 参数可以指定该脚本为链接器控制脚本

ld -T link.script

GCC 内联汇编

输入文件中的段称为输入段(Input Sections),输出文件中的段称为输出段(Output Sections)。控制链接过程无非是控制输入段如何变成输出段

一般链接脚本名都以 lds 作为扩展名

分为命令语句和赋值语句两种

  • ENTRY(symbol) 命令指定了程序的入口
  • STARTUP(filename) 将文件作为链接过程中的第一个输入文件 链接顺序
  • INPUT(file,...) 设定输入文件
  • SEARCH_DIR(path) 将路径 path 加入库查找目录
  • INCLUDE filename 将指定文件复制进来,相当于 C 中的 include
  • PEOVIDE(symbol) 在链接脚本中定义某个符号
  • 最复杂的命令: SECTIONS 指定各种输入段的变换,其中:

. = <address> 是赋值语句,设定当前虚拟地址(空格注意,下同)

<section> : {contents ...} 是段转化规则,即合并右侧输入段到左侧的输出段

/DISCARD/ : {contents} 是将所有满足条件的段丢弃,不保存在输出文件中

contents 规则:filename(sections)。section 若不写则表示该文件所有段符合条件,filename 用 * 表示通配,同理可以用正则表达式中的 ? [] 规则

ENTRY(nomain)
 
SECTIONS {
    . = 0x0804800 + SIZEOF_HEADERS;
 
    tinyText : {
        *(.text) *(.data) *(.rodata) *(.data.rel.local)
    }
 
    /DISCARD/ : {
        *(.comment) *(.eh_frame)
    }
}