2015-04-13 14:43:10 +00:00
|
|
|
OUTPUT_ARCH(aarch64)
|
|
|
|
ENTRY(_start)
|
|
|
|
|
|
|
|
SEARCH_DIR(/usr/lib);
|
|
|
|
SECTIONS
|
|
|
|
{
|
|
|
|
/* Read-only sections, merged into text segment: */
|
Eliminate the generated ldscript for arm and arm64, and strip $a/$d marker
symbols from the linked kernel.
The main thrust of this change is to generate a kernel that has the arm
"marker" symbols stripped. Marker symbols start with $a, $d, $t or $x, and
are emitted by the compiler to tell other toolchain components about the
locations of data embedded in the instruction stream (literal-pool
stuff). They are used for generating mixed-endian binaries (which we don't
support). The linked kernel has approximately 21,000 such symbols in it,
wasting space (500K in kernel.full, 190K in the final linked kernel), and
sometimes obscuring function names in stack tracebacks.
This change also simplifies the way the kernel is linked. Instead of using
sed to generate two different ldscript files to generate both an elf kernel
and a binary (elf headers stripped) kernel, we now use a single ldscript
that refers to a "text_start" symbol, and we provide the value for that
symbol using --defsym on the linker command line.
2019-12-29 18:17:12 +00:00
|
|
|
. = text_start; /* This is set using --defsym= on the command line. */
|
2015-04-13 14:43:10 +00:00
|
|
|
.text :
|
|
|
|
{
|
|
|
|
*(.text)
|
|
|
|
*(.stub)
|
|
|
|
/* .gnu.warning sections are handled specially by elf32.em. */
|
|
|
|
*(.gnu.warning)
|
|
|
|
*(.gnu.linkonce.t*)
|
|
|
|
} =0x9090
|
|
|
|
_etext = .;
|
|
|
|
PROVIDE (etext = .);
|
|
|
|
.fini : { *(.fini) } =0x9090
|
2016-09-03 17:23:24 +00:00
|
|
|
.rodata : { *(.rodata*) *(.gnu.linkonce.r*) }
|
2015-04-13 14:43:10 +00:00
|
|
|
.rodata1 : { *(.rodata1) }
|
|
|
|
.interp : { *(.interp) }
|
|
|
|
.hash : { *(.hash) }
|
|
|
|
.dynsym : { *(.dynsym) }
|
|
|
|
.dynstr : { *(.dynstr) }
|
|
|
|
.gnu.version : { *(.gnu.version) }
|
|
|
|
.gnu.version_d : { *(.gnu.version_d) }
|
|
|
|
.gnu.version_r : { *(.gnu.version_r) }
|
2019-06-04 13:07:10 +00:00
|
|
|
.note.gnu.build-id : {
|
|
|
|
PROVIDE (__build_id_start = .);
|
|
|
|
*(.note.gnu.build-id)
|
|
|
|
PROVIDE (__build_id_end = .);
|
|
|
|
}
|
2015-04-13 14:43:10 +00:00
|
|
|
.rel.text :
|
|
|
|
{ *(.rel.text) *(.rel.gnu.linkonce.t*) }
|
|
|
|
.rela.text :
|
|
|
|
{ *(.rela.text) *(.rela.gnu.linkonce.t*) }
|
|
|
|
.rel.data :
|
|
|
|
{ *(.rel.data) *(.rel.gnu.linkonce.d*) }
|
|
|
|
.rela.data :
|
|
|
|
{ *(.rela.data) *(.rela.gnu.linkonce.d*) }
|
|
|
|
.rel.rodata :
|
|
|
|
{ *(.rel.rodata) *(.rel.gnu.linkonce.r*) }
|
|
|
|
.rela.rodata :
|
|
|
|
{ *(.rela.rodata) *(.rela.gnu.linkonce.r*) }
|
|
|
|
.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.init : { *(.rel.init) }
|
|
|
|
.rela.init : { *(.rela.init) }
|
|
|
|
.rel.fini : { *(.rel.fini) }
|
|
|
|
.rela.fini : { *(.rela.fini) }
|
|
|
|
.rel.bss : { *(.rel.bss) }
|
|
|
|
.rela.bss : { *(.rela.bss) }
|
|
|
|
.rel.plt : { *(.rel.plt) }
|
|
|
|
.rela.plt : { *(.rela.plt) }
|
|
|
|
.init : { *(.init) } =0x9090
|
|
|
|
.plt : { *(.plt) }
|
|
|
|
|
|
|
|
. = ALIGN(4);
|
|
|
|
_extab_start = .;
|
|
|
|
PROVIDE(extab_start = .);
|
|
|
|
.ARM.extab : { *(.ARM.extab) }
|
|
|
|
_extab.end = .;
|
|
|
|
PROVIDE(extab_end = .);
|
|
|
|
|
|
|
|
_exidx_start = .;
|
|
|
|
PROVIDE(exidx_start = .);
|
|
|
|
.ARM.exidx : { *(.ARM.exidx) }
|
|
|
|
_exidx_end = .;
|
|
|
|
PROVIDE(exidx_end = .);
|
|
|
|
|
|
|
|
/* Adjust the address for the data segment. We want to adjust up to
|
|
|
|
the same address within the page on the next page up. */
|
|
|
|
. = ALIGN(0x1000) + (. & (0x1000 - 1)) ;
|
|
|
|
.data :
|
|
|
|
{
|
|
|
|
*(.data)
|
|
|
|
*(.gnu.linkonce.d*)
|
|
|
|
}
|
2021-08-23 09:44:23 +00:00
|
|
|
. = ALIGN(128);
|
|
|
|
.data.read_frequently :
|
|
|
|
{
|
|
|
|
*(SORT_BY_ALIGNMENT(.data.read_frequently))
|
|
|
|
}
|
|
|
|
.data.read_mostly :
|
|
|
|
{
|
|
|
|
*(.data.read_mostly)
|
|
|
|
}
|
|
|
|
. = ALIGN(128);
|
|
|
|
.data.exclusive_cache_line :
|
|
|
|
{
|
|
|
|
*(.data.exclusive_cache_line)
|
|
|
|
}
|
|
|
|
. = ALIGN(128);
|
2015-04-13 14:43:10 +00:00
|
|
|
.data1 : { *(.data1) }
|
|
|
|
. = ALIGN(32 / 8);
|
|
|
|
_start_ctors = .;
|
|
|
|
PROVIDE (start_ctors = .);
|
|
|
|
.ctors :
|
|
|
|
{
|
|
|
|
*(.ctors)
|
|
|
|
}
|
|
|
|
_stop_ctors = .;
|
|
|
|
PROVIDE (stop_ctors = .);
|
|
|
|
.dtors :
|
|
|
|
{
|
|
|
|
*(.dtors)
|
|
|
|
}
|
|
|
|
.got : { *(.got.plt) *(.got) }
|
|
|
|
.dynamic : { *(.dynamic) }
|
|
|
|
/* 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. */
|
|
|
|
. = ALIGN(8);
|
|
|
|
.sdata : { *(.sdata) }
|
|
|
|
_edata = .;
|
|
|
|
PROVIDE (edata = .);
|
|
|
|
__bss_start = .;
|
|
|
|
.sbss : { *(.sbss) *(.scommon) }
|
|
|
|
.bss :
|
|
|
|
{
|
|
|
|
*(.dynbss)
|
|
|
|
*(.bss)
|
|
|
|
*(COMMON)
|
2020-12-23 08:05:21 +00:00
|
|
|
. = ALIGN(8);
|
|
|
|
__bss_end = .;
|
|
|
|
/* A section for the initial page table, it doesn't need to be in the
|
|
|
|
kernel file, however unlike normal .bss entries should not be zeroed
|
|
|
|
out as we use it before the .bss section is cleared. */
|
|
|
|
*(.init_pagetable)
|
2015-04-13 14:43:10 +00:00
|
|
|
}
|
|
|
|
_end = . ;
|
|
|
|
PROVIDE (end = .);
|
|
|
|
/* Stabs debugging sections. */
|
|
|
|
.stab 0 : { *(.stab) }
|
|
|
|
.stabstr 0 : { *(.stabstr) }
|
|
|
|
.stab.excl 0 : { *(.stab.excl) }
|
|
|
|
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
|
|
.stab.index 0 : { *(.stab.index) }
|
|
|
|
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
|
|
.comment 0 : { *(.comment) }
|
|
|
|
/* 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 . */
|
|
|
|
}
|