aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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_*) }
}