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!");
}