一、概述

      在编译程序过程中,最后都需要使用链接器(Linker)对各目标文件进行链接生成可执行文件。同时,我们还需要告诉编译器一些信息,比方说代码的起始地址、代码的存储地址(代码的存放位置和代码真正执行位置可以不一样),lds文件就是定义这些内容。

二、lds文件语法

SECTIONS{
   ...
   secname start ALIGN(align)(NOLOAD):AT(ldadr)
      {contents}>region:phdr = fill
   ...
}

       secname和contents是必须的,前者用来命名这个段,后者用来确定代码中的什么部分放在这个段,以下是这个描述中的一些关键字的解释。

             secname :段名

             start:是段的重定位地址,本段的运行地址

             contents :决定哪些内容放在本段,可以使整个目标文件,也可以是目标文件中的某段(代码段,数据段等)           

              AT(ldar):定义本段存储的加载地址

      特别说明:通过AT(ldar)选项可以控制各个分段分别保存于存储器的不同位置。默认情况下不使用AT(ldar)选项,加载地址等于运行地址。
      举例:
SECTIONS {
      first 0x00000000:{head.o init.o}
      second 0x30000000:AT(4096) {main.o}    
}

      编译后结果,head.o放在0x00000000地址开始处,init.o放在head.o后面他的运行地址也是0x00000000,即连接地址和存储地址 相同 (没有AT指定);main.o放在4096(0x1000是AT指定的存储地址)开始处,但运行地址在0x30000000。

      实际程序运行过程中,处理器将从 0x1000(4096)把mian.o对应的机器码部分复制到0x30000000,也就是把程序拷贝到相应位置,然后CPU跳转到0x30000000运行。

 

参考资料:[转]lds文件详解

posted on 2026-01-07 10:01  amanlikethis  阅读(18)  评论(0)    收藏  举报