aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/ds
diff options
context:
space:
mode:
authorTony Puccinelli2010-07-21 08:50:30 +0000
committerTony Puccinelli2010-07-21 08:50:30 +0000
commitda414e62b8b61bb661bbf62517c8d249574732e2 (patch)
treec8025e1d996a207bfaf85d6cd8e63581ca7464fc /backends/platform/ds
parent3d3e4e6c397a58d21dbc3be7fbe0c0173f193644 (diff)
downloadscummvm-rg350-da414e62b8b61bb661bbf62517c8d249574732e2.tar.gz
scummvm-rg350-da414e62b8b61bb661bbf62517c8d249574732e2.tar.bz2
scummvm-rg350-da414e62b8b61bb661bbf62517c8d249574732e2.zip
switched out linker script for plugin linking on ds, added in check for RELA type relocations in ARM loader and coded for REL type relocations (DS now runs many games with Dynamic Plugins enabled)
svn-id: r51083
Diffstat (limited to 'backends/platform/ds')
-rw-r--r--backends/platform/ds/arm9/makefile2
-rw-r--r--backends/platform/ds/arm9/source/dsloader.cpp69
-rw-r--r--backends/platform/ds/arm9/source/elf32.h9
-rw-r--r--backends/platform/ds/arm9/source/plugin.ld438
4 files changed, 216 insertions, 302 deletions
diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile
index 706cf6549f..3d784f06aa 100644
--- a/backends/platform/ds/arm9/makefile
+++ b/backends/platform/ds/arm9/makefile
@@ -279,7 +279,7 @@ EXECUTABLE = scummvm.elf
PLUGIN_PREFIX =
PLUGIN_SUFFIX = .plg
PLUGIN_EXTRA_DEPS = $(portdir)/source/plugin.ld $(portdir)/source/plugin.syms $(EXECUTABLE)
-PLUGIN_LDFLAGS += -mno-crt0 $(DEVKITPRO)/devkitARM/arm-eabi/lib/ds_arm9_crt0.o -nostartfiles -Wl,-q,--just-symbols,$(EXECUTABLE),-T$(portdir)/source/plugin.ld,--retain-symbols-file,$(portdir)/source/plugin.syms -lstdc++ -lc -mthumb-interwork -mno-fpu#-Wl,--gc-sections
+PLUGIN_LDFLAGS += -nostartfiles -Wl,-q,--just-symbols,$(EXECUTABLE),-T$(portdir)/source/plugin.ld,--retain-symbols-file,$(portdir)/source/plugin.syms -lstdc++ -lc -mthumb-interwork -mno-fpu#-Wl,--gc-sections -mno-crt0 $(DEVKITPRO)/devkitARM/arm-eabi/lib/ds_arm9_crt0.o
MKDIR = mkdir -p
RM = rm -f
RM_REC = rm -rf
diff --git a/backends/platform/ds/arm9/source/dsloader.cpp b/backends/platform/ds/arm9/source/dsloader.cpp
index c0e8b63dbc..8ab64e226a 100644
--- a/backends/platform/ds/arm9/source/dsloader.cpp
+++ b/backends/platform/ds/arm9/source/dsloader.cpp
@@ -116,12 +116,6 @@ bool DLObject::relocate(Common::SeekableReadStream* DLFile, unsigned long offset
a = *target; // Get full 32 bits of addend
relocation = a + (Elf32_Addr)_segment; // Shift by main offset
- /*TODO:
- * if (SYM_TYPE(sym->st_info) == STT_FUNC && symbol addresses a thumb instruction) {
- * relocation |= 1;
- * }
- */
-
*target = relocation;
DBG("R_ARM_ABS32: i=%d, a=%x, origTarget=%x, target=%x\n", i, a, origTarget, *target);
@@ -129,74 +123,19 @@ bool DLObject::relocate(Common::SeekableReadStream* DLFile, unsigned long offset
break;
case R_ARM_THM_CALL:
-
- if (sym->st_shndx < SHN_LOPROC) { // Only shift for plugin section.
- a = *target & 0x00000fff; // Get the correct bits for addend:
- a += ((*target & 0x0fff0000) >> 4); // Bits 0-11 of the first half-word encode the 12 most significant bits of the branch offset,
- // bits 0-11 of the next half-word encode the 12 least significant bits.
- a = (a << 8) >> 8; // sign-extend
- a = a << 1; // branch offset is in units of half-bytes
-
- relocation = a + (Elf32_Addr)_segment; // Shift by main offset
-
- /*TODO:
- * if (SYM_TYPE(sym->st_info) == STT_FUNC && symbol addresses a thumb instruction) {
- * relocation |= 1;
- * }
- */
-
- relocation -= rel[i].r_offset;
-
- *target = relocation;
-
- DBG("R_ARM_THM_CALL: i=%d, a=%x, origTarget=%x, target=%x\n", i, a, origTarget, *target);
- }
+ DBG("R_ARM_THM_CALL: PC-relative jump, ld takes care of necessary relocation work for us.\n");
break;
case R_ARM_CALL:
- if (sym->st_shndx < SHN_LOPROC) { // Only shift for plugin section.
- a = *target & 0x00ffffff;
- a = (a << 8) >> 6; // Calculate addend by sign-extending (insn[23:0] << 2)
- relocation = a + (Elf32_Addr)_segment; // Shift by main offset
-
- /*TODO:
- * if (SYM_TYPE(sym->st_info) == STT_FUNC && symbol addresses a thumb instruction) {
- * relocation |= 1;
- * }
- */
-
- relocation = relocation - rel[i].r_offset;
- relocation = relocation >> 2;
- *target &= 0xff000000; // Clean lower 26 target bits
- *target |= (relocation & 0x00ffffff);
-
- DBG("R_ARM_CALL: i=%d, a=%x, origTarget=%x, target=%x\n", i, a, origTarget, *target);
- }
+ DBG("R_ARM_CALL: PC-relative jump, ld takes care of necessary relocation work for us.\n");
break;
case R_ARM_JUMP24:
- if (sym->st_shndx < SHN_LOPROC) { // Only shift for plugin section.
- a = *target & 0x00ffffff;
- a = (a << 8) >> 6; // Calculate addend by sign-extending (insn[23:0] << 2)
- relocation = a + (Elf32_Addr)_segment; // Shift by main offset
-
- /*TODO:
- * if (SYM_TYPE(sym->st_info) == STT_FUNC && symbol addresses a thumb instruction) {
- * relocation |= 1;
- * }
- */
-
- relocation = relocation - rel[i].r_offset;
- relocation = relocation >> 2;
- *target &= 0xff000000; // Clean lower 26 target bits
- *target |= (relocation & 0x00ffffff);
-
- DBG("R_ARM_CALL: i=%d, a=%x, origTarget=%x, target=%x\n", i, a, origTarget, *target);
- }
+ DBG("R_ARM_JUMP24: PC-relative jump, ld takes care of all relocation work for us.\n");
break;
case R_ARM_V4BX:
- DBG("R_ARM_V4BX: No relocation calculation necessary\n");
+ DBG("R_ARM_V4BX: No relocation calculation necessary.\n");
break;
default:
diff --git a/backends/platform/ds/arm9/source/elf32.h b/backends/platform/ds/arm9/source/elf32.h
index 8167a40551..c9253a6068 100644
--- a/backends/platform/ds/arm9/source/elf32.h
+++ b/backends/platform/ds/arm9/source/elf32.h
@@ -173,6 +173,13 @@ typedef struct {
Elf32_Word r_info; /* Relocation type and symbol index */
} Elf32_Rel;
+typedef struct
+{
+ Elf32_Addr r_offset; /* Address */
+ Elf32_Word r_info; /* Relocation type and symbol index */
+ Elf32_Sword r_addend; /* Addend */
+} Elf32_Rela;
+
// Access macros for the relocation info
#define REL_TYPE(x) ((unsigned char) (x)) /* Extract relocation type */
#define REL_INDEX(x) ((x)>>8) /* Extract relocation index into symbol table */
@@ -181,6 +188,8 @@ typedef struct {
#define R_ARM_NONE 0
#define R_ARM_ABS32 2
#define R_ARM_THM_CALL 10
+#define R_ARM_CALL 28
+#define R_ARM_JUMP24 29
#define R_ARM_V4BX 40
#endif /* BACKENDS_ELF_H */
diff --git a/backends/platform/ds/arm9/source/plugin.ld b/backends/platform/ds/arm9/source/plugin.ld
index 0296dd571d..2b2bca9745 100644
--- a/backends/platform/ds/arm9/source/plugin.ld
+++ b/backends/platform/ds/arm9/source/plugin.ld
@@ -1,4 +1,5 @@
-OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
+OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm",
+ "elf32-littlearm")
OUTPUT_ARCH(arm)
/* PHDRS specifies ELF Program Headers (or segments) to the plugin linker */
@@ -6,247 +7,212 @@ PHDRS {
plugin PT_LOAD ; /* Specifies that the plugin segment should be loaded from file */
}
-MEMORY {
- rom : ORIGIN = 0x08000000, LENGTH = 32M
- ewram : ORIGIN = 0x02000000, LENGTH = 4M - 4k
- dtcm : ORIGIN = 0x0b000000, LENGTH = 16K
- vectors : ORIGIN = 0x01000000, LENGTH = 256
- itcm : ORIGIN = 0x01000100, LENGTH = 32K - 256
-}
-
-__vectors_start = ORIGIN(vectors);
-__itcm_start = ORIGIN(itcm);
-__ewram_end = ORIGIN(ewram) + LENGTH(ewram);
-__eheap_end = ORIGIN(ewram) + LENGTH(ewram);
-__dtcm_start = ORIGIN(dtcm);
-__dtcm_top = ORIGIN(dtcm) + LENGTH(dtcm);
-__irq_flags = __dtcm_top - 0x08;
-__irq_vector = __dtcm_top - 0x04;
-
-__sp_svc = __dtcm_top - 0x100;
-__sp_irq = __sp_svc - 0x100;
-__sp_usr = __sp_irq - 0x100;
-
SECTIONS
{
- .init :
- {
- __text_start = . ;
- KEEP (*(.init))
- . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
- } >ewram :plugin = 0xff
-
- .plt : { *(.plt) } >ewram = 0xff
-
- .text : /* ALIGN (4): */
- {
- *(EXCLUDE_FILE (*.itcm*) .text)
-
- *(.text.*)
- *(.stub)
- /* .gnu.warning sections are handled specially by elf32.em. */
- *(.gnu.warning)
- *(.gnu.linkonce.t*)
- *(.glue_7)
- *(.glue_7t)
- . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
- } >ewram = 0xff
-
- .fini :
- {
- KEEP (*(.fini))
- } >ewram =0xff
-
- __text_end = . ;
-
- .rodata :
- {
- *(.rodata)
- *all.rodata*(*)
- *(.roda)
- *(.rodata.*)
- *(.gnu.linkonce.r*)
- SORT(CONSTRUCTORS)
- . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
- } >ewram = 0xff
-
- .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >ewram
+ /* Read-only sections, merged into text segment: */
+ . = 0;
+ .interp : { *(.interp) } : plugin
+ .note.gnu.build-id : { *(.note.gnu.build-id) }
+ .hash : { *(.hash) }
+ .gnu.hash : { *(.gnu.hash) }
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .gnu.version : { *(.gnu.version) }
+ .gnu.version_d : { *(.gnu.version_d) }
+ .gnu.version_r : { *(.gnu.version_r) }
+ .rel.dyn :
+ {
+ *(.rel.init)
+ *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
+ *(.rel.fini)
+ *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
+ *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*)
+ *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
+ *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
+ *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
+ *(.rel.ctors)
+ *(.rel.dtors)
+ *(.rel.got)
+ *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
+ PROVIDE_HIDDEN (__rel_iplt_start = .);
+ *(.rel.iplt)
+ PROVIDE_HIDDEN (__rel_iplt_end = .);
+ PROVIDE_HIDDEN (__rela_iplt_start = .);
+ PROVIDE_HIDDEN (__rela_iplt_end = .);
+ }
+ .rela.dyn :
+ {
+ *(.rela.init)
+ *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
+ *(.rela.fini)
+ *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
+ *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
+ *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
+ *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
+ *(.rela.ctors)
+ *(.rela.dtors)
+ *(.rela.got)
+ *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
+ PROVIDE_HIDDEN (__rel_iplt_start = .);
+ PROVIDE_HIDDEN (__rel_iplt_end = .);
+ PROVIDE_HIDDEN (__rela_iplt_start = .);
+ *(.rela.iplt)
+ PROVIDE_HIDDEN (__rela_iplt_end = .);
+ }
+ .rel.plt :
+ {
+ *(.rel.plt)
+ }
+ .rela.plt :
+ {
+ *(.rela.plt)
+ }
+ .init :
+ {
+ KEEP (*(.init))
+ } =0
+ .plt : { *(.plt) }
+ .iplt : { *(.iplt) }
+ .text :
+ {
+ *(.text.unlikely .text.*_unlikely)
+ *(.text .stub .text.* .gnu.linkonce.t.*)
+ /* .gnu.warning sections are handled specially by elf32.em. */
+ *(.gnu.warning)
+ *(.glue_7t) *(.glue_7) *(.vfp11_veneer) *(.v4_bx)
+ } =0
+ .fini :
+ {
+ KEEP (*(.fini))
+ } =0
+ PROVIDE (__etext = .);
+ PROVIDE (_etext = .);
+ PROVIDE (etext = .);
+ .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
+ .rodata1 : { *(.rodata1) }
+ .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) }
__exidx_start = .;
- .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >ewram
+ .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
__exidx_end = .;
- /* Ensure the __preinit_array_start label is properly aligned. We
- could instead move the label definition inside the section, but
- the linker would then create the section even if it turns out to
- be empty, which isn't pretty. */
- . = ALIGN(32 / 8);
- PROVIDE (__preinit_array_start = .);
- .preinit_array : { KEEP (*(.preinit_array)) } >ewram = 0xff
- PROVIDE (__preinit_array_end = .);
- PROVIDE (__init_array_start = .);
+ .eh_frame_hdr : { *(.eh_frame_hdr) }
+ .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) }
+ .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
+ /* 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(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1));
+ /* Exception handling */
+ .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) }
+ .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
+ /* Thread Local Storage sections */
+ .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
+ .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
+ .preinit_array :
+ {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ }
.init_array :
{
- KEEP (*(SORT(.init_array.*)))
- KEEP (*(.init_array))
- } >ewram = 0xff
- PROVIDE (__init_array_end = .);
- PROVIDE (__fini_array_start = .);
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ }
.fini_array :
{
- KEEP (*(.fini_array))
- KEEP (*(SORT(.fini_array.*)))
- } >ewram = 0xff
- PROVIDE (__fini_array_end = .);
-
- .ctors :
- {
- /* gcc uses crtbegin.o to find the start of the constructors, so
- we make sure it is first. Because this is a wildcard, it
- doesn't matter if the user does not actually link against
- crtbegin.o; the linker won't look for a file to match a
- wildcard. The wildcard also means that it doesn't matter which
- directory crtbegin.o is in. */
- ___plugin_ctors = .;
- KEEP (*(SORT(.ctors.*)))
- KEEP (*(.ctors))
- . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
- ___plugin_ctors_end = .;
- } >ewram = 0xff
-
- .dtors :
- {
- ___plugin_dtors = .;
- KEEP (*(SORT(.dtors.*)))
- KEEP (*(.dtors))
- . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
- ___plugin_dtors_end = .;
- } >ewram = 0xff
-
- .eh_frame :
- {
- KEEP (*(.eh_frame))
- . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
- } >ewram = 0xff
-
- .gcc_except_table :
- {
- *(.gcc_except_table)
- . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
- } >ewram = 0xff
- .jcr : { KEEP (*(.jcr)) } >ewram = 0
- .got : { *(.got.plt) *(.got) *(.rel.got) } >ewram = 0
-
- .ewram ALIGN(4) :
- {
- __ewram_start = ABSOLUTE(.) ;
- *(.ewram)
- *ewram.*(.text)
- . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
- } >ewram = 0xff
-
-
- .data ALIGN(4) :
- {
- __data_start = ABSOLUTE(.);
- *(.data)
- *(.data.*)
- *(.gnu.linkonce.d*)
- CONSTRUCTORS
- . = ALIGN(4);
- __data_end = ABSOLUTE(.) ;
- } >ewram = 0xff
-
-
- __dtcm_lma = . ;
- __bss_vma = . ;
-
- .dtcm __dtcm_start : AT (__dtcm_lma)
- {
- *(.dtcm)
- *(.dtcm.*)
- . = ALIGN(4);
- __dtcm_end = ABSOLUTE(.);
- } >dtcm = 0xff
-
-
- __itcm_lma = __dtcm_lma + SIZEOF(.dtcm);
-
- .itcm __itcm_start : AT (__itcm_lma)
- {
- *(.itcm)
- *itcm.*(.text)
- . = ALIGN(4);
- __itcm_end = ABSOLUTE(.);
- } >itcm = 0xff
-
- __vectors_lma = __itcm_lma + SIZEOF(.itcm);
-
- .vectors __vectors_start : AT (__vectors_lma)
- {
- *(.vectors)
- *vectors.*(.text)
- . = ALIGN(4);
- __vectors_end = ABSOLUTE(.);
- } >vectors = 0xff
-
- .sbss __dtcm_end (NOLOAD):
- {
- __sbss_start = ABSOLUTE(.);
- __sbss_start__ = ABSOLUTE(.);
- *(.sbss)
- . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
- __sbss_end = ABSOLUTE(.);
- } >dtcm
-
- .bss __bss_vma (NOLOAD):
- {
- __bss_start = ABSOLUTE(.);
- __bss_start__ = ABSOLUTE(.);
- *(.dynbss)
- *(.gnu.linkonce.b*)
- *(.bss*)
- *(COMMON)
- . = ALIGN(4); /* REQUIRED. LD is flaky without it. */
- __bss_end = ABSOLUTE(.) ;
- __bss_end__ = __bss_end ;
- } AT>ewram
-
-
- _end = __bss_end__ ;
- __end__ = __bss_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) }
- .stack 0x80000 : { _stack = .; *(.stack) }
- /* These must appear regardless of . */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(.fini_array))
+ KEEP (*(SORT(.fini_array.*)))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ }
+ .ctors :
+ {
+ ___plugin_ctors = .;
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ ___plugin_ctors_end = .;
+ }
+ .dtors :
+ {
+ ___plugin_dtors = .;
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ ___plugin_dtors_end = .;
+ }
+ .jcr : { KEEP (*(.jcr)) }
+ .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }
+ .dynamic : { *(.dynamic) }
+ .got : { *(.got.plt) *(.igot.plt) *(.got) *(.igot) }
+ .data :
+ {
+ __data_start = . ;
+ *(.data .data.* .gnu.linkonce.d.*)
+ SORT(CONSTRUCTORS)
+ }
+ .data1 : { *(.data1) }
+ _edata = .; PROVIDE (edata = .);
+ __bss_start = .;
+ __bss_start__ = .;
+ .bss :
+ {
+ *(.dynbss)
+ *(.bss .bss.* .gnu.linkonce.b.*)
+ *(COMMON)
+ /* Align here to ensure that the .bss section occupies space up to
+ _end. Align after .bss to ensure correct alignment even if the
+ .bss section disappears because there are no input sections.
+ FIXME: Why do we need it? When there is no .bss section, we don't
+ pad the .data section. */
+ . = ALIGN(. != 0 ? 32 / 8 : 1);
+ }
+ _bss_end__ = . ; __bss_end__ = . ;
+ . = ALIGN(32 / 8);
+ . = ALIGN(32 / 8);
+ __end__ = . ;
+ _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 .gnu.linkonce.wi.*) }
+ .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) }
+ /* DWARF 3 */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ .stack 0x80000 :
+ {
+ _stack = .;
+ *(.stack)
+ }
+ .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) KEEP (*(.gnu.attributes)) }
+ .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
+ /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }
}