mirror of
https://github.com/rvtr/twl_wrapsdk.git
synced 2025-10-31 06:11:10 -04:00
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:
parent
177653d5b4
commit
00f83c526a
@ -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)バイト */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
/*------------------------------------------------------
|
/*------------------------------------------------------
|
||||||
アドレステーブルを解放する(アプリケーションが登録したエントリまで削除しようとするのでNG)
|
アドレステーブルを解放する(アプリケーションが登録したエントリまで削除しようとするのでNG)
|
||||||
-----------------------------------------------------*/
|
-----------------------------------------------------*/
|
||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user