From 00f83c526a77b0ed837604293d924f6f6787d222 Mon Sep 17 00:00:00 2001 From: shirait Date: Fri, 13 Jul 2007 04:35:04 +0000 Subject: [PATCH] fix stripdebug git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@189 4ee2a332-4b2b-5046-8439-1ba90f034370 --- tools/stripdebug/arch.h | 4 +- tools/stripdebug/elf.c | 10 +- tools/stripdebug/elf.h | 236 +++++++++++++++---------------- tools/stripdebug/elf_loader.c | 73 ++++++---- tools/stripdebug/elf_loader.h | 106 +++++++------- tools/stripdebug/loader_subset.c | 7 +- tools/stripdebug/stripdebug.c | 28 ++-- 7 files changed, 240 insertions(+), 224 deletions(-) diff --git a/tools/stripdebug/arch.h b/tools/stripdebug/arch.h index e853787..cd550ad 100644 --- a/tools/stripdebug/arch.h +++ b/tools/stripdebug/arch.h @@ -6,7 +6,7 @@ /*--------------------------------------------------------- Archive Header --------------------------------------------------------*/ -#define ARMAG "!\n" /* magic string */ +#define ARMAG "!\n" /* magic string */ #define SARMAG 8 /* length of magic 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_size[10]; /* file member size - decimal */ char ar_fmag[2]; /* ARFMAG - string to end header */ -}ArchHdr; /* 計60(0x3C)バイト */ +}ArchHdr; /* 計60(0x3C)バイト */ diff --git a/tools/stripdebug/elf.c b/tools/stripdebug/elf.c index bf8348e..495645d 100644 --- a/tools/stripdebug/elf.c +++ b/tools/stripdebug/elf.c @@ -7,9 +7,10 @@ #include 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; } +#endif /*--------------------------------------------------------- ハーフワードデータを読み出す @@ -47,6 +49,7 @@ static u8 *load_elf32_half(Elf32_Half *dest, u8 *org, int lsb) 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; } +#endif /*--------------------------------------------------------- ELFヘッダを読み出す @@ -247,7 +251,7 @@ void *ELF_LoadELFHeader(const void *buf, Elf32_Ehdr *ehdr) return file_ptr; } - +#if 0 /*--------------------------------------------------------- Relocation Entry Load --------------------------------------------------------*/ @@ -335,6 +339,6 @@ static void *ELF_LoadSectionHeader(const void *buf,Elf32_Shdr *shdr) return file_ptr; } - +#endif diff --git a/tools/stripdebug/elf.h b/tools/stripdebug/elf.h index 6bdc904..8fa54a1 100644 --- a/tools/stripdebug/elf.h +++ b/tools/stripdebug/elf.h @@ -6,25 +6,25 @@ /*--------------------------------------------------------- 型定義 --------------------------------------------------------*/ -typedef u32 Elf32_Addr; /* size:4, align:4 Unsigned program address */ -typedef u16 Elf32_Half; /* size:2, align:2 Unsigned medium int */ -typedef u32 Elf32_Off; /* size:4, align:4 Unsigned file offset */ -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_Addr; /* size:4, align:4 Unsigned program address */ +typedef u16 Elf32_Half; /* size:2, align:2 Unsigned medium int */ +typedef u32 Elf32_Off; /* size:4, align:4 Unsigned file offset */ +typedef s32 Elf32_Sword; /* size:4, align:4 Signed large int */ +typedef u32 Elf32_Word; /* size:4, align:4 Unsigned large int */ /*--------------------------------------------------------- ELF Header --------------------------------------------------------*/ /* e_identのインデックス */ -#define EI_MAG0 0 /* File identification */ -#define EI_MAG1 1 /* File identification */ -#define EI_MAG2 2 /* File identification */ -#define EI_MAG3 3 /* File identification */ -#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_VERSION 6 /* File version 現在は1 */ -#define EI_PAD 7 /* Start of padding bytes */ -#define EI_NIDENT 16 /* Size of e_ident[] */ +#define EI_MAG0 0 /* File identification */ +#define EI_MAG1 1 /* File identification */ +#define EI_MAG2 2 /* File identification */ +#define EI_MAG3 3 /* File identification */ +#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_VERSION 6 /* File version 現在は1 */ +#define EI_PAD 7 /* Start of padding bytes */ +#define EI_NIDENT 16 /* Size of e_ident[] */ typedef struct { unsigned char e_ident[EI_NIDENT]; @@ -44,29 +44,29 @@ typedef struct { } Elf32_Ehdr; /* e_ident[EI_*]の中身定義 */ -#define ELFMAG0 0x7f -#define ELFMAG1 'E' -#define ELFMAG2 'L' -#define ELFMAG3 'F' -#define ELFCLASSNONE 0 /* invalid */ -#define ELFCLASS32 1 /* ARM and Thumb processors use 32-bit ELF. */ -#define ELFCLASS64 2 -#define ELFDATANONE 0 /* invalid */ -#define ELFDATA2LSB 1 /* little-endian */ -#define ELFDATA2MSB 2 /* big-endian */ +#define ELFMAG0 0x7f +#define ELFMAG1 'E' +#define ELFMAG2 'L' +#define ELFMAG3 'F' +#define ELFCLASSNONE 0 /* invalid */ +#define ELFCLASS32 1 /* ARM and Thumb processors use 32-bit ELF. */ +#define ELFCLASS64 2 +#define ELFDATANONE 0 /* invalid */ +#define ELFDATA2LSB 1 /* little-endian */ +#define ELFDATA2MSB 2 /* big-endian */ /* [e_type] */ -#define ET_NONE 0 /* No file type */ -#define ET_REL 1 /* Re-locatable file */ -#define ET_EXEC 2 /* Executable file */ -#define ET_DYN 3 /* Shared object file */ -#define ET_CORE 4 /* Core file */ -#define ET_LOPROC 0xff00 /* Processor-specific */ -#define ET_HIPROC 0xffff /* Processor-specific */ +#define ET_NONE 0 /* No file type */ +#define ET_REL 1 /* Re-locatable file */ +#define ET_EXEC 2 /* Executable file */ +#define ET_DYN 3 /* Shared object file */ +#define ET_CORE 4 /* Core file */ +#define ET_LOPROC 0xff00 /* Processor-specific */ +#define ET_HIPROC 0xffff /* Processor-specific */ /* [e_machine] */ -#define EM_NONE 0 /* No machine */ +#define EM_NONE 0 /* No machine */ #define EM_M32 1 #define EM_SPARC 2 #define EM_386 3 @@ -75,12 +75,12 @@ typedef struct { #define EM_860 7 #define EM_MIPS 8 #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.*/ -#define EV_NONE 0 /* Invalid version */ -#define EV_CURRENT 1 /* Current version */ +#define EV_NONE 0 /* Invalid version */ +#define EV_CURRENT 1 /* Current version */ /* @@ -147,16 +147,16 @@ enum { Section headers --------------------------------------------------------*/ typedef struct { - Elf32_Word sh_name; /*セクションヘッダ文字列テーブルセクションのエントリのインデックス*/ - Elf32_Word sh_type; /* タイプ(下記定義参照) */ - Elf32_Word sh_flags; - Elf32_Addr sh_addr; /* */ - Elf32_Off sh_offset; /* ファイルの先頭からのオフセット */ - Elf32_Word sh_size; /* バイト単位のサイズ */ - Elf32_Word sh_link; /* sh_typeによって値の意味が変わる */ - Elf32_Word sh_info; /* sh_typeによって値の意味が変わる */ - Elf32_Word sh_addralign; /* アラインメント制限(0or1で制限なし,4で4ByteAlign) */ - Elf32_Word sh_entsize; /* 固定サイズのエントリテーブルがある場合、1要素のサイズ */ + Elf32_Word sh_name; /*セクションヘッダ文字列テーブルセクションのエントリのインデックス*/ + Elf32_Word sh_type; /* タイプ(下記定義参照) */ + Elf32_Word sh_flags; + Elf32_Addr sh_addr; /* */ + Elf32_Off sh_offset; /* ファイルの先頭からのオフセット */ + Elf32_Word sh_size; /* バイト単位のサイズ */ + Elf32_Word sh_link; /* sh_typeによって値の意味が変わる */ + Elf32_Word sh_info; /* sh_typeによって値の意味が変わる */ + Elf32_Word sh_addralign; /* アラインメント制限(0or1で制限なし,4で4ByteAlign) */ + Elf32_Word sh_entsize; /* 固定サイズのエントリテーブルがある場合、1要素のサイズ */ } Elf32_Shdr; /* sh_addr mod sh_addralign = 0 でなければならない */ @@ -191,13 +191,13 @@ typedef struct { /*セクションインデックス*/ //Sym->st_shndxなど -#define SHN_UNDEF 0 -#define SHN_LORESERVE 0xff00 -#define SHN_LOPROC 0xff00 -#define SHN_HIPROC 0xff1f -#define SHN_ABS 0xfff1 -#define SHN_COMMON 0xfff2 -#define SHN_HIRESERVE 0xffff +#define SHN_UNDEF 0 +#define SHN_LORESERVE 0xff00 +#define SHN_LOPROC 0xff00 +#define SHN_HIPROC 0xff1f +#define SHN_ABS 0xfff1 +#define SHN_COMMON 0xfff2 +#define SHN_HIRESERVE 0xffff //ここからはヘッダでなく実体データ構造 @@ -206,12 +206,12 @@ typedef struct { Symbol Table Entry --------------------------------------------------------*/ typedef struct { - Elf32_Word st_name; /* シンボル文字列テーブルのインデックス */ - Elf32_Addr st_value; /* おそらく関連するセクション内でのオフセット値 */ - Elf32_Word st_size; /* サイズがないか、不明な場合は 0 */ - unsigned char st_info; /* バインド と タイプ */ - unsigned char st_other; /* 現在は 0 が入る */ - Elf32_Half st_shndx; /* 関連するセクションヘッダテーブルのインデックス */ + Elf32_Word st_name; /* シンボル文字列テーブルのインデックス */ + Elf32_Addr st_value; /* おそらく関連するセクション内でのオフセット値 */ + Elf32_Word st_size; /* サイズがないか、不明な場合は 0 */ + unsigned char st_info; /* バインド と タイプ */ + unsigned char st_other; /* 現在は 0 が入る */ + Elf32_Half st_shndx; /* 関連するセクションヘッダテーブルのインデックス */ } Elf32_Sym; @@ -221,21 +221,21 @@ typedef struct { #define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf)) /* st_info の BIND */ -#define STB_LOCAL 0 -#define STB_GLOBAL 1 -#define STB_WEAK 2 -#define STB_LOPROC 13 -#define STB_MW_SPECIFIC 14 /*NITROアプリで出てくる(例:OS_TPrintf)*/ -#define STB_HIPROC 15 +#define STB_LOCAL 0 +#define STB_GLOBAL 1 +#define STB_WEAK 2 +#define STB_LOPROC 13 +#define STB_MW_SPECIFIC 14 /*NITROアプリで出てくる(例:OS_TPrintf)*/ +#define STB_HIPROC 15 /* st_info の TYPE */ -#define STT_NOTYPE 0 /*未定義*/ -#define STT_OBJECT 1 /*データオブジェクト*/ -#define STT_FUNC 2 -#define STT_SECTION 3 -#define STT_FILE 4 -#define STT_LOPROC 13 -#define STT_HIPROC 15 +#define STT_NOTYPE 0 /*未定義*/ +#define STT_OBJECT 1 /*データオブジェクト*/ +#define STT_FUNC 2 +#define STT_SECTION 3 +#define STT_FILE 4 +#define STT_LOPROC 13 +#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_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 - relocation directives. The ARM EABI poses two problems for relocating - executables and shared objects encoded in */ + relocation directives. The ARM EABI poses two problems for relocating + executables and shared objects encoded in */ // 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_JUMP24 29 //B/BL -#define R_ARM_THM_JUMP24 30 +#define R_ARM_CALL 28 //BL/BLX +#define R_ARM_JUMP24 29 //B/BL +#define R_ARM_THM_JUMP24 30 -#define R_ARM_MOVW_ABS_NC 43 //MOVW -#define R_ARM_MOVT_ABS 44 //MOVT -#define R_ARM_MOVW_PREL_NC 45 //MOVW -#define R_ARM_MOVT_PREL 46 //MOVT +#define R_ARM_MOVW_ABS_NC 43 //MOVW +#define R_ARM_MOVT_ABS 44 //MOVT +#define R_ARM_MOVW_PREL_NC 45 //MOVW +#define R_ARM_MOVT_PREL 46 //MOVT -#define R_ARM_ALU_PC_G0_NC 57 //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 60 //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_G2 63 //LDR, STR, LDRB, STRB -#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_G2 66 //LDRD, STRD, LDRH, STRH, LDRSH, LDRSB -#define R_ARM_LDC_PC_G0 67 //LDC, STC -#define R_ARM_LDC_PC_G1 68 //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 71 //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_G2 74 //ADD, SUB -#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_G2 77 //LDR, STR, LDRB, STRB -#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_G2 80 //LDRD, STRD, LDRH, STRH, LDRSH, LDRSB -#define R_ARM_LDC_SB_G0 81 //LDC, STC -#define R_ARM_LDC_SB_G1 82 //LDC, STC -#define R_ARM_LDC_SB_G2 83 //LDC, STC -#define R_ARM_MOVW_BREL_NC 84 //MOVW -#define R_ARM_MOVT_BREL 85 //MOVT -#define R_ARM_MOVW_BREL 86 //MOVW +#define R_ARM_ALU_PC_G0_NC 57 //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 60 //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_G2 63 //LDR, STR, LDRB, STRB +#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_G2 66 //LDRD, STRD, LDRH, STRH, LDRSH, LDRSB +#define R_ARM_LDC_PC_G0 67 //LDC, STC +#define R_ARM_LDC_PC_G1 68 //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 71 //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_G2 74 //ADD, SUB +#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_G2 77 //LDR, STR, LDRB, STRB +#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_G2 80 //LDRD, STRD, LDRH, STRH, LDRSH, LDRSB +#define R_ARM_LDC_SB_G0 81 //LDC, STC +#define R_ARM_LDC_SB_G1 82 //LDC, STC +#define R_ARM_LDC_SB_G2 83 //LDC, STC +#define R_ARM_MOVW_BREL_NC 84 //MOVW +#define R_ARM_MOVT_BREL 85 //MOVT +#define R_ARM_MOVW_BREL 86 //MOVW -#define R_ARM_GOT_BREL12 97 //LDR -#define R_ARM_GOTOFF12 98 //LDR, STR +#define R_ARM_GOT_BREL12 97 //LDR +#define R_ARM_GOTOFF12 98 //LDR, STR -#define R_ARM_TLS_LDO12 109 //LDR, STR -#define R_ARM_TLS_LE12 110 //LDR, STR -#define R_ARM_TLS_TE12GP 111 //LDR +#define R_ARM_TLS_LDO12 109 //LDR, STR +#define R_ARM_TLS_LE12 110 //LDR, STR +#define R_ARM_TLS_TE12GP 111 //LDR diff --git a/tools/stripdebug/elf_loader.c b/tools/stripdebug/elf_loader.c index 8991495..8f6569c 100644 --- a/tools/stripdebug/elf_loader.c +++ b/tools/stripdebug/elf_loader.c @@ -199,15 +199,17 @@ u16 ELi_LoadLibrary( ELHandle* ElfHandle, void* obj_image, u32 obj_len, void* bu newarch_size += 8; - ElfHandle->buf_current = new_image_pointer; + ElfHandle->buf_current = (void*)new_image_pointer; 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の文字列を取得*/ if( strncmp( OBJMAG, ELFMAG, 4) == 0) { 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), - new_image_pointer + arch_size); + (void*)(new_image_pointer + arch_size)); // (ElfHandle->buf_current + arch_size)); 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->process = EL_INITIALIZED; /*フラグの設定*/ }else{ - ElfHandle->ELi_ReadStub( new_image_pointer, ElfHandle->FileStruct, (u32)(obj_image), - image_pointer, arch_size+AR_GetEntrySize( &ArHdr)); //arヘッダとエントリをstripped elfにコピー + memcpy( (void*)new_image_pointer, (const void*)&ArHdr, arch_size); //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); 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); } 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 i, j; - u32 num_of_entry; +// u32 num_of_entry; ELShdrEx* FwdShdrEx; ELShdrEx* CurrentShdrEx; ELShdrEx DmyShdrEx; - char sym_str[128]; //デバッグプリント用 - u32 offset; //デバッグプリント用 +// char sym_str[128]; //デバッグプリント用 +// u32 offset; //デバッグプリント用 u32 newelf_shoff = 0; //stripped elfイメージへの書き込みポインタ u32 buf_shdr; u32 section_num = 0; - u32 newelf_size; +// u32 newelf_size; u32 tmp_buf; u32 *shdr_table; //セクションヘッダ新旧番号対応テーブル - u32 *sym_table; //シンボルエントリ新旧番号対応テーブル - +// u32 *sym_table; //シンボルエントリ新旧番号対応テーブル /* ELHandleの初期化チェック */ if( ElfHandle->process != EL_INITIALIZED) { return EL_FAILED; @@ -286,13 +290,12 @@ u16 ELi_LoadObject( ELHandle* ElfHandle, void* obj_offset, void* buf) /* セクションハンドル構築 */ 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; /*セクションヘッダテーブル構築*/ shdr_table = (u32*)malloc( 4 * ElfHandle->CurrentEhdr.e_shnum); - - + /*---------- ELShdrExのリストとshdr_tableを作る ----------*/ CurrentShdrEx = &DmyShdrEx; 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)); CurrentShdrEx->debug_flag = 0; 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++; /*セクション文字列を取得しておく*/ CurrentShdrEx->str = (char*)malloc( 128); //128文字バッファ取得 @@ -322,7 +325,7 @@ u16 ELi_LoadObject( ELHandle* ElfHandle, void* obj_offset, void* buf) ElfHandle->ShdrEx = DmyShdrEx.next; /*--------------------------------------------------------*/ - + /*---------- 全セクションを調べてコピーする ----------*/ // printf( "\nLoad to RAM:\n"); 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++; - 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; }/*-------------------------------------*/ /*--- シンボルテーブルセクションヘッダの更新 ---*/ - CurrentShdrEx->loaded_adr = ELi_CopySymToBuffer( ElfHandle); - CurrentShdrEx->Shdr.sh_link = shdr_table[CurrentShdrEx->Shdr.sh_link]; //文字列セクション番号更新 + CurrentShdrEx->loaded_adr = (u32)(ELi_CopySymToBuffer( ElfHandle)); + 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); /*----------------------------------------------*/ } - ELi_FreeSymList( ElfHandle, CurrentShdrEx->sym_table); //シンボルリスト開放 + ELi_FreeSymList( ElfHandle, (u32**)(CurrentShdrEx->sym_table)); //シンボルリスト開放 } /* 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にコピー ----------*/ 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 = 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イメージにコピー*/ /*-----------------------------------*/ - + /*---------- 再配置 ----------*/ /* if( unresolved_table_block_flag == 0) { if( dbg_print_flag == 1) { @@ -659,10 +668,10 @@ u16 EL_ResolveAllLibrary( void) ELAdrEntry* AdrEnt; ELUnresolvedEntry* RemoveUnrEnt; ELUnresolvedEntry* UnrEnt; - ELUnresolvedEntry* CurrentUnrEnt; - ELUnresolvedEntry* FwdUnrEnt; - u32 relocation_val; - ELAdrEntry AddAdrEnt; +// ELUnresolvedEntry* CurrentUnrEnt; +// ELUnresolvedEntry* FwdUnrEnt; +// u32 relocation_val; +// ELAdrEntry AddAdrEnt; char sym_str[128]; UnrEnt = ELUnrEntStart; @@ -683,7 +692,7 @@ u16 EL_ResolveAllLibrary( void) // ELi_RemoveUnresolvedEntry( UnrEnt); //解決したので未解決リストから削除 }else{ 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->remove_flag = 2; //マーキング(makelstだけで使用する特別な値) @@ -836,7 +845,7 @@ void* EL_GetGlobalAdr( char* ent_name) return (void*)(adr); } - +#if 0 /*------------------------------------------------------ アドレステーブルを解放する(アプリケーションが登録したエントリまで削除しようとするのでNG) -----------------------------------------------------*/ @@ -858,12 +867,14 @@ void* EL_FreeAdrTbl( void) } /*------------------------------------*/ } +#endif /*------------------------------------------------------ ELFオブジェクトからデータを読み出すスタブ -----------------------------------------------------*/ 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); fread( buf, 1, size, file_struct); diff --git a/tools/stripdebug/elf_loader.h b/tools/stripdebug/elf_loader.h index 634c987..35b8a2c 100644 --- a/tools/stripdebug/elf_loader.h +++ b/tools/stripdebug/elf_loader.h @@ -22,17 +22,17 @@ セクションヘッダ拡張(ロードアドレス等に対応) -----------------------------------------------------*/ typedef struct { - void* next; - u16 index; - u16 debug_flag; /*0:デバッグ情報でない、1:デバッグ情報*/ - u32 loaded_adr; - u32 alloc_adr; - u32 loaded_size; - Elf32_Shdr Shdr; - char* str; /*セクション名文字列をコピーしてきたもの*/ - u32* sym_table; /*シンボルセクションのとき有効な新旧対応表*/ - void* str_table; /*STRセクションのとき有効:新文字列テーブル*/ - u32 str_table_size; /*STRセクションのとき有効:新文字列テーブルのサイズ*/ + void* next; + u16 index; + u16 debug_flag; /*0:デバッグ情報でない、1:デバッグ情報*/ + u32 loaded_adr; + u32 alloc_adr; + u32 loaded_size; + Elf32_Shdr Shdr; + char* str; /*セクション名文字列をコピーしてきたもの*/ + u32* sym_table; /*シンボルセクションのとき有効な新旧対応表*/ + void* str_table; /*STRセクションのとき有効:新文字列テーブル*/ + u32 str_table_size; /*STRセクションのとき有効:新文字列テーブルのサイズ*/ }ELShdrEx; @@ -40,11 +40,11 @@ typedef struct { シンボルエントリ拡張(ロードアドレス等に対応) -----------------------------------------------------*/ typedef struct { - void* next; - u16 debug_flag; /*0:デバッグ情報でない、1:デバッグ情報*/ - u16 thumb_flag; - u32 relocation_val; - Elf32_Sym Sym; + void* next; + u16 debug_flag; /*0:デバッグ情報でない、1:デバッグ情報*/ + u16 thumb_flag; + u32 relocation_val; + Elf32_Sym Sym; }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 struct { - void* ar_head; /* ARまたはELFファイルの先頭アドレス */ - void* elf_offset; /* ELFオブジェクトの先頭へのオフセット */ - void* buf_current; /* Loader作業用 */ - u16 shentsize; /* 1セクションヘッダのサイズ */ - u16 process; /* 再配置状況 */ + void* ar_head; /* ARまたはELFファイルの先頭アドレス */ + void* elf_offset; /* ELFオブジェクトの先頭へのオフセット */ + void* buf_current; /* Loader作業用 */ + u16 shentsize; /* 1セクションヘッダのサイズ */ + u16 process; /* 再配置状況 */ - ELShdrEx* ShdrEx; /* ShdrExリストの先頭 */ + ELShdrEx* ShdrEx; /* ShdrExリストの先頭 */ - Elf32_Ehdr CurrentEhdr; /* ELFヘッダ */ + Elf32_Ehdr CurrentEhdr; /* ELFヘッダ */ - Elf32_Rel Rel; /* 再配置エントリ */ - Elf32_Rela Rela; - Elf32_Sym Sym; /* シンボルエントリ */ - Elf32_Shdr SymShdr; + Elf32_Rel Rel; /* 再配置エントリ */ + Elf32_Rela Rela; + Elf32_Sym Sym; /* シンボルエントリ */ + Elf32_Shdr SymShdr; - ELSymEx* SymEx; /* SymExリストの先頭 */ - ELSymEx** SymExTbl; /* SymExアドレスのテーブル(全シンボル数ぶん)*/ - u32 SymExTarget; /* SymExリストを構築したシンボルセクションのセクション番号 */ + ELSymEx* SymEx; /* SymExリストの先頭 */ + ELSymEx** SymExTbl; /* SymExアドレスのテーブル(全シンボル数ぶん)*/ + u32 SymExTarget; /* SymExリストを構築したシンボルセクションのセクション番号 */ - ELi_ReadFunc ELi_ReadStub; /* リードスタブ関数 */ - void* FileStruct; /* ファイル構造体 */ + ELi_ReadFunc ELi_ReadStub; /* リードスタブ関数 */ + void* FileStruct; /* ファイル構造体 */ - u32 mem_adr; /*最初にロードされたセクションのsh_addrが入る(DSのROMヘッダ用パラメータ)*/ - u32 newelf_size; + u32 mem_adr; /*最初にロードされたセクションのsh_addrが入る(DSのROMヘッダ用パラメータ)*/ + u32 newelf_size; }ELHandle; @@ -86,11 +86,11 @@ typedef struct { アドレステーブル -----------------------------------------------------*/ typedef struct { - void* next; /*次のアドレスエントリ*/ - char* name; /*文字列*/ - void* adr; /*アドレス*/ - u16 func_flag; /*0:データ、1:関数*/ - u16 thumb_flag; /*0:armコード、1:thumbコード*/ + void* next; /*次のアドレスエントリ*/ + char* name; /*文字列*/ + void* adr; /*アドレス*/ + u16 func_flag; /*0:データ、1:関数*/ + u16 thumb_flag; /*0:armコード、1:thumbコード*/ }ELAdrEntry; @@ -102,25 +102,25 @@ typedef struct { T_ = (u32)(AdrEntry.thumb_flag); -----------------------------------------------------*/ typedef struct { - void* next; /*次のエントリ*/ - char* sym_str; /*未解決の外部参照シンボル名*/ - u32 r_type; /*リロケーションタイプ(ELF32_R_TYPE( Rela.r_info))*/ - u32 S_; /*未解決の外部参照シンボルアドレス*/ - s32 A_; /*解決済み*/ - u32 P_; /*解決済み*/ - u32 T_; /*未解決の外部参照シンボルのARM/Thumbフラグ*/ - u32 sh_type; /*SHT_REL or SHT_RELA*/ - u32 remove_flag; /*解決したときにセットする(消しても良いことを識別する)フラグ*/ - ELAdrEntry* AdrEnt; /*アドレステーブルから探し出したエントリの場所*/ + void* next; /*次のエントリ*/ + char* sym_str; /*未解決の外部参照シンボル名*/ + u32 r_type; /*リロケーションタイプ(ELF32_R_TYPE( Rela.r_info))*/ + u32 S_; /*未解決の外部参照シンボルアドレス*/ + s32 A_; /*解決済み*/ + u32 P_; /*解決済み*/ + u32 T_; /*未解決の外部参照シンボルのARM/Thumbフラグ*/ + u32 sh_type; /*SHT_REL or SHT_RELA*/ + u32 remove_flag; /*解決したときにセットする(消しても良いことを識別する)フラグ*/ + ELAdrEntry* AdrEnt; /*アドレステーブルから探し出したエントリの場所*/ }ELUnresolvedEntry; /* ELHandle の process値 */ -#define EL_FAILED 0x00 -#define EL_INITIALIZED 0x5A -#define EL_COPIED 0xF0 -#define EL_RELOCATED 0xF1 +#define EL_FAILED 0x00 +#define EL_INITIALIZED 0x5A +#define EL_COPIED 0xF0 +#define EL_RELOCATED 0xF1 diff --git a/tools/stripdebug/loader_subset.c b/tools/stripdebug/loader_subset.c index 887b698..f524f05 100644 --- a/tools/stripdebug/loader_subset.c +++ b/tools/stripdebug/loader_subset.c @@ -52,12 +52,12 @@ u32 ELi_ALIGN( u32 addr, u32 align_size) -----------------------------------------------------*/ void* ELi_CopySymStrToBuffer( ELHandle* ElfHandle, ELShdrEx* SymStrShdrEx) { - u32 load_start, i; + u32 load_start; /*アラインメントをとる*/ 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; @@ -87,7 +87,7 @@ void* ELi_CopyShStrToBuffer( ELHandle* ElfHandle, Elf32_Shdr* Shdr) if( CurrentShdrEx->debug_flag == 1) { }else{ 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); } } @@ -292,6 +292,7 @@ void ELi_BuildSymList( ELHandle* elElfDesc, u32 symsh_index, u32** sym_table) /*シンボルエントリをコピー*/ ELi_GetEntry( elElfDesc, &SymShdr, i, &TestSym); + /*-- デバッグ情報フラグをセット --*/ CurrentShdrEx = ELi_GetShdrExfromList( elElfDesc->ShdrEx, TestSym.st_shndx); if( CurrentShdrEx) { diff --git a/tools/stripdebug/stripdebug.c b/tools/stripdebug/stripdebug.c index c04aa03..40855ba 100644 --- a/tools/stripdebug/stripdebug.c +++ b/tools/stripdebug/stripdebug.c @@ -52,22 +52,22 @@ u16 unresolved_table_block_flag = 0; int main(int argc, char *argv[]) { - int i, j, k; - int n; - int narg; - int t; + int i; +// int n; +// int narg; +// int t; FILE *FHp; - u32 *elfbuf; +// u32 *elfbuf; u32* newelfbuf; u32 elfsize; - u32 mainp_malloc_size, subp_malloc_size; - size_t filesize; +// u32 mainp_malloc_size, subp_malloc_size; +// size_t filesize; ELHandle ElfH; - u32 loadstart, loadend, loadsize, ramadr; - u32 entry_address, ram_address; - u32 sub_loadstart, sub_loadend, sub_loadsize, sub_ramadr; - u32 sub_entry_address, sub_ram_address;; - u32 header_buf[DS_ROM_HEADER_SIZE/4]; +// u32 loadstart, loadend, loadsize, ramadr; +// u32 entry_address, ram_address; +// u32 sub_loadstart, sub_loadend, sub_loadsize, sub_ramadr; +// u32 sub_entry_address, sub_ram_address;; +// u32 header_buf[DS_ROM_HEADER_SIZE/4]; char* elf_filename; u32 elf_namesize; char* slash_pointer; @@ -122,7 +122,7 @@ int main(int argc, char *argv[]) fseek( FHp, 0, SEEK_SET); newelfbuf = (u32*)malloc( elfsize); - printf( "input elf size = 0x%x\n", elfsize); + printf( "input elf size = 0x%x\n", (int)elfsize); EL_InitHandle( &ElfH); result = EL_LoadLibraryfromFile( &ElfH, FHp, newelfbuf); @@ -163,7 +163,7 @@ int main(int argc, char *argv[]) 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); fclose( NewElfFilep);