我试图了解uboot的移植是如何在基于powerpc的mpc8313处理器板上完成的。在此过程中,我遇到了名为uboot.lds的文件,即链接器脚本文件。
我需要了解这份文件。我指的是上述内容的重要性,以及在uboot包中定义实际地址的位置。
例如,在部分中,我可以找到以下信息的重要性:
/* Read-only sections, merged into text segment: */
. = + SIZEOF_HEADERS;
.interp : { *(.interp) }
.hash : { *(.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.rel.text : { *(.rel.text) }
.rela.text : { *(.rela.text) }
.rel.data : { *(.rel.data) }
.rela.data : { *(.rela.data) }
.rel.rodata : { *(.rel.rodata) }
.rela.rodata : { *(.rela.rodata) }
.rel.got : { *(.rel.got) }
.rela.got : { *(.rela.got) }
.rel.ctors : { *(.rel.ctors) }
.rela.ctors : { *(.rela.ctors) }
.rel.dtors : { *(.rel.dtors) }
.rela.dtors : { *(.rela.dtors) }
.rel.bss : { *(.rel.bss) }
.rela.bss : { *(.rela.bss) }
.rel.plt : { *(.rel.plt) }
.rela.plt : { *(.rela.plt) }
.init : { *(.init) }
.plt : { *(.plt) }
.text :
{
cpu/mpc83xx/start.o (.text)
*(.text)
*(.fixup)
*(.got1)
. = ALIGN(16);
*(.rodata)
*(.rodata1)
*(.rodata.str1.4)
*(.eh_frame)
}
.fini : { *(.fini) } =0
.ctors : { *(.ctors) }
.dtors : { *(.dtors) }
/* Read-write section, merged into data segment: */
. = (. + 0x0FFF) & 0xFFFFF000;
_erotext = .;
PROVIDE (erotext = .);
.reloc :
{
*(.got)
_GOT2_TABLE_ = .;
*(.got2)
_FIXUP_TABLE_ = .;
*(.fixup)
}
__got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2;
__fixup_entries = (. - _FIXUP_TABLE_) >> 2;
.data :
{
*(.data)
*(.data1)
*(.sdata)
*(.sdata2)
*(.dynamic)
CONSTRUCTORS
}
_edata = .;
PROVIDE (edata = .);
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = .;
__start___ex_table = .;
__ex_table : { *(__ex_table) }
__stop___ex_table = .;
. = ALIGN(4096);
__init_begin = .;
.text.init : { *(.text.init) }
.data.init : { *(.data.init) }
. = ALIGN(4096);
__init_end = .;
__bss_start = .;
.bss :
{
*(.sbss) *(.scommon)
*(.dynbss)
*(.bss)
*(COMMON)
}
_end = . ;
PROVIDE (end = .);
}在哪里查找这些信息,以及如何识别lds文件中要做的更改?
请确认或至少给出一些提示来阅读这些信息,谢谢
雷吉斯湾
发布于 2011-06-23 21:28:34
要移植u-boot,很可能可以从cpu目录而不是板目录中使用u-boot.ld。换句话说,可能没有必要移植这个文件。然而,如果有,那么这里是一个概述。
您可以在LD documentation中找到许多信息。
通常,LD脚本允许您在运行时重写GCC工具链在内存中放置的默认位置。编译应用程序时,将处理源代码并创建包含机器代码的目标代码文件。在将各种对象文件链接到一个文件中时,例如ELF可执行文件,并在文件上放置一个头,以告诉操作系统每个对象文件应该放在内存中的位置,以便在需要时可以找到它(全局文件、函数调用等)。
如果您想将代码放在一个您不能期望编译器/链接器猜测的特定位置,则需要一个自定义脚本。这样做有很多原因,因为我会尝试列出。
<>H 110对ISR代码向量<>H 211<代码>G 212/代码>相同的位置执行。
此外,它还可以在链接时方便地访问内存指针。例如,__init_begin被定义为将任何代码的内存地址编译为*.text.init的符号。现在,您可以通过将程序计数器设置为__init_begin的值来调用该内存,而无需配置完整的C环境。
编译器文档+u引导Makefiles应该解释编译器如何以及何时生成每种类型的对象文件(例如。.txt,.data,.bss,.fini,.ctors等)
https://stackoverflow.com/questions/4375908
复制相似问题