20ae0afeac
Before this change, LLD10 was creating several extra PT_LOAD sections, which OFW does not understand. Like we do for the kernel already, specify the program headers manually. Additionally, to work around a crash in our base ld.bfd, we need to actually assign something to the output section. LLD does not need this. One side effect of this change is the removal of the GNU_STACK header. This is more correct, since we are using a statically-allocated stack and RWX mappings across the board this early in boot. Reviewed by: jhibbits, Fangrui Song <i@maskray.me> Sponsored by: Tag1 Consulting, Inc. Differential Revision: https://reviews.freebsd.org/D23778
143 lines
4.4 KiB
Plaintext
143 lines
4.4 KiB
Plaintext
/* $FreeBSD$ */
|
|
|
|
OUTPUT_FORMAT("elf32-powerpc-freebsd", "elf32-powerpc-freebsd",
|
|
"elf32-powerpc-freebsd")
|
|
OUTPUT_ARCH(powerpc: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 . */
|
|
}
|
|
|