diff --git a/tools/makelst/elf.c b/tools/makelst/elf.c index fed91f0..cdc978c 100644 --- a/tools/makelst/elf.c +++ b/tools/makelst/elf.c @@ -8,9 +8,10 @@ #include "stdlib.h" static int endian; -static BOOL load_strndx_done = FALSE; +//static BOOL load_strndx_done = FALSE; +#if 0 /*--------------------------------------------------------- バイトデータを読み出す --------------------------------------------------------*/ @@ -24,6 +25,7 @@ static u8 *load_elf32_byte(u8 *dest, u8 *org, int lsb) return temp_ptr; } +#endif /*--------------------------------------------------------- ハーフワードデータを読み出す @@ -48,6 +50,7 @@ static u8 *load_elf32_half(Elf32_Half *dest, u8 *org, int lsb) return (void *)temp_ptr; } +#if 0 /*--------------------------------------------------------- ワードデータを読み出す --------------------------------------------------------*/ @@ -108,6 +111,7 @@ static u8 *load_elf32_word(Elf32_Word *dest, u8 *org, int lsb) } return (void *)temp_ptr; } +#endif /*--------------------------------------------------------- ELFヘッダを読み出す @@ -249,6 +253,7 @@ void *ELF_LoadELFHeader(const void *buf, Elf32_Ehdr *ehdr) } +#if 0 /*--------------------------------------------------------- Relocation Entry Load --------------------------------------------------------*/ @@ -336,6 +341,6 @@ static void *ELF_LoadSectionHeader(const void *buf,Elf32_Shdr *shdr) return file_ptr; } - +#endif diff --git a/tools/makelst/elf_loader.c b/tools/makelst/elf_loader.c index 24a0180..62685a9 100644 --- a/tools/makelst/elf_loader.c +++ b/tools/makelst/elf_loader.c @@ -1,5 +1,5 @@ /*---------------------------------------------------------------------------* - Project: CTR - ELF Loader + Project: TWL - ELF Loader File: elf_loader.c Copyright 2006,2007 Nintendo. All rights reserved. @@ -25,13 +25,15 @@ ELAdrEntry* ELAdrEntStart = NULL; ELUnresolvedEntry* ELUnrEntStart = NULL; extern u16 dbg_print_flag; -extern u32 unresolved_table_block_flag; +extern u16 unresolved_table_block_flag; #define MAKELST_DS_API " elAddAdrEntry" //DS上でアドレステーブルに追加するAPI関数名 extern char c_source_line_str[256]; extern FILE* CSourceFilep; +extern void file_write( char* c_str, FILE* Fp); + /*------------------------------------------------------ ローカル関数の宣言 @@ -522,7 +524,7 @@ u16 EL_ResolveAllLibrary( void) /*------------------------------------------------------ マーキングされたシンボルを公開用ファイルに構造体として書き出す -----------------------------------------------------*/ -u16 EL_ExtractStaticSym1( void) +void EL_ExtractStaticSym1( void) { // ELAdrEntry* AdrEnt; // ELUnresolvedEntry* RemoveUnrEnt; @@ -608,7 +610,7 @@ u16 EL_ExtractStaticSym1( void) /*------------------------------------------------------ マーキングされたシンボルを公開用ファイルにAPIとして書き出す -----------------------------------------------------*/ -u16 EL_ExtractStaticSym2( void) +void EL_ExtractStaticSym2( void) { // ELAdrEntry* AdrEnt; // ELUnresolvedEntry* RemoveUnrEnt; diff --git a/tools/makelst/elf_loader.h b/tools/makelst/elf_loader.h index 8fa895a..8d91e93 100644 --- a/tools/makelst/elf_loader.h +++ b/tools/makelst/elf_loader.h @@ -1,8 +1,8 @@ /*---------------------------------------------------------------------------* - Project: CTR - ELF Loader + Project: TWL - ELF Loader File: elf_loader.h - Copyright 2006 Nintendo. All rights reserved. + Copyright 2006,2007 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo @@ -151,11 +151,11 @@ u16 EL_ResolveAllLibrary( void); /*------------------------------------------------------ マーキングされたシンボルを公開用ファイルに構造体として書き出す -----------------------------------------------------*/ -u16 EL_ExtractStaticSym1( void); +void EL_ExtractStaticSym1( void); /*------------------------------------------------------ マーキングされたシンボルを公開用ファイルにAPIとして書き出す -----------------------------------------------------*/ -u16 EL_ExtractStaticSym2( void); +void EL_ExtractStaticSym2( void); /*------------------------------------------------------ diff --git a/tools/makelst/loader_subset.c b/tools/makelst/loader_subset.c index c9ffb36..bf7ca78 100644 --- a/tools/makelst/loader_subset.c +++ b/tools/makelst/loader_subset.c @@ -1,5 +1,5 @@ /*---------------------------------------------------------------------------* - Project: CTR - ELF Loader + Project: TWL - ELF Loader File: loader_subset.c Copyright 2006,2007 Nintendo. All rights reserved. @@ -485,9 +485,15 @@ void ELi_DiscriminateGlobalSym( ELHandle* ElfHandle, u32 symsh_index) //MI_CpuCopy8( sym_str, ExportAdrEntry->name, copy_size); memcpy( ExportAdrEntry->name, sym_str, copy_size); - CurrentShdrEx = ELi_GetShdrExfromList( ElfHandle->ShdrEx, CurrentSymEx->Sym.st_shndx); - //Sym.st_valueは偶数/奇数でARM/Thumbを判別できるように調整されている場合があるので、その調整を削除して正味の値を出す - ExportAdrEntry->adr = (void*)(CurrentShdrEx->loaded_adr + ((CurrentSymEx->Sym.st_value)&0xFFFFFFFE)); + if( (CurrentSymEx->Sym.st_shndx) < SHN_LORESERVE) { //関連セクションがある場合 + if( (CurrentSymEx->Sym.st_shndx == SHN_ABS)) { + //Sym.st_valueは偶数/奇数でARM/Thumbを判別できるように調整されている場合があるので、その調整を削除して正味の値を出す + ExportAdrEntry->adr = (void*)((CurrentSymEx->Sym.st_value)&0xFFFFFFFE); + }else{ + CurrentShdrEx = ELi_GetShdrExfromList( ElfHandle->ShdrEx, CurrentSymEx->Sym.st_shndx); + //Sym.st_valueは偶数/奇数でARM/Thumbを判別できるように調整されている場合があるので、その調整を削除して正味の値を出す + ExportAdrEntry->adr = (void*)(CurrentShdrEx->loaded_adr + ((CurrentSymEx->Sym.st_value)&0xFFFFFFFE)); + } ExportAdrEntry->func_flag = (u16)(ELF32_ST_TYPE( CurrentSymEx->Sym.st_info)); ExportAdrEntry->thumb_flag = CurrentSymEx->thumb_flag; @@ -501,6 +507,7 @@ void ELi_DiscriminateGlobalSym( ELHandle* ElfHandle, u32 symsh_index) } EL_AddAdrEntry( ExportAdrEntry); //登録 } + } } } /*----------------------------------------------------------------*/ @@ -582,13 +589,13 @@ u32 ELi_DoRelocate( ELUnresolvedEntry* UnresolvedInfo) signed_val = (( (s32)(_S_) + _A_) | (s32)(_T_)) - (s32)(_P_); signed_val >>= 1; if( _T_) { /*BL命令でThumbからThumbに飛ぶ*/ - relocation_val = (*(vu16*)relocation_adr & 0xF800) | ((signed_val>>11) & 0x07FF) + + relocation_val = ((*(vu16*)relocation_adr & 0xF800) | ((signed_val>>11) & 0x07FF)) + ((((*((vu16*)(relocation_adr)+1)) & 0xF800) | (signed_val & 0x07FF)) << 16); }else{ /*BLX命令でThumbからARMに飛ぶ(v5未満だとBL→ベニアでBXという仕組みが必要)*/ if( (signed_val & 0x1)) { //_P_が4バイトアラインされていないとここに来る signed_val += 1; } - relocation_val = (*(vu16*)relocation_adr & 0xF800) | ((signed_val>>11) & 0x07FF) + + relocation_val = ((*(vu16*)relocation_adr & 0xF800) | ((signed_val>>11) & 0x07FF)) + ((((*((vu16*)(relocation_adr)+1)) & 0xE800) | (signed_val & 0x07FF)) << 16); } *(vu16*)relocation_adr = (vu16)relocation_val; diff --git a/tools/makelst/loader_subset.h b/tools/makelst/loader_subset.h index e1f91f7..6093881 100644 --- a/tools/makelst/loader_subset.h +++ b/tools/makelst/loader_subset.h @@ -1,8 +1,8 @@ /*---------------------------------------------------------------------------* - Project: CTR - ELF Loader + Project: TWL - ELF Loader File: loader_subset.h - Copyright 2006 Nintendo. All rights reserved. + Copyright 2006,2007 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo