fix stripdebug

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@189 4ee2a332-4b2b-5046-8439-1ba90f034370
This commit is contained in:
shirait 2007-07-13 04:35:04 +00:00
parent 177653d5b4
commit 00f83c526a
7 changed files with 240 additions and 224 deletions

View File

@ -6,7 +6,7 @@
/*--------------------------------------------------------- /*---------------------------------------------------------
Archive Header Archive Header
--------------------------------------------------------*/ --------------------------------------------------------*/
#define ARMAG "!<arch>\n" /* magic string */ #define ARMAG "!<arch>\n" /* magic string */
#define SARMAG 8 /* length of magic string */ #define SARMAG 8 /* length of magic string */
#define ARFMAG "\`\n" /* header trailer string */ #define ARFMAG "\`\n" /* header trailer string */
@ -22,7 +22,7 @@ typedef struct /* archive file member header - printable ascii */
char ar_mode[8]; /* file member mode - octal */ char ar_mode[8]; /* file member mode - octal */
char ar_size[10]; /* file member size - decimal */ char ar_size[10]; /* file member size - decimal */
char ar_fmag[2]; /* ARFMAG - string to end header */ char ar_fmag[2]; /* ARFMAG - string to end header */
}ArchHdr; /* 計60(0x3C)バイト */ }ArchHdr; /* 計60(0x3C)バイト */

View File

@ -7,9 +7,10 @@
#include <string.h> #include <string.h>
static int endian; static int endian;
static BOOL load_strndx_done = FALSE; //static BOOL load_strndx_done = FALSE;
#if 0
/*--------------------------------------------------------- /*---------------------------------------------------------
--------------------------------------------------------*/ --------------------------------------------------------*/
@ -23,6 +24,7 @@ static u8 *load_elf32_byte(u8 *dest, u8 *org, int lsb)
return temp_ptr; return temp_ptr;
} }
#endif
/*--------------------------------------------------------- /*---------------------------------------------------------
@ -47,6 +49,7 @@ static u8 *load_elf32_half(Elf32_Half *dest, u8 *org, int lsb)
return (void *)temp_ptr; return (void *)temp_ptr;
} }
#if 0
/*--------------------------------------------------------- /*---------------------------------------------------------
--------------------------------------------------------*/ --------------------------------------------------------*/
@ -107,6 +110,7 @@ static u8 *load_elf32_word(Elf32_Word *dest, u8 *org, int lsb)
} }
return (void *)temp_ptr; return (void *)temp_ptr;
} }
#endif
/*--------------------------------------------------------- /*---------------------------------------------------------
ELFヘッダを読み出す ELFヘッダを読み出す
@ -247,7 +251,7 @@ void *ELF_LoadELFHeader(const void *buf, Elf32_Ehdr *ehdr)
return file_ptr; return file_ptr;
} }
#if 0
/*--------------------------------------------------------- /*---------------------------------------------------------
Relocation Entry Load Relocation Entry Load
--------------------------------------------------------*/ --------------------------------------------------------*/
@ -335,6 +339,6 @@ static void *ELF_LoadSectionHeader(const void *buf,Elf32_Shdr *shdr)
return file_ptr; return file_ptr;
} }
#endif

View File

