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) }
}