f83288645c
Fix boot1 and loader on PowerPC64 little-endian (LE). Due to endian issues, boot1 couldn't find the UFS boot partition and loader wasn't able to load the kernel. Most of the issues happened because boot1 and loader were BE binaries trying to access LE UFS partitions and because loader expects the kernel ELF image to use the same endian as itself. To fix these issues, boot1 and loader are now built as LE binaries on PPC64LE. To support this, the functions that call OpenFirmware were enhanced to correctly perform endian conversion on its input and output arguments and to change the CPU into BE mode before making the calls, as OpenFirmware always runs in BE. Besides that, some other small fixes were needed. Submitted by: bdragon (initial version) Reviewed by: alfredo, jhibbits Sponsored by: Instituto de Pesquisas Eldorado (eldorado.org.br) Differential Revision: https://reviews.freebsd.org/D32160
143 lines
4.4 KiB
Plaintext
143 lines
4.4 KiB
Plaintext
/* $FreeBSD$ */
|
|
|
|
OUTPUT_FORMAT("elf32-powerpcle-freebsd", "elf32-powerpcle-freebsd",
|
|
"elf32-powerpcle-freebsd")
|
|
OUTPUT_ARCH(powerpcle:common)
|
|
ENTRY(_start)
|
|
SEARCH_DIR(/usr/lib);
|
|
PROVIDE (__stack = 0);
|
|
PHDRS
|
|
{
|
|
text PT_LOAD;
|
|
}
|
|
SECTIONS
|
|
{
|
|
/* Read-only sections, merged into text segment: */
|
|
. = 0x02c00000 + SIZEOF_HEADERS;
|
|
.interp : { *(.interp) } :text
|
|
.hash : { *(.hash) }
|
|
.dynsym : { *(.dynsym) }
|
|
.dynstr : { *(.dynstr) }
|
|
.gnu.version : { *(.gnu.version) }
|
|
.gnu.version_d : { *(.gnu.version_d) }
|
|
.gnu.version_r : { *(.gnu.version_r) }
|
|
.rela.text :
|
|
{ *(.rela.text) *(.rela.gnu.linkonce.t*) }
|
|
.rela.data :
|
|
{ *(.rela.data) *(.rela.gnu.linkonce.d*) }
|
|
.rela.rodata :
|
|
{ *(.rela.rodata) *(.rela.gnu.linkonce.r*) }
|
|
.rela.got : { *(.rela.got) }
|
|
.rela.got1 : { *(.rela.got1) }
|
|
.rela.got2 : { *(.rela.got2) }
|
|
.rela.ctors : { *(.rela.ctors) }
|
|
.rela.dtors : { *(.rela.dtors) }
|
|
.rela.init : { *(.rela.init) }
|
|
.rela.fini : { *(.rela.fini) }
|
|
.rela.bss : { *(.rela.bss) }
|
|
.rela.plt : { *(.rela.plt) }
|
|
.rela.sdata : { *(.rela.sdata) }
|
|
.rela.sbss : { *(.rela.sbss) }
|
|
.rela.sdata2 : { *(.rela.sdata2) }
|
|
.rela.sbss2 : { *(.rela.sbss2) }
|
|
.text :
|
|
{
|
|
*(.text)
|
|
/* .gnu.warning sections are handled specially by elf32.em. */
|
|
*(.gnu.warning)
|
|
*(.gnu.linkonce.t*)
|
|
} =0
|
|
_etext = .;
|
|
PROVIDE (etext = .);
|
|
.init : { *(.init) } =0
|
|
.fini : { *(.fini) } =0
|
|
.rodata : { *(.rodata) *(.gnu.linkonce.r*) }
|
|
.rodata1 : { *(.rodata1) }
|
|
.sdata2 : { *(.sdata2) }
|
|
.sbss2 : { *(.sbss2) }
|
|
/* Adjust the address for the data segment to the next page up. */
|
|
. = ((. + 0x1000) & ~(0x1000 - 1));
|
|
.data :
|
|
{
|
|
*(.data)
|
|
*(.gnu.linkonce.d*)
|
|
CONSTRUCTORS
|
|
}
|
|
.data1 : { *(.data1) }
|
|
.got1 : { *(.got1) }
|
|
.dynamic : { *(.dynamic) }
|
|
/* Put .ctors and .dtors next to the .got2 section, so that the pointers
|
|
get relocated with -mrelocatable. Also put in the .fixup pointers.
|
|
The current compiler no longer needs this, but keep it around for 2.7.2 */
|
|
PROVIDE (_GOT2_START_ = .);
|
|
.got2 : { *(.got2) }
|
|
PROVIDE (__CTOR_LIST__ = .);
|
|
.ctors : { *(.ctors) }
|
|
PROVIDE (__CTOR_END__ = .);
|
|
PROVIDE (__DTOR_LIST__ = .);
|
|
.dtors : { *(.dtors) }
|
|
PROVIDE (__DTOR_END__ = .);
|
|
PROVIDE (_FIXUP_START_ = .);
|
|
.fixup : { *(.fixup) }
|
|
PROVIDE (_FIXUP_END_ = .);
|
|
PROVIDE (_GOT2_END_ = .);
|
|
PROVIDE (_GOT_START_ = .);
|
|
.got : { *(.got) }
|
|
.got.plt : { *(.got.plt) }
|
|
PROVIDE (_GOT_END_ = .);
|
|
/* We want the small data sections together, so single-instruction offsets
|
|
can access them all, and initialized data all before uninitialized, so
|
|
we can shorten the on-disk segment size. */
|
|
.sdata : { *(.sdata) }
|
|
_edata = .;
|
|
PROVIDE (edata = .);
|
|
.sbss :
|
|
{
|
|
PROVIDE (__sbss_start = .);
|
|
*(.sbss)
|
|
*(.scommon)
|
|
*(.dynsbss)
|
|
PROVIDE (__sbss_end = .);
|
|
}
|
|
.plt : { *(.plt) }
|
|
.bss :
|
|
{
|
|
PROVIDE (__bss_start = .);
|
|
*(.dynbss)
|
|
*(.bss)
|
|
*(COMMON)
|
|
}
|
|
_end = . ;
|
|
PROVIDE (end = .);
|
|
/* Stabs debugging sections. */
|
|
.stab 0 : { *(.stab) }
|
|
.stabstr 0 : { *(.stabstr) }
|
|
/* DWARF debug sections.
|
|
Symbols in the DWARF debugging sections are relative to the beginning
|
|
of the section so we begin them at 0. */
|
|
/* DWARF 1 */
|
|
.debug 0 : { *(.debug) }
|
|
.line 0 : { *(.line) }
|
|
/* GNU DWARF 1 extensions */
|
|
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
/* DWARF 1.1 and DWARF 2 */
|
|
.debug_aranges 0 : { *(.debug_aranges) }
|
|
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
/* DWARF 2 */
|
|
.debug_info 0 : { *(.debug_info) }
|
|
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
.debug_line 0 : { *(.debug_line) }
|
|
.debug_frame 0 : { *(.debug_frame) }
|
|
.debug_str 0 : { *(.debug_str) }
|
|
.debug_loc 0 : { *(.debug_loc) }
|
|
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
/* SGI/MIPS DWARF 2 extensions */
|
|
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
.debug_typenames 0 : { *(.debug_typenames) }
|
|
.debug_varnames 0 : { *(.debug_varnames) }
|
|
/* These must appear regardless of . */
|
|
}
|
|
|