diff options
| author | Tony Puccinelli | 2010-07-03 05:05:27 +0000 | 
|---|---|---|
| committer | Tony Puccinelli | 2010-07-03 05:05:27 +0000 | 
| commit | 41663da28211bad526752f187b141f40515ec75c (patch) | |
| tree | 6748dd9c3a7d268bc9ba18aacd1e43088272efa8 /backends/platform/ds/arm9/source | |
| parent | 36435eecbf371acf938b9c38e5bb53341d3738ea (diff) | |
| download | scummvm-rg350-41663da28211bad526752f187b141f40515ec75c.tar.gz scummvm-rg350-41663da28211bad526752f187b141f40515ec75c.tar.bz2 scummvm-rg350-41663da28211bad526752f187b141f40515ec75c.zip  | |
moved plugin linker and elf32 header file to arm9/source and modified ds makefile to use dynamic plugins
svn-id: r50617
Diffstat (limited to 'backends/platform/ds/arm9/source')
| -rw-r--r-- | backends/platform/ds/arm9/source/elf32.h | 192 | ||||
| -rw-r--r-- | backends/platform/ds/arm9/source/plugin.ld | 216 | 
2 files changed, 408 insertions, 0 deletions
diff --git a/backends/platform/ds/arm9/source/elf32.h b/backends/platform/ds/arm9/source/elf32.h new file mode 100644 index 0000000000..2b695c917d --- /dev/null +++ b/backends/platform/ds/arm9/source/elf32.h @@ -0,0 +1,192 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef BACKENDS_ELF_H +#define BACKENDS_ELF_H + +/* ELF stuff */ + +typedef unsigned short Elf32_Half, Elf32_Section; +typedef unsigned int Elf32_Word, Elf32_Addr, Elf32_Off; +typedef signed int  Elf32_Sword; +typedef Elf32_Half Elf32_Versym; + +#define EI_NIDENT (16) +#define SELFMAG         6 + +/* ELF File format structures. Look up ELF structure for more details */ + +// ELF header (contains info about the file) +typedef struct { +	unsigned char e_ident[EI_NIDENT];     /* Magic number and other info */ +	Elf32_Half    e_type;                 /* Object file type */ +	Elf32_Half    e_machine;              /* Architecture */ +	Elf32_Word    e_version;              /* Object file version */ +	Elf32_Addr    e_entry;                /* Entry point virtual address */ +	Elf32_Off     e_phoff;                /* Program header table file offset */ +	Elf32_Off     e_shoff;                /* Section header table file offset */ +	Elf32_Word    e_flags;                /* Processor-specific flags */ +	Elf32_Half    e_ehsize;               /* ELF header size in bytes */ +	Elf32_Half    e_phentsize;            /* Program header table entry size */ +	Elf32_Half    e_phnum;                /* Program header table entry count */ +	Elf32_Half    e_shentsize;            /* Section header table entry size */ +	Elf32_Half    e_shnum;                /* Section header table entry count */ +	Elf32_Half    e_shstrndx;             /* Section header string table index */ +} Elf32_Ehdr; + +// Should be in e_ident +#define ELFMAG          "\177ELF\1\1"	/* ELF Magic number */ + +// e_type values +#define ET_NONE		0	/* no file type */ +#define ET_REL		1	/* relocatable */ +#define ET_EXEC		2	/* executable */ +#define ET_DYN		3	/* shared object */ +#define ET_CORE		4	/* core file */ + +// e_machine values +#define EM_ARM		40 + +// Program header (contains info about segment) +typedef struct { +	Elf32_Word    p_type;                 /* Segment type */ +	Elf32_Off     p_offset;               /* Segment file offset */ +	Elf32_Addr    p_vaddr;                /* Segment virtual address */ +	Elf32_Addr    p_paddr;                /* Segment physical address */ +	Elf32_Word    p_filesz;               /* Segment size in file */ +	Elf32_Word    p_memsz;                /* Segment size in memory */ +	Elf32_Word    p_flags;                /* Segment flags */ +	Elf32_Word    p_align;                /* Segment alignment */ +} Elf32_Phdr; + +// p_type values +#define PT_NULL 		0	/* ignored */ +#define PT_LOAD			1	/* loadable segment */ +#define PT_DYNAMIC		2	/* dynamic linking info */ +#define PT_INTERP		3	/* info about interpreter */ +#define PT_NOTE			4	/* note segment */ +#define PT_SHLIB		5	/* reserved */ +#define PT_PHDR			6	/* Program header table */ +#define PT_ARM_ARCHEXT 	0x70000000 /* Platform architecture compatibility information */ +#define PT_ARM_EXIDX 	0x70000001 /* Exception unwind tables */ + +// p_flags value +#define PF_X	1	/* execute */ +#define PF_W	2	/* write */ +#define PF_R	4	/* read */ + +// Section header (contains info about section) +typedef struct { +	Elf32_Word    sh_name;                /* Section name (string tbl index) */ +	Elf32_Word    sh_type;                /* Section type */ +	Elf32_Word    sh_flags;               /* Section flags */ +	Elf32_Addr    sh_addr;                /* Section virtual addr at execution */ +	Elf32_Off     sh_offset;              /* Section file offset */ +	Elf32_Word    sh_size;                /* Section size in bytes */ +	Elf32_Word    sh_link;                /* Link to another section */ +	Elf32_Word    sh_info;                /* Additional section information */ +	Elf32_Word    sh_addralign;           /* Section alignment */ +	Elf32_Word    sh_entsize;             /* Entry size if section holds table */ +} Elf32_Shdr; + +// sh_type values +#define SHT_NULL			0	/* Inactive section */ +#define SHT_PROGBITS                    1	/* Proprietary */ +#define SHT_SYMTAB			2	/* Symbol table */ +#define SHT_STRTAB			3	/* String table */ +#define SHT_RELA			4	/* Relocation entries with addend */ +#define SHT_HASH			5	/* Symbol hash table */ +#define SHT_DYNAMIC			6	/* Info for dynamic linking */ +#define SHT_NOTE			7	/* Note section */ +#define SHT_NOBITS			8	/* Occupies no space */ +#define SHT_REL				9	/* Relocation entries without addend */ +#define SHT_SHLIB			10	/* Reserved */ +#define SHT_DYNSYM			11	/* Minimal set of dynamic linking symbols */ +#define SHT_ARM_EXIDX 		0x70000001	/* Exception Index table */ +#define SHT_ARM_PREEMPTMAP 	0x70000002	/* BPABI DLL dynamic linking pre-emption map */ +#define SHT_ARM_ATTRIBUTES 	0x70000003	/* Object file compatibility attributes */ + +// sh_flags values +#define SHF_WRITE		0	/* writable section */ +#define SHF_ALLOC		2	/* section occupies memory */ +#define SHF_EXECINSTR	        4	/* machine instructions */ + +// Symbol entry (contain info about a symbol) +typedef struct { +	Elf32_Word    st_name;                /* Symbol name (string tbl index) */ +	Elf32_Addr    st_value;               /* Symbol value */ +	Elf32_Word    st_size;                /* Symbol size */ +	unsigned char st_info;                /* Symbol type and binding */ +	unsigned char st_other;               /* Symbol visibility */ +	Elf32_Section st_shndx;               /* Section index */ +} Elf32_Sym; + +// Extract from the st_info +#define SYM_TYPE(x)		((x)&0xF) +#define SYM_BIND(x)		((x)>>4) + +// Symbol binding values from st_info +#define STB_LOCAL 	0	/* Symbol not visible outside object */ +#define STB_GLOBAL 	1	/* Symbol visible to all object files */ +#define STB_WEAK	2	/* Similar to STB_GLOBAL */ + +// Symbol type values from st_info +#define STT_NOTYPE	0	/* Not specified */ +#define STT_OBJECT	1	/* Data object e.g. variable */ +#define STT_FUNC	2	/* Function */ +#define STT_SECTION	3	/* Section */ +#define STT_FILE	4	/* Source file associated with object file */ + +// Special section header index values from st_shndex +#define SHN_UNDEF  		0 +#define SHN_LOPROC 		0xFF00	/* Extended values */ +#define SHN_ABS	   		0xFFF1	/* Absolute value: don't relocate */ +#define SHN_COMMON 		0xFFF2	/* Common block. Not allocated yet */ +#define SHN_HIPROC 		0xFF1F +#define SHN_HIRESERVE 	        0xFFFF + +// Relocation entry (info about how to relocate) +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 */ + +// ARM relocation types +#define R_ARM_NONE			0 +#define R_ARM_PC24			1 +#define R_ARM_ABS32			2 +#define R_ARM_COPY			20 +#define R_ARM_GLOB_DAT			21 +#define R_ARM_JUMP_SLOT			22 +#define R_ARM_BASE_PREL			25 +#define R_ARM_GOT_BREL			26 +#define R_ARM_PLT32			27 + +#endif /* BACKENDS_ELF_H */ diff --git a/backends/platform/ds/arm9/source/plugin.ld b/backends/platform/ds/arm9/source/plugin.ld new file mode 100644 index 0000000000..65ba0496c7 --- /dev/null +++ b/backends/platform/ds/arm9/source/plugin.ld @@ -0,0 +1,216 @@ +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +OUTPUT_ARCH(arm) +/* PHDRS specifies ELF Program Headers (or segments) to the plugin linker */ +PHDRS { +  plugin PT_LOAD ; /* Specifies that the plugin segment should be loaded from file */ +} +SECTIONS +{ +  /* Read-only sections, merged into text segment: */ +  . = 0; +  .interp         : { *(.interp) } : plugin 	/*The ": plugin" tells the linker to assign this and +  	             								  the following sections to the "plugin" segment*/ +  .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.*) } +   __exidx_end = .; +  .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     : +  { +     PROVIDE_HIDDEN (__init_array_start = .); +     KEEP (*(SORT(.init_array.*))) +     KEEP (*(.init_array)) +     PROVIDE_HIDDEN (__init_array_end = .); +  } +  .fini_array     : +  { +    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_*) } +}  | 
