9

我试图了解如何在基于 powerpc mpc8313 处理器的板上完成 uboot 的移植。在此过程中,我遇到了名为 uboot.lds 的文件,即链接描述文件。

我需要理解这个文件。我的意思是提到的内容的重要性以及实际地址在uboot包中定义的位置。

例如; 在 SECTIONS 中,我可以找到以下信息的重要性:

/* 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 文件中进行的更改?

请确认或至少给出一些阅读信息的指示,谢谢

Regads,维杰

4

1 回答 1

17

要移植 u-boot,u-boot.lds 可能可以从 cpu 目录使用,而不是 board 目录。换句话说,可能不需要移植这个文件。但是,如果有那么这里是一个概述。

您可以在LD 文档中找到大量信息。

通常,LD 脚本允许您做的是覆盖 GCC 工具链在运行时将内容放置在内存中的默认位置。编译应用程序时,会处理源代码并创建包含机器代码的目标代码文件。在链接过程中,各种目标文件被合并到一个文件中,例如 ELF 可执行文件,并在文件上放置一个标头以告诉操作系统每个目标文件应该放在内存中的哪个位置,以便在需要时可以找到它(全局、函数来电等)

如果您想将代码放置在您无法期望编译器/链接器猜测的特定位置,则需要自定义脚本。这样做的原因有很多,我将尝试列出。

  1. 如果 RAM 是稀疏的,常量可以放在只读存储器中
  2. 如果可用,可能需要将频繁访问的内存放置在更快的 RAM 中
  3. 有些数据可能需要在某个边界上对齐,比如64K
  4. 一些代码 (.TEXT) 应放置在复位向量中,以便在复位时执行
  5. ISR 代码向量也一样

除此之外,它还可以成为一种在链接时方便地访问内存指针的方法。例如,__init_begin 被定义为具有编译为 *.text.init 的任何代码的内存地址的符号。您现在可以通过将程序计数器设置为 __init_begin 的值来调用该内存,而无需配置完整的 C 环境。

编译器文档 + u-boot Makefiles 应该解释编译器如何以及何时生成每种类型的目标文件(例如 .txt、.data、.bss、.fini、.ctors 等)

于 2011-06-23T21:28:34.920 回答