@ -6,25 +6,25 @@
/*--------------------------------------------------------- /*---------------------------------------------------------
--------------------------------------------------------*/ --------------------------------------------------------*/
typedef u32 Elf32_Addr; /* size:4, align:4 Unsigned program address */ typedef u32 Elf32_Addr; /* size:4, align:4 Unsigned program address */
typedef u16 Elf32_Half; /* size:2, align:2 Unsigned medium int */ typedef u16 Elf32_Half; /* size:2, align:2 Unsigned medium int */
typedef u32 Elf32_Off; /* size:4, align:4 Unsigned file offset */ typedef u32 Elf32_Off; /* size:4, align:4 Unsigned file offset */
typedef s32 Elf32_Sword; /* size:4, align:4 Signed large int */ typedef s32 Elf32_Sword; /* size:4, align:4 Signed large int */
typedef u32 Elf32_Word; /* size:4, align:4 Unsigned large int */ typedef u32 Elf32_Word; /* size:4, align:4 Unsigned large int */
/*--------------------------------------------------------- /*---------------------------------------------------------
ELF Header ELF Header
--------------------------------------------------------*/ --------------------------------------------------------*/
/* e_identのインデックス */ /* e_identのインデックス */
#define EI_MAG0 0 /* File identification */ #define EI_MAG0 0 /* File identification */
#define EI_MAG1 1 /* File identification */ #define EI_MAG1 1 /* File identification */
#define EI_MAG2 2 /* File identification */ #define EI_MAG2 2 /* File identification */
#define EI_MAG3 3 /* File identification */ #define EI_MAG3 3 /* File identification */
#define EI_CLASS 4 /* File class 0=invalid, 1=32bit, 2=64bit */ #define EI_CLASS 4 /* File class 0=invalid, 1=32bit, 2=64bit */
#define EI_DATA 5 /* Data encoding 0=invalid, 1=LSB, 2=MSB */ #define EI_DATA 5 /* Data encoding 0=invalid, 1=LSB, 2=MSB */
#define EI_VERSION 6 /* File version 現在は1 */ #define EI_VERSION 6 /* File version 現在は1 */
#define EI_PAD 7 /* Start of padding bytes */ #define EI_PAD 7 /* Start of padding bytes */
#define EI_NIDENT 16 /* Size of e_ident[] */ #define EI_NIDENT 16 /* Size of e_ident[] */
typedef struct { typedef struct {
unsigned char e_ident[EI_NIDENT]; unsigned char e_ident[EI_NIDENT];
@ -44,29 +44,29 @@ typedef struct {
} Elf32_Ehdr; } Elf32_Ehdr;
/* e_ident[EI_*]の中身定義 */ /* e_ident[EI_*]の中身定義 */
#define ELFMAG0 0x7f #define ELFMAG0 0x7f
#define ELFMAG1 'E' #define ELFMAG1 'E'
#define ELFMAG2 'L' #define ELFMAG2 'L'
#define ELFMAG3 'F' #define ELFMAG3 'F'
#define ELFCLASSNONE 0 /* invalid */ #define ELFCLASSNONE 0 /* invalid */
#define ELFCLASS32 1 /* ARM and Thumb processors use 32-bit ELF. */ #define ELFCLASS32 1 /* ARM and Thumb processors use 32-bit ELF. */
#define ELFCLASS64 2 #define ELFCLASS64 2
#define ELFDATANONE 0 /* invalid */ #define ELFDATANONE 0 /* invalid */
#define ELFDATA2LSB 1 /* little-endian */ #define ELFDATA2LSB 1 /* little-endian */
#define ELFDATA2MSB 2 /* big-endian */ #define ELFDATA2MSB 2 /* big-endian */
/* [e_type] */ /* [e_type] */
#define ET_NONE 0 /* No file type */ #define ET_NONE 0 /* No file type */
#define ET_REL 1 /* Re-locatable file */ #define ET_REL 1 /* Re-locatable file */
#define ET_EXEC 2 /* Executable file */ #define ET_EXEC 2 /* Executable file */
#define ET_DYN 3 /* Shared object file */ #define ET_DYN 3 /* Shared object file */
#define ET_CORE 4 /* Core file */ #define ET_CORE 4 /* Core file */
#define ET_LOPROC 0xff00 /* Processor-specific */ #define ET_LOPROC 0xff00 /* Processor-specific */
#define ET_HIPROC 0xffff /* Processor-specific */ #define ET_HIPROC 0xffff /* Processor-specific */
/* [e_machine] */ /* [e_machine] */
#define EM_NONE 0 /* No machine */ #define EM_NONE 0 /* No machine */
#define EM_M32 1 #define EM_M32 1
#define EM_SPARC 2 #define EM_SPARC 2
#define EM_386 3 #define EM_386 3
@ -75,12 +75,12 @@ typedef struct {
#define EM_860 7 #define EM_860 7
#define EM_MIPS 8 #define EM_MIPS 8
#define EM_MIPS_RS4_BE 10 #define EM_MIPS_RS4_BE 10
#define EM_ARM 40 /* ARM/Thumb Architecture */ #define EM_ARM 40 /* ARM/Thumb Architecture */
/* [e_version] This member identifies the object file version.*/ /* [e_version] This member identifies the object file version.*/
#define EV_NONE 0 /* Invalid version */ #define EV_NONE 0 /* Invalid version */
#define EV_CURRENT 1 /* Current version */ #define EV_CURRENT 1 /* Current version */
/* /*
@ -147,16 +147,16 @@ enum {
Section headers Section headers
--------------------------------------------------------*/ --------------------------------------------------------*/
typedef struct { typedef struct {
Elf32_Word sh_name; /*セクションヘッダ文字列テーブルセクションのエントリのインデックス*/ Elf32_Word sh_name; /*セクションヘッダ文字列テーブルセクションのエントリのインデックス*/
Elf32_Word sh_type; /* タイプ(下記定義参照) */ Elf32_Word sh_type; /* タイプ(下記定義参照) */
Elf32_Word sh_flags; Elf32_Word sh_flags;
Elf32_Addr sh_addr; /* */ Elf32_Addr sh_addr; /* */
Elf32_Off sh_offset; /* ファイルの先頭からのオフセット */ Elf32_Off sh_offset; /* ファイルの先頭からのオフセット */
Elf32_Word sh_size; /* バイト単位のサイズ */ Elf32_Word sh_size; /* バイト単位のサイズ */
Elf32_Word sh_link; /* sh_typeによって値の意味が変わる */ Elf32_Word sh_link; /* sh_typeによって値の意味が変わる */
Elf32_Word sh_info; /* sh_typeによって値の意味が変わる */ Elf32_Word sh_info; /* sh_typeによって値の意味が変わる */
Elf32_Word sh_addralign; /* アラインメント制限(0or1で制限なし,4で4ByteAlign) */ Elf32_Word sh_addralign; /* アラインメント制限(0or1で制限なし,4で4ByteAlign) */
Elf32_Word sh_entsize; /* 固定サイズのエントリテーブルがある場合、1要素のサイズ */ Elf32_Word sh_entsize; /* 固定サイズのエントリテーブルがある場合、1要素のサイズ */
} Elf32_Shdr; } Elf32_Shdr;
/* sh_addr mod sh_addralign = 0 でなければならない */ /* sh_addr mod sh_addralign = 0 でなければならない */
@ -191,13 +191,13 @@ typedef struct {
/*セクションインデックス*/ /*セクションインデックス*/
//Sym->st_shndxなど //Sym->st_shndxなど
#define SHN_UNDEF 0 #define SHN_UNDEF 0
#define SHN_LORESERVE 0xff00 #define SHN_LORESERVE 0xff00
#define SHN_LOPROC 0xff00 #define SHN_LOPROC 0xff00
#define SHN_HIPROC 0xff1f #define SHN_HIPROC 0xff1f
#define SHN_ABS 0xfff1 #define SHN_ABS 0xfff1
#define SHN_COMMON 0xfff2 #define SHN_COMMON 0xfff2
#define SHN_HIRESERVE 0xffff #define SHN_HIRESERVE 0xffff
//ここからはヘッダでなく実体データ構造 //ここからはヘッダでなく実体データ構造
@ -206,12 +206,12 @@ typedef struct {
Symbol Table Entry Symbol Table Entry
--------------------------------------------------------*/ --------------------------------------------------------*/
typedef struct { typedef struct {
Elf32_Word st_name; /* シンボル文字列テーブルのインデックス */ Elf32_Word st_name; /* シンボル文字列テーブルのインデックス */
Elf32_Addr st_value; /* おそらく関連するセクション内でのオフセット値 */ Elf32_Addr st_value; /* おそらく関連するセクション内でのオフセット値 */
Elf32_Word st_size; /* サイズがないか、不明な場合は 0 */ Elf32_Word st_size; /* サイズがないか、不明な場合は 0 */
unsigned char st_info; /* バインド と タイプ */ unsigned char st_info; /* バインド と タイプ */
unsigned char st_other; /* 現在は 0 が入る */ unsigned char st_other; /* 現在は 0 が入る */
Elf32_Half st_shndx; /* 関連するセクションヘッダテーブルのインデックス */ Elf32_Half st_shndx; /* 関連するセクションヘッダテーブルのインデックス */
} Elf32_Sym; } Elf32_Sym;
@ -221,21 +221,21 @@ typedef struct {
#define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf)) #define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
/* st_info の BIND */ /* st_info の BIND */
#define STB_LOCAL 0 #define STB_LOCAL 0
#define STB_GLOBAL 1 #define STB_GLOBAL 1
#define STB_WEAK 2 #define STB_WEAK 2
#define STB_LOPROC 13 #define STB_LOPROC 13
#define STB_MW_SPECIFIC 14 /*NITROアプリで出てくる(例:OS_TPrintf)*/ #define STB_MW_SPECIFIC 14 /*NITROアプリで出てくる(例:OS_TPrintf)*/
#define STB_HIPROC 15 #define STB_HIPROC 15
/* st_info の TYPE */ /* st_info の TYPE */
#define STT_NOTYPE 0 /*未定義*/ #define STT_NOTYPE 0 /*未定義*/
#define STT_OBJECT 1 /*データオブジェクト*/ #define STT_OBJECT 1 /*データオブジェクト*/
#define STT_FUNC 2 #define STT_FUNC 2
#define STT_SECTION 3 #define STT_SECTION 3
#define STT_FILE 4 #define STT_FILE 4
#define STT_LOPROC 13 #define STT_LOPROC 13
#define STT_HIPROC 15 #define STT_HIPROC 15
/*--------------------------------------------------------- /*---------------------------------------------------------
@ -317,63 +317,63 @@ typedef struct {
#define R_ARM_RABS32 253 /* Word ΔS + A For the address of a location in the target segment. */ #define R_ARM_RABS32 253 /* Word ΔS + A For the address of a location in the target segment. */
#define R_ARM_RPC24 254 /* ARM B/BL (ΔS . ΔP) + A For calls between program segments. */ #define R_ARM_RPC24 254 /* ARM B/BL (ΔS . ΔP) + A For calls between program segments. */
#define R_ARM_RBASE 255 /* None None.Identifies the segment being relocated by the following #define R_ARM_RBASE 255 /* None None.Identifies the segment being relocated by the following
relocation directives. The ARM EABI poses two problems for relocating relocation directives. The ARM EABI poses two problems for relocating
executables and shared objects encoded in */ executables and shared objects encoded in */
// shirait // shirait
#define R_ARM_LDR_PC_G0 4 //LDR #define R_ARM_LDR_PC_G0 4 //LDR
#define R_ARM_ABS12 6 //LDR, STR #define R_ARM_ABS12 6 //LDR, STR
#define R_ARM_THM_CALL 10 //R_ARM_THM_PC22と同じ #define R_ARM_THM_CALL 10 //R_ARM_THM_PC22と同じ
#define R_ARM_CALL 28 //BL/BLX #define R_ARM_CALL 28 //BL/BLX
#define R_ARM_JUMP24 29 //B/BL<cond> #define R_ARM_JUMP24 29 //B/BL<cond>
#define R_ARM_THM_JUMP24 30 #define R_ARM_THM_JUMP24 30
#define R_ARM_MOVW_ABS_NC 43 //MOVW #define R_ARM_MOVW_ABS_NC 43 //MOVW
#define R_ARM_MOVT_ABS 44 //MOVT #define R_ARM_MOVT_ABS 44 //MOVT
#define R_ARM_MOVW_PREL_NC 45 //MOVW #define R_ARM_MOVW_PREL_NC 45 //MOVW
#define R_ARM_MOVT_PREL 46 //MOVT #define R_ARM_MOVT_PREL 46 //MOVT
#define R_ARM_ALU_PC_G0_NC 57 //ADD, SUB #define R_ARM_ALU_PC_G0_NC 57 //ADD, SUB
#define R_ARM_ALU_PC_G0 58 //ADD, SUB #define R_ARM_ALU_PC_G0 58 //ADD, SUB
#define R_ARM_ALU_PC_G1_NC 59 //ADD, SUB #define R_ARM_ALU_PC_G1_NC 59 //ADD, SUB
#define R_ARM_ALU_PC_G1 60 //ADD, SUB #define R_ARM_ALU_PC_G1 60 //ADD, SUB
#define R_ARM_ALU_PC_G2 61 //ADD, SUB #define R_ARM_ALU_PC_G2 61 //ADD, SUB
#define R_ARM_LDR_PC_G1 62 //LDR, STR, LDRB, STRB #define R_ARM_LDR_PC_G1 62 //LDR, STR, LDRB, STRB
#define R_ARM_LDR_PC_G2 63 //LDR, STR, LDRB, STRB #define R_ARM_LDR_PC_G2 63 //LDR, STR, LDRB, STRB
#define R_ARM_LDRS_PC_G0 64 //LDRD, STRD, LDRH, STRH, LDRSH, LDRSB #define R_ARM_LDRS_PC_G0 64 //LDRD, STRD, LDRH, STRH, LDRSH, LDRSB
#define R_ARM_LDRS_PC_G1 65 //LDRD, STRD, LDRH, STRH, LDRSH, LDRSB #define R_ARM_LDRS_PC_G1 65 //LDRD, STRD, LDRH, STRH, LDRSH, LDRSB
#define R_ARM_LDRS_PC_G2 66 //LDRD, STRD, LDRH, STRH, LDRSH, LDRSB #define R_ARM_LDRS_PC_G2 66 //LDRD, STRD, LDRH, STRH, LDRSH, LDRSB
#define R_ARM_LDC_PC_G0 67 //LDC, STC #define R_ARM_LDC_PC_G0 67 //LDC, STC
#define R_ARM_LDC_PC_G1 68 //LDC, STC #define R_ARM_LDC_PC_G1 68 //LDC, STC
#define R_ARM_LDC_PC_G2 69 //LDC, STC #define R_ARM_LDC_PC_G2 69 //LDC, STC
#define R_ARM_ALU_SB_G0_NC 70 //ADD, SUB #define R_ARM_ALU_SB_G0_NC 70 //ADD, SUB
#define R_ARM_ALU_SB_G0 71 //ADD, SUB #define R_ARM_ALU_SB_G0 71 //ADD, SUB
#define R_ARM_ALU_SB_G1_NC 72 //ADD, SUB #define R_ARM_ALU_SB_G1_NC 72 //ADD, SUB
#define R_ARM_ALU_SB_G1 73 //ADD, SUB #define R_ARM_ALU_SB_G1 73 //ADD, SUB
#define R_ARM_ALU_SB_G2 74 //ADD, SUB #define R_ARM_ALU_SB_G2 74 //ADD, SUB
#define R_ARM_LDR_SB_G0 75 //LDR, STR, LDRB, STRB #define R_ARM_LDR_SB_G0 75 //LDR, STR, LDRB, STRB
#define R_ARM_LDR_SB_G1 76 //LDR, STR, LDRB, STRB #define R_ARM_LDR_SB_G1 76 //LDR, STR, LDRB, STRB
#define R_ARM_LDR_SB_G2 77 //LDR, STR, LDRB, STRB #define R_ARM_LDR_SB_G2 77 //LDR, STR, LDRB, STRB
#define R_ARM_LDRS_SB_G0 78 //LDRD, STRD, LDRH, STRH, LDRSH, LDRSB #define R_ARM_LDRS_SB_G0 78 //LDRD, STRD, LDRH, STRH, LDRSH, LDRSB
#define R_ARM_LDRS_SB_G1 79 //LDRD, STRD, LDRH, STRH, LDRSH, LDRSB #define R_ARM_LDRS_SB_G1 79 //LDRD, STRD, LDRH, STRH, LDRSH, LDRSB
#define R_ARM_LDRS_SB_G2 80 //LDRD, STRD, LDRH, STRH, LDRSH, LDRSB #define R_ARM_LDRS_SB_G2 80 //LDRD, STRD, LDRH, STRH, LDRSH, LDRSB
#define R_ARM_LDC_SB_G0 81 //LDC, STC #define R_ARM_LDC_SB_G0 81 //LDC, STC
#define R_ARM_LDC_SB_G1 82 //LDC, STC #define R_ARM_LDC_SB_G1 82 //LDC, STC
#define R_ARM_LDC_SB_G2 83 //LDC, STC #define R_ARM_LDC_SB_G2 83 //LDC, STC
#define R_ARM_MOVW_BREL_NC 84 //MOVW #define R_ARM_MOVW_BREL_NC 84 //MOVW
#define R_ARM_MOVT_BREL 85 //MOVT #define R_ARM_MOVT_BREL 85 //MOVT
#define R_ARM_MOVW_BREL 86 //MOVW #define R_ARM_MOVW_BREL 86 //MOVW
#define R_ARM_GOT_BREL12 97 //LDR #define R_ARM_GOT_BREL12 97 //LDR
#define R_ARM_GOTOFF12 98 //LDR, STR #define R_ARM_GOTOFF12 98 //LDR, STR
#define R_ARM_TLS_LDO12 109 //LDR, STR #define R_ARM_TLS_LDO12 109 //LDR, STR
#define R_ARM_TLS_LE12 110 //LDR, STR #define R_ARM_TLS_LE12 110 //LDR, STR
#define R_ARM_TLS_TE12GP 111 //LDR #define R_ARM_TLS_TE12GP 111 //LDR

View File

@ -199,15 +199,17 @@ u16 ELi_LoadLibrary( ELHandle* ElfHandle, void* obj_image, u32 obj_len, void* bu
newarch_size += 8; newarch_size += 8;
ElfHandle->buf_current = new_image_pointer; ElfHandle->buf_current = (void*)new_image_pointer;
while( image_pointer < obj_len) { while( image_pointer < obj_len) {
ElfHandle->ELi_ReadStub( &ArHdr, ElfHandle->FileStruct, (u32)(obj_image), image_pointer, arch_size);
ElfHandle->ELi_ReadStub( OBJMAG, ElfHandle->FileStruct, (u32)(obj_image), (image_pointer+arch_size), 4); /*OBJの文字列を取得*/ ElfHandle->ELi_ReadStub( OBJMAG, ElfHandle->FileStruct, (u32)(obj_image), (image_pointer+arch_size), 4); /*OBJの文字列を取得*/
if( strncmp( OBJMAG, ELFMAG, 4) == 0) { if( strncmp( OBJMAG, ELFMAG, 4) == 0) {
elf_num++; elf_num++;
ElfHandle->ELi_ReadStub( new_image_pointer, ElfHandle->FileStruct, (u32)(obj_image),
image_pointer, arch_size); //arヘッダをstripped elfにコピー memcpy( (void*)new_image_pointer, (const void*)&ArHdr, arch_size); //arヘッダをstripped elfにコピー
result = ELi_LoadObject( ElfHandle, (void*)(image_pointer+arch_size), result = ELi_LoadObject( ElfHandle, (void*)(image_pointer+arch_size),
new_image_pointer + arch_size); (void*)(new_image_pointer + arch_size));
// (ElfHandle->buf_current + arch_size)); // (ElfHandle->buf_current + arch_size));
ELi_SetDecSize( (char*)(((ArchHdr*)new_image_pointer)->ar_size), ElfHandle->newelf_size); //archヘッダのサイズ更新 ELi_SetDecSize( (char*)(((ArchHdr*)new_image_pointer)->ar_size), ElfHandle->newelf_size); //archヘッダのサイズ更新
@ -222,14 +224,17 @@ u16 ELi_LoadLibrary( ELHandle* ElfHandle, void* obj_image, u32 obj_len, void* bu
ElfHandle->SymEx = NULL; ElfHandle->SymEx = NULL;
ElfHandle->process = EL_INITIALIZED; /*フラグの設定*/ ElfHandle->process = EL_INITIALIZED; /*フラグの設定*/
}else{ }else{
ElfHandle->ELi_ReadStub( new_image_pointer, ElfHandle->FileStruct, (u32)(obj_image), memcpy( (void*)new_image_pointer, (const void*)&ArHdr, arch_size); //arヘッダをstripped elfにコピー
image_pointer, arch_size+AR_GetEntrySize( &ArHdr)); //arヘッダとエントリをstripped elfにコピー
/*arヘッダの次エントリ本体をstripped elfにコピー*/
ElfHandle->ELi_ReadStub( (void*)(new_image_pointer+arch_size), ElfHandle->FileStruct,
(u32)(obj_image),
(image_pointer+arch_size), AR_GetEntrySize( &ArHdr));
new_image_pointer += (AR_GetEntrySize( &ArHdr) + arch_size); new_image_pointer += (AR_GetEntrySize( &ArHdr) + arch_size);
newarch_size += (AR_GetEntrySize( &ArHdr) + arch_size); newarch_size += (AR_GetEntrySize( &ArHdr) + arch_size);
} }
/*次のエントリへ*/ /*次のエントリへ*/
ElfHandle->ELi_ReadStub( &ArHdr, ElfHandle->FileStruct, (u32)(obj_image), image_pointer, arch_size);
image_pointer += arch_size + AR_GetEntrySize( &ArHdr); image_pointer += arch_size + AR_GetEntrySize( &ArHdr);
} }
ElfHandle->newelf_size = newarch_size; ElfHandle->newelf_size = newarch_size;
@ -258,20 +263,19 @@ u16 ELi_LoadLibrary( ELHandle* ElfHandle, void* obj_image, u32 obj_len, void* bu
u16 ELi_LoadObject( ELHandle* ElfHandle, void* obj_offset, void* buf) u16 ELi_LoadObject( ELHandle* ElfHandle, void* obj_offset, void* buf)
{ {
u16 i, j; u16 i, j;
u32 num_of_entry; // u32 num_of_entry;
ELShdrEx* FwdShdrEx; ELShdrEx* FwdShdrEx;
ELShdrEx* CurrentShdrEx; ELShdrEx* CurrentShdrEx;
ELShdrEx DmyShdrEx; ELShdrEx DmyShdrEx;
char sym_str[128]; //デバッグプリント用 // char sym_str[128]; //デバッグプリント用
u32 offset; //デバッグプリント用 // u32 offset; //デバッグプリント用
u32 newelf_shoff = 0; //stripped elfイメージへの書き込みポインタ u32 newelf_shoff = 0; //stripped elfイメージへの書き込みポインタ
u32 buf_shdr; u32 buf_shdr;
u32 section_num = 0; u32 section_num = 0;
u32 newelf_size; // u32 newelf_size;
u32 tmp_buf; u32 tmp_buf;
u32 *shdr_table; //セクションヘッダ新旧番号対応テーブル u32 *shdr_table; //セクションヘッダ新旧番号対応テーブル
u32 *sym_table; //シンボルエントリ新旧番号対応テーブル // u32 *sym_table; //シンボルエントリ新旧番号対応テーブル
/* ELHandleの初期化チェック */ /* ELHandleの初期化チェック */
if( ElfHandle->process != EL_INITIALIZED) { if( ElfHandle->process != EL_INITIALIZED) {
return EL_FAILED; return EL_FAILED;
@ -286,13 +290,12 @@ u16 ELi_LoadObject( ELHandle* ElfHandle, void* obj_offset, void* buf)
/* セクションハンドル構築 */ /* セクションハンドル構築 */
ElfHandle->elf_offset = obj_offset; ElfHandle->elf_offset = obj_offset;
ElfHandle->buf_current = (u32)buf + sizeof( Elf32_Ehdr); ElfHandle->buf_current = (void*)((u32)buf + sizeof( Elf32_Ehdr));
ElfHandle->shentsize = ElfHandle->CurrentEhdr.e_shentsize; ElfHandle->shentsize = ElfHandle->CurrentEhdr.e_shentsize;
/*セクションヘッダテーブル構築*/ /*セクションヘッダテーブル構築*/
shdr_table = (u32*)malloc( 4 * ElfHandle->CurrentEhdr.e_shnum); shdr_table = (u32*)malloc( 4 * ElfHandle->CurrentEhdr.e_shnum);
/*---------- ELShdrExのリストとshdr_tableを作る ----------*/ /*---------- ELShdrExのリストとshdr_tableを作る ----------*/
CurrentShdrEx = &DmyShdrEx; CurrentShdrEx = &DmyShdrEx;
for( i=0; i<(ElfHandle->CurrentEhdr.e_shnum); i++) { for( i=0; i<(ElfHandle->CurrentEhdr.e_shnum); i++) {
@ -309,7 +312,7 @@ u16 ELi_LoadObject( ELHandle* ElfHandle, void* obj_offset, void* buf)
ELi_GetShdr( ElfHandle, i, &(CurrentShdrEx->Shdr)); ELi_GetShdr( ElfHandle, i, &(CurrentShdrEx->Shdr));
CurrentShdrEx->debug_flag = 0; CurrentShdrEx->debug_flag = 0;
shdr_table[i] = section_num; /*セクション新旧テーブル作成*/ shdr_table[i] = section_num; /*セクション新旧テーブル作成*/
// printf( "shdr_table[0x%x] = 0x%x\n", i, section_num); //printf( "shdr_table[0x%x] = 0x%x\n", i, section_num);
section_num++; section_num++;
/*セクション文字列を取得しておく*/ /*セクション文字列を取得しておく*/
CurrentShdrEx->str = (char*)malloc( 128); //128文字バッファ取得 CurrentShdrEx->str = (char*)malloc( 128); //128文字バッファ取得
@ -322,7 +325,7 @@ u16 ELi_LoadObject( ELHandle* ElfHandle, void* obj_offset, void* buf)
ElfHandle->ShdrEx = DmyShdrEx.next; ElfHandle->ShdrEx = DmyShdrEx.next;
/*--------------------------------------------------------*/ /*--------------------------------------------------------*/
/*---------- 全セクションを調べてコピーする ----------*/ /*---------- 全セクションを調べてコピーする ----------*/
// printf( "\nLoad to RAM:\n"); // printf( "\nLoad to RAM:\n");
for( i=0; i<(ElfHandle->CurrentEhdr.e_shnum); i++) { for( i=0; i<(ElfHandle->CurrentEhdr.e_shnum); i++) {
@ -393,17 +396,23 @@ u16 ELi_LoadObject( ELHandle* ElfHandle, void* obj_offset, void* buf)
/*---------------------------------*/ /*---------------------------------*/
symbol_num++; symbol_num++;
CurrentSymEx->Sym.st_shndx = shdr_table[CurrentSymEx->Sym.st_shndx]; //シンボルエントリの対象セクション番号更新 if( (CurrentSymEx->Sym.st_shndx != SHN_UNDEF) &&
(CurrentSymEx->Sym.st_shndx < SHN_LORESERVE)) {
CurrentSymEx->Sym.st_shndx = shdr_table[CurrentSymEx->Sym.st_shndx]; //シンボルエントリの対象セクション番号更新
}
CurrentSymEx = CurrentSymEx->next; CurrentSymEx = CurrentSymEx->next;
}/*-------------------------------------*/ }/*-------------------------------------*/
/*--- シンボルテーブルセクションヘッダの更新 ---*/ /*--- シンボルテーブルセクションヘッダの更新 ---*/
CurrentShdrEx->loaded_adr = ELi_CopySymToBuffer( ElfHandle); CurrentShdrEx->loaded_adr = (u32)(ELi_CopySymToBuffer( ElfHandle));
CurrentShdrEx->Shdr.sh_link = shdr_table[CurrentShdrEx->Shdr.sh_link]; //文字列セクション番号更新 if( (CurrentShdrEx->Shdr.sh_link != SHN_UNDEF) &&
(CurrentShdrEx->Shdr.sh_link < SHN_LORESERVE)) {
CurrentShdrEx->Shdr.sh_link = shdr_table[CurrentShdrEx->Shdr.sh_link]; //文字列セクション番号更新
}
CurrentShdrEx->Shdr.sh_size = symbol_num * sizeof( Elf32_Sym); CurrentShdrEx->Shdr.sh_size = symbol_num * sizeof( Elf32_Sym);
/*----------------------------------------------*/ /*----------------------------------------------*/
} }
ELi_FreeSymList( ElfHandle, CurrentShdrEx->sym_table); //シンボルリスト開放 ELi_FreeSymList( ElfHandle, (u32**)(CurrentShdrEx->sym_table)); //シンボルリスト開放
} }
/* printf( "section %02x relocated at %08x\n", /* printf( "section %02x relocated at %08x\n",
@ -478,10 +487,10 @@ u16 ELi_LoadObject( ELHandle* ElfHandle, void* obj_offset, void* buf)
/*ここまででセクションの中身だけがstripped elfにコピーされた*/ /*ここまででセクションの中身だけがstripped elfにコピーされた*/
/*---------- セクションヘッダを stripped elfにコピー ----------*/ /*---------- セクションヘッダを stripped elfにコピー ----------*/
buf_shdr = ELi_ALIGN( ((u32)(ElfHandle->buf_current)), 4); buf_shdr = ELi_ALIGN( ((u32)(ElfHandle->buf_current)), 4);
ElfHandle->buf_current = buf_shdr; ElfHandle->buf_current = (void*)buf_shdr;
// printf( "buf_shdr = 0x%x\n", buf_shdr); // printf( "buf_shdr = 0x%x\n", buf_shdr);
// printf( "buf = 0x%x\n", (u32)buf); // printf( "buf = 0x%x\n", (u32)buf);
@ -528,7 +537,7 @@ u16 ELi_LoadObject( ELHandle* ElfHandle, void* obj_offset, void* buf)
memcpy( (u8*)buf, &(ElfHandle->CurrentEhdr), sizeof( Elf32_Ehdr)); /*ELFヘッダをstripped elfイメージにコピー*/ memcpy( (u8*)buf, &(ElfHandle->CurrentEhdr), sizeof( Elf32_Ehdr)); /*ELFヘッダをstripped elfイメージにコピー*/
/*-----------------------------------*/ /*-----------------------------------*/
/*---------- 再配置 ----------*/ /*---------- 再配置 ----------*/
/* if( unresolved_table_block_flag == 0) { /* if( unresolved_table_block_flag == 0) {
if( dbg_print_flag == 1) { if( dbg_print_flag == 1) {
@ -659,10 +668,10 @@ u16 EL_ResolveAllLibrary( void)
ELAdrEntry* AdrEnt; ELAdrEntry* AdrEnt;
ELUnresolvedEntry* RemoveUnrEnt; ELUnresolvedEntry* RemoveUnrEnt;
ELUnresolvedEntry* UnrEnt; ELUnresolvedEntry* UnrEnt;
ELUnresolvedEntry* CurrentUnrEnt; // ELUnresolvedEntry* CurrentUnrEnt;
ELUnresolvedEntry* FwdUnrEnt; // ELUnresolvedEntry* FwdUnrEnt;
u32 relocation_val; // u32 relocation_val;
ELAdrEntry AddAdrEnt; // ELAdrEntry AddAdrEnt;
char sym_str[128]; char sym_str[128];
UnrEnt = ELUnrEntStart; UnrEnt = ELUnrEntStart;
@ -683,7 +692,7 @@ u16 EL_ResolveAllLibrary( void)
// ELi_RemoveUnresolvedEntry( UnrEnt); //解決したので未解決リストから削除 // ELi_RemoveUnresolvedEntry( UnrEnt); //解決したので未解決リストから削除
}else{ }else{
if( dbg_print_flag == 1) { if( dbg_print_flag == 1) {
printf( "\n static symbol found %s : %8x\n", UnrEnt->sym_str, UnrEnt->S_); printf( "\n static symbol found %s : %8x\n", UnrEnt->sym_str, (int)(UnrEnt->S_));
} }
UnrEnt->AdrEnt = AdrEnt; //見つけたアドレスエントリをセット UnrEnt->AdrEnt = AdrEnt; //見つけたアドレスエントリをセット
UnrEnt->remove_flag = 2; //マーキングmakelstだけで使用する特別な値 UnrEnt->remove_flag = 2; //マーキングmakelstだけで使用する特別な値
@ -836,7 +845,7 @@ void* EL_GetGlobalAdr( char* ent_name)
return (void*)(adr); return (void*)(adr);
} }
#if 0
/*------------------------------------------------------ /*------------------------------------------------------
-----------------------------------------------------*/ -----------------------------------------------------*/
@ -858,12 +867,14 @@ void* EL_FreeAdrTbl( void)
} }
/*------------------------------------*/ /*------------------------------------*/
} }
#endif
/*------------------------------------------------------ /*------------------------------------------------------
ELFオブジェクトからデータを読み出すスタブ ELFオブジェクトからデータを読み出すスタブ
-----------------------------------------------------*/ -----------------------------------------------------*/
void ELi_ReadFile( void* buf, void* file_struct, u32 file_base, u32 file_offset, u32 size) void ELi_ReadFile( void* buf, void* file_struct, u32 file_base, u32 file_offset, u32 size)
{ {
// printf( "0x%x, 0x%x\n", file_offset, size);
fseek( file_struct, file_offset, SEEK_SET); fseek( file_struct, file_offset, SEEK_SET);
fread( buf, 1, size, file_struct); fread( buf, 1, size, file_struct);

View File

@ -22,17 +22,17 @@
() ()
-----------------------------------------------------*/ -----------------------------------------------------*/
typedef struct { typedef struct {
void* next; void* next;
u16 index; u16 index;
u16 debug_flag; /*0:デバッグ情報でない、1:デバッグ情報*/ u16 debug_flag; /*0:デバッグ情報でない、1:デバッグ情報*/
u32 loaded_adr; u32 loaded_adr;
u32 alloc_adr; u32 alloc_adr;
u32 loaded_size; u32 loaded_size;
Elf32_Shdr Shdr; Elf32_Shdr Shdr;
char* str; /*セクション名文字列をコピーしてきたもの*/ char* str; /*セクション名文字列をコピーしてきたもの*/
u32* sym_table; /*シンボルセクションのとき有効な新旧対応表*/ u32* sym_table; /*シンボルセクションのとき有効な新旧対応表*/
void* str_table; /*STRセクションのとき有効新文字列テーブル*/ void* str_table; /*STRセクションのとき有効新文字列テーブル*/
u32 str_table_size; /*STRセクションのとき有効新文字列テーブルのサイズ*/ u32 str_table_size; /*STRセクションのとき有効新文字列テーブルのサイズ*/
}ELShdrEx; }ELShdrEx;
@ -40,11 +40,11 @@ typedef struct {
() ()
-----------------------------------------------------*/ -----------------------------------------------------*/
typedef struct { typedef struct {
void* next; void* next;
u16 debug_flag; /*0:デバッグ情報でない、1:デバッグ情報*/ u16 debug_flag; /*0:デバッグ情報でない、1:デバッグ情報*/
u16 thumb_flag; u16 thumb_flag;
u32 relocation_val; u32 relocation_val;
Elf32_Sym Sym; Elf32_Sym Sym;
}ELSymEx; }ELSymEx;
@ -54,30 +54,30 @@ typedef struct {
-----------------------------------------------------*/ -----------------------------------------------------*/
typedef void (*ELi_ReadFunc)( void* buf, void* file_struct, u32 file_base, u32 file_offset, u32 size); typedef void (*ELi_ReadFunc)( void* buf, void* file_struct, u32 file_base, u32 file_offset, u32 size);
typedef struct { typedef struct {
void* ar_head; /* ARまたはELFファイルの先頭アドレス */ void* ar_head; /* ARまたはELFファイルの先頭アドレス */
void* elf_offset; /* ELFオブジェクトの先頭へのオフセット */ void* elf_offset; /* ELFオブジェクトの先頭へのオフセット */
void* buf_current; /* Loader作業用 */ void* buf_current; /* Loader作業用 */
u16 shentsize; /* 1セクションヘッダのサイズ */ u16 shentsize; /* 1セクションヘッダのサイズ */
u16 process; /* 再配置状況 */ u16 process; /* 再配置状況 */
ELShdrEx* ShdrEx; /* ShdrExリストの先頭 */ ELShdrEx* ShdrEx; /* ShdrExリストの先頭 */
Elf32_Ehdr CurrentEhdr; /* ELFヘッダ */ Elf32_Ehdr CurrentEhdr; /* ELFヘッダ */
Elf32_Rel Rel; /* 再配置エントリ */ Elf32_Rel Rel; /* 再配置エントリ */
Elf32_Rela Rela; Elf32_Rela Rela;
Elf32_Sym Sym; /* シンボルエントリ */ Elf32_Sym Sym; /* シンボルエントリ */
Elf32_Shdr SymShdr; Elf32_Shdr SymShdr;
ELSymEx* SymEx; /* SymExリストの先頭 */ ELSymEx* SymEx; /* SymExリストの先頭 */
ELSymEx** SymExTbl; /* SymExアドレスのテーブル全シンボル数ぶん*/ ELSymEx** SymExTbl; /* SymExアドレスのテーブル全シンボル数ぶん*/
u32 SymExTarget; /* SymExリストを構築したシンボルセクションのセクション番号 */ u32 SymExTarget; /* SymExリストを構築したシンボルセクションのセクション番号 */
ELi_ReadFunc ELi_ReadStub; /* リードスタブ関数 */ ELi_ReadFunc ELi_ReadStub; /* リードスタブ関数 */
void* FileStruct; /* ファイル構造体 */ void* FileStruct; /* ファイル構造体 */
u32 mem_adr; /*最初にロードされたセクションのsh_addrが入る(DSのROMヘッダ用パラメータ)*/ u32 mem_adr; /*最初にロードされたセクションのsh_addrが入る(DSのROMヘッダ用パラメータ)*/
u32 newelf_size; u32 newelf_size;
}ELHandle; }ELHandle;
@ -86,11 +86,11 @@ typedef struct {
-----------------------------------------------------*/ -----------------------------------------------------*/
typedef struct { typedef struct {
void* next; /*次のアドレスエントリ*/ void* next; /*次のアドレスエントリ*/
char* name; /*文字列*/ char* name; /*文字列*/
void* adr; /*アドレス*/ void* adr; /*アドレス*/
u16 func_flag; /*0:データ、1:関数*/ u16 func_flag; /*0:データ、1:関数*/
u16 thumb_flag; /*0:armコード、1:thumbコード*/ u16 thumb_flag; /*0:armコード、1:thumbコード*/
}ELAdrEntry; }ELAdrEntry;
@ -102,25 +102,25 @@ typedef struct {
T_ = (u32)(AdrEntry.thumb_flag); T_ = (u32)(AdrEntry.thumb_flag);
-----------------------------------------------------*/ -----------------------------------------------------*/
typedef struct { typedef struct {
void* next; /*次のエントリ*/ void* next; /*次のエントリ*/
char* sym_str; /*未解決の外部参照シンボル名*/ char* sym_str; /*未解決の外部参照シンボル名*/
u32 r_type; /*リロケーションタイプELF32_R_TYPE( Rela.r_info)*/ u32 r_type; /*リロケーションタイプELF32_R_TYPE( Rela.r_info)*/
u32 S_; /*未解決の外部参照シンボルアドレス*/ u32 S_; /*未解決の外部参照シンボルアドレス*/
s32 A_; /*解決済み*/ s32 A_; /*解決済み*/
u32 P_; /*解決済み*/ u32 P_; /*解決済み*/
u32 T_; /*未解決の外部参照シンボルのARM/Thumbフラグ*/ u32 T_; /*未解決の外部参照シンボルのARM/Thumbフラグ*/
u32 sh_type; /*SHT_REL or SHT_RELA*/ u32 sh_type; /*SHT_REL or SHT_RELA*/
u32 remove_flag; /*解決したときにセットする(消しても良いことを識別する)フラグ*/ u32 remove_flag; /*解決したときにセットする(消しても良いことを識別する)フラグ*/
ELAdrEntry* AdrEnt; /*アドレステーブルから探し出したエントリの場所*/ ELAdrEntry* AdrEnt; /*アドレステーブルから探し出したエントリの場所*/
}ELUnresolvedEntry; }ELUnresolvedEntry;
/* ELHandle の process値 */ /* ELHandle の process値 */
#define EL_FAILED 0x00 #define EL_FAILED 0x00
#define EL_INITIALIZED 0x5A #define EL_INITIALIZED 0x5A
#define EL_COPIED 0xF0 #define EL_COPIED 0xF0
#define EL_RELOCATED 0xF1 #define EL_RELOCATED 0xF1

View File

@ -52,12 +52,12 @@ u32 ELi_ALIGN( u32 addr, u32 align_size)
-----------------------------------------------------*/ -----------------------------------------------------*/
void* ELi_CopySymStrToBuffer( ELHandle* ElfHandle, ELShdrEx* SymStrShdrEx) void* ELi_CopySymStrToBuffer( ELHandle* ElfHandle, ELShdrEx* SymStrShdrEx)
{ {
u32 load_start, i; u32 load_start;
/*アラインメントをとる*/ /*アラインメントをとる*/
load_start = ELi_ALIGN( ((u32)(ElfHandle->buf_current)), 4); load_start = ELi_ALIGN( ((u32)(ElfHandle->buf_current)), 4);
memcpy( load_start, SymStrShdrEx->str_table, SymStrShdrEx->str_table_size); memcpy( (void*)load_start, SymStrShdrEx->str_table, SymStrShdrEx->str_table_size);
/*セクションヘッダのサイズ修正*/ /*セクションヘッダのサイズ修正*/
SymStrShdrEx->Shdr.sh_size = SymStrShdrEx->str_table_size; SymStrShdrEx->Shdr.sh_size = SymStrShdrEx->str_table_size;
@ -87,7 +87,7 @@ void* ELi_CopyShStrToBuffer( ELHandle* ElfHandle, Elf32_Shdr* Shdr)
if( CurrentShdrEx->debug_flag == 1) { if( CurrentShdrEx->debug_flag == 1) {
}else{ }else{
CurrentShdrEx->Shdr.sh_name = total_size; CurrentShdrEx->Shdr.sh_name = total_size;
strcpy( load_start+total_size, CurrentShdrEx->str); strcpy( (void*)(load_start+total_size), CurrentShdrEx->str);
total_size += (strlen( CurrentShdrEx->str) + 1); total_size += (strlen( CurrentShdrEx->str) + 1);
} }
} }
@ -292,6 +292,7 @@ void ELi_BuildSymList( ELHandle* elElfDesc, u32 symsh_index, u32** sym_table)
/*シンボルエントリをコピー*/ /*シンボルエントリをコピー*/
ELi_GetEntry( elElfDesc, &SymShdr, i, &TestSym); ELi_GetEntry( elElfDesc, &SymShdr, i, &TestSym);
/*-- デバッグ情報フラグをセット --*/ /*-- デバッグ情報フラグをセット --*/
CurrentShdrEx = ELi_GetShdrExfromList( elElfDesc->ShdrEx, TestSym.st_shndx); CurrentShdrEx = ELi_GetShdrExfromList( elElfDesc->ShdrEx, TestSym.st_shndx);
if( CurrentShdrEx) { if( CurrentShdrEx) {

View File

@ -52,22 +52,22 @@ u16 unresolved_table_block_flag = 0;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int i, j, k; int i;
int n; // int n;
int narg; // int narg;
int t; // int t;
FILE *FHp; FILE *FHp;
u32 *elfbuf; // u32 *elfbuf;
u32* newelfbuf; u32* newelfbuf;
u32 elfsize; u32 elfsize;
u32 mainp_malloc_size, subp_malloc_size; // u32 mainp_malloc_size, subp_malloc_size;
size_t filesize; // size_t filesize;
ELHandle ElfH; ELHandle ElfH;
u32 loadstart, loadend, loadsize, ramadr; // u32 loadstart, loadend, loadsize, ramadr;
u32 entry_address, ram_address; // u32 entry_address, ram_address;
u32 sub_loadstart, sub_loadend, sub_loadsize, sub_ramadr; // u32 sub_loadstart, sub_loadend, sub_loadsize, sub_ramadr;
u32 sub_entry_address, sub_ram_address;; // u32 sub_entry_address, sub_ram_address;;
u32 header_buf[DS_ROM_HEADER_SIZE/4]; // u32 header_buf[DS_ROM_HEADER_SIZE/4];
char* elf_filename; char* elf_filename;
u32 elf_namesize; u32 elf_namesize;
char* slash_pointer; char* slash_pointer;
@ -122,7 +122,7 @@ int main(int argc, char *argv[])
fseek( FHp, 0, SEEK_SET); fseek( FHp, 0, SEEK_SET);
newelfbuf = (u32*)malloc( elfsize); newelfbuf = (u32*)malloc( elfsize);
printf( "input elf size = 0x%x\n", elfsize); printf( "input elf size = 0x%x\n", (int)elfsize);
EL_InitHandle( &ElfH); EL_InitHandle( &ElfH);
result = EL_LoadLibraryfromFile( &ElfH, FHp, newelfbuf); result = EL_LoadLibraryfromFile( &ElfH, FHp, newelfbuf);
@ -163,7 +163,7 @@ int main(int argc, char *argv[])
exit( 1); exit( 1);
} }
printf( "stripped elf size = 0x%x\n", ElfH.newelf_size); printf( "stripped elf size = 0x%x\n", (int)(ElfH.newelf_size));
fwrite( newelfbuf, 1, ElfH.newelf_size, NewElfFilep); fwrite( newelfbuf, 1, ElfH.newelf_size, NewElfFilep);
fclose( NewElfFilep); fclose( NewElfFilep);