内核文件分析---II---setup.ld的分析

ld文件简介:

   用来控制ld的链接过程:1:描述输入文件的各节如何映射到输出文件的各节  2:控制输出文件的各节和符号的内存布局.

   ld命令若不执行链接文件(-T选项),则会使用默认的链接文件.  

   除了下面使用的命令还有 MEMORY 命令等,碰到再说.

  每个对象文件有一个节(段)列表,还有一个符号列表,一个符号可以是"已定义"(defined)或"无定义"(undefined)的。每个符号有名字,并且每个定义了的符号还有地址。在你编译一个 c/c++程序成对象文件时,每个定义的函数,全局变量,静态变量,都可以有一个"已定义"的符号。输入文件中引用的每个没有定义的函数和全局变量则变成"无定义"的符号

/*
 * setup.ld
 *
 * Linker script for the i386 setup code  
 */
OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")    //指定输出文件的格式
OUTPUT_ARCH(i386)        //指定目标体系结构
ENTRY(_start)     //设置入口点,依次为 ld命令的-e选项,Entry(symbol)指定的值, .text节的起始地址 ,0

SECTIONS   //告诉ld如何把输入文件的节映射到输出文件的节中,每个ld文件中只能有一个. 3种功能:定义入口点,赋值,定义输出节.
{
 . = 0;           //  . 表定位计数器
 .bstext  : { *(.bstext) }  //输出节.bstext 来自于 所有文件的所有 .bstext 节 ,*表所有文件,(.bstext)表所有的.bstext节
 .bsdata  : { *(.bsdata) }

 . = 497;     //以下的解从497byte位置开始了(使得512?)

 .header  : { *(.header) }
 .entrytext : { *(.entrytext) }
 .inittext : { *(.inittext) }
 .initdata : { *(.initdata) }
 __end_init = .;   //用变量__end_init 保存当前位置

 .text  : { *(.text) }
 .text32  : { *(.text32) }

 . = ALIGN(16);  //以下数据按16位对齐
 .rodata  : { *(.rodata*) }

 .videocards : {
  video_cards = .;
  *(.videocards)
  video_cards_end = .;
 }

 . = ALIGN(16);
 .data  : { *(.data*) }

 .signature : {
  setup_sig = .;      //  setup_sig 保存位置
  LONG(0x5a5aaa55) //0x5a5aaa55转换成二进制就是0101101001011010.....,用于验证setup是否加载成功
 }


 . = ALIGN(16);
 .bss  :
 {
  __bss_start = .;   //保存了bss段的开始和结束
  *(.bss)
  __bss_end = .;
 }
 . = ALIGN(16);
 _end = .;      

 /DISCARD/ : { *(.note*) }

 . = ASSERT(_end <= 0x8000, "Setup too big!");
 . = ASSERT(hdr == 0x1f1, "The setup header has the wrong offset!");
 /* Necessary for the very-old-loader check to work... */
 . = ASSERT(__end_init <= 5*512, "init sections too big!");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值