PMON链接脚本ld.script分析

1.首先我们是通过make tgt=rom CROSS_COMPILE=mips-wrs-linux-gnu- DEBUG=-g来编译的,所以实际上主要调用如下编译命令:

ejtag_rom ejtag_rom1 ejtag_ram rom: clean ${START} zloader.o 
gcc  -DSTARTADDR=${GZROMSTARTADDR} -DOUT_FORMAT=\"${OUT_FORMAT}\" -DOUT_ARCH=mips -Umips -E -P ld.script.S  > ld.script
${LD} -T ld.script -e start -o gzrom ${START} zloader.o 
${CROSS_COMPILE}objcopy -O binary gzrom gzrom.bin

依赖为 clean ${START} zloader.o

<1>通过 gcc -DSTARTADDR=${GZROMSTARTADDR} -DOUT_FORMAT=\"${OUT_FORMAT}\" -DOUT_ARCH=mips -Umips -E -P ld.script.S  > ld.script

将ld.scripts.S编译生成ld.script

<2>通过${LD} -T ld.script -e start -o gzrom ${START} zloader.o

 将${START} zloader.o 以ld.script脚本链接成gzrom,入口地址为start的地址

<3>通过${CROSS_COMPILE}objcopy -O binary gzrom gzrom.bin

将elf格式的gzrom转换成bin格式的gzrom.bin



2.ld.script链接脚本内容如下:

OUTPUT_FORMAT("elf32-tradlittlemips", "elf32-tradbigmips",  //设置输出文件格式,若有命令行选项-EB, 则使用第2 个BFD 格式; 若有命令行选项-EL,则使用第3 个BFD 格式.否则默认选
                                                                                                                    第一个BFD 格式

              "elf32-tradlittlemips")
OUTPUT_ARCH(mips)   // 设置输出文件架构                           
ENTRY(_start)   //入口地址_start,不过会被-e start 覆盖


SECTIONS
{


  . = 0xffffffff81000000;   //定位器符号设置为0x81000000,为兼容64位写成0xffffffff81000000形式
  .text :
  {
    _ftext = . ;
    *(.text)
    *(.rodata)
    *(.rodata1)
    *(.reginfo)
    *(.init)
    *(.stub)


    *(.gnu.warning)
  } =0     //.text代码段-----由所有目标文件的.text .rodata .rodata1.....stub .gun.warning依次组成,空隙由0填充
  _etext = .;
  PROVIDE (etext = .);         //输出etext的地址-------当目标文件内引用了etext 符号,却没有定义它时,etext 符号对应的地址被定义为.text section 之后的第一
                                                个字节的地址。

  .fini : { *(.fini) } =0


 . = . + 0x20000000;


  .data : AT(ADDR(.data)-0x20000000)  //.data数据段的VMA (运行地址) 是当前定位器符号的地址,而LMA(加载地址)是    .-0x20000000
  {
    _fdata = . ;
    *(.data)
   . = ALIGN(32);
   *(.data.align32)
   . = ALIGN(64);
   *(.data.align64)
   . = ALIGN(128);
   *(.data.align128)
   . = ALIGN(4096);
   *(.data.align4096)
    CONSTRUCTORS
    *(.data1)
                __CTOR_LIST__ = .;
                LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
               *(.ctors)
                LONG(0)
                __CTOR_END__ = .;
                __DTOR_LIST__ = .;
                LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
               *(.dtors)
                LONG(0)
                __DTOR_END__ = .;
  _gp = ALIGN(16) + 0x7ff0;
    *(.got.plt) *(.got)






  *(.sdata)
   *(.lit8)
   *(.lit4)
  _edata = . - 0x20000000;
  PROVIDE (edata = .);//输出符号edata地址
  __bss_start = .;
  _fbss = .;
   *(.sbss) *(.scommon)
   *(.dynbss)
   *(.bss)
   . = ALIGN(32);
   *(.bss.align32)
   . = ALIGN(64);
   *(.bss.align64)
   . = ALIGN(128);
   *(.bss.align128)
   . = ALIGN(4096);
   *(.bss.align4096)
   *(COMMON)
 }
  _end = . - 0x20000000;
  PROVIDE (end = .);//输出符号end




  .stab 0 : { *(.stab) }
  .stabstr 0 : { *(.stabstr) }








  .debug 0 : { *(.debug) }
  .debug_srcinfo 0 : { *(.debug_srcinfo) }
  .debug_aranges 0 : { *(.debug_aranges) }
  .debug_pubnames 0 : { *(.debug_pubnames) }
  .debug_sfnames 0 : { *(.debug_sfnames) } //跟调试有关的段
  .line 0 : { *(.line) }


  .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
  .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值