From 5e336e3a8c70dcd90ac7613c828aa2e0078fdee2 Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Wed, 27 Mar 2019 05:03:50 +0900 Subject: [PATCH] 2019/03/27(Wed) 05:04 (LibGoblin) * Support addend loadbase ptr. for SectionInfo --- libgoblin/drd64_libgoblin_elf.c | 5 ++++- libgoblin/drd64_libgoblin_elf_section.c | 5 ++--- libgoblin/drd64_libgoblin_section.c | 14 +++++++++++--- libgoblin/drd64_libgoblin_type.h | 1 + 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/libgoblin/drd64_libgoblin_elf.c b/libgoblin/drd64_libgoblin_elf.c index da9c2e5..80d70c1 100644 --- a/libgoblin/drd64_libgoblin_elf.c +++ b/libgoblin/drd64_libgoblin_elf.c @@ -159,6 +159,9 @@ int // XXX - for DEV/DEBUG p_binfo->ptr_loadbase = 0x00000000800000000; + /* Update SectionInfo from BinaryFile to BinaryInfo ---*/ + Section_UpdateSectionInfo_inBinaryInfo( p_binfo ); + /* Read Program Header to ObjectInfo ------------------*/ i_result = ELF_ProgramHeader_Read( p_pginfo, p_binfo ); if( 0x00 != i_result ) { @@ -189,7 +192,7 @@ int return i_result; } - //Debug_ObjectInfo_Print_AllGroupLink( p_pginfo, 0xff ); + Debug_ObjectInfo_Print_AllGroupLink( p_pginfo, 0xff ); /* Analyze Dwarf-Debug Info. */ diff --git a/libgoblin/drd64_libgoblin_elf_section.c b/libgoblin/drd64_libgoblin_elf_section.c index c3c18d9..354765b 100644 --- a/libgoblin/drd64_libgoblin_elf_section.c +++ b/libgoblin/drd64_libgoblin_elf_section.c @@ -100,6 +100,7 @@ int p_sectbl->ptr_addr.value = p_sechdr->sh_addr; p_sectbl->i_binfile = p_binfo->i_binfile; p_sectbl->w_index = (Word)i_cnt; + p_sectbl->qw_flag = p_sechdr->sh_flags; p_bfile->i_secindex[ i_cnt ] = i_index; @@ -121,6 +122,7 @@ int p_sectbl->ptr_addr.value = p_sechdr->sh_addr; p_sectbl->i_binfile = p_binfo->i_binfile; p_sectbl->w_index = (Word)i_cnt; + p_sectbl->qw_flag = p_sechdr->sh_flags; p_bfile->i_secindex[ i_cnt ] = i_user_section; @@ -131,9 +133,6 @@ int p_bfile->b_status = BINFILE_STATUS_READSECTION; - /* Update Global SectionTable ---*/ - Section_UpdateSectionInfo_inBinaryInfo( p_binfo ); - return 0x00; } diff --git a/libgoblin/drd64_libgoblin_section.c b/libgoblin/drd64_libgoblin_section.c index 1e612dc..4a507d7 100644 --- a/libgoblin/drd64_libgoblin_section.c +++ b/libgoblin/drd64_libgoblin_section.c @@ -103,8 +103,12 @@ int p_globsec->pb_data = p_sectbl->pb_data; p_globsec->pstr_secname = p_sectbl->pstr_secname; p_globsec->qw_size = p_sectbl->qw_size; - p_globsec->ptr_addr.value = p_sectbl->ptr_addr.value; + p_globsec->qw_flag = p_sectbl->qw_flag; p_globsec->i_binfile = p_sectbl->i_binfile; + if( SHF_ALLOC & p_sectbl->qw_flag ) + { p_globsec->ptr_addr.value = p_sectbl->ptr_addr.value + p_binfo->ptr_loadbase; } + else + { p_globsec->ptr_addr.value = p_sectbl->ptr_addr.value; } } } @@ -131,8 +135,12 @@ int p_globsec->pb_data = p_sectbl->pb_data; p_globsec->pstr_secname = p_sectbl->pstr_secname; p_globsec->qw_size = p_sectbl->qw_size; - p_globsec->ptr_addr.value = p_sectbl->ptr_addr.value; + p_globsec->qw_flag = p_sectbl->qw_flag; p_globsec->i_binfile = p_sectbl->i_binfile; + if( SHF_ALLOC & p_sectbl->qw_flag ) + { p_globsec->ptr_addr.value = p_sectbl->ptr_addr.value + p_binfo->ptr_loadbase; } + else + { p_globsec->ptr_addr.value = p_sectbl->ptr_addr.value; } } return 0x00; @@ -163,7 +171,7 @@ int if( NULL == p_section->pb_sechdr ) { continue; } - if( 0x00000000 == p_section->ptr_addr.value ) { continue; } + if( 0x00 == (SHF_ALLOC & p_section->qw_flag) ) { continue; } // sh_addr - Address in memory image. // sh_size - Size in bytes. diff --git a/libgoblin/drd64_libgoblin_type.h b/libgoblin/drd64_libgoblin_type.h index 160f1e1..b94f7dc 100644 --- a/libgoblin/drd64_libgoblin_type.h +++ b/libgoblin/drd64_libgoblin_type.h @@ -45,6 +45,7 @@ typedef struct { Word w_index; Ptr ptr_addr; QWord qw_size; + QWord qw_flag; char *pstr_secname; int i_binfile; -- 2.11.0