diff options
Diffstat (limited to 'src/output')
-rw-r--r-- | src/output/pe_output_pecoff_category.c (renamed from src/output/pe_output_image_category.c) | 2 | ||||
-rw-r--r-- | src/output/pe_output_pecoff_sections.c (renamed from src/output/pe_output_image_sections.c) | 76 | ||||
-rw-r--r-- | src/output/pe_output_pecoff_strings.c (renamed from src/output/pe_output_image_strings.c) | 2 | ||||
-rw-r--r-- | src/output/pe_output_pecoff_symbols.c (renamed from src/output/pe_output_image_symbols.c) | 6 |
4 files changed, 74 insertions, 12 deletions
diff --git a/src/output/pe_output_image_category.c b/src/output/pe_output_pecoff_category.c index bd80687..3d4e5d4 100644 --- a/src/output/pe_output_image_category.c +++ b/src/output/pe_output_pecoff_category.c @@ -12,7 +12,7 @@ #include "perk_dprintf_impl.h" #include "perk_errinfo_impl.h" -int pe_output_image_category( +int pe_output_pecoff_category( const struct pe_driver_ctx * dctx, const struct pe_image_meta * meta) { diff --git a/src/output/pe_output_image_sections.c b/src/output/pe_output_pecoff_sections.c index 9233fef..3ee6fc0 100644 --- a/src/output/pe_output_image_sections.c +++ b/src/output/pe_output_pecoff_sections.c @@ -8,11 +8,46 @@ #include <perk/perk.h> #include <perk/perk_output.h> +#include <perk/perk_consts.h> #include <perk/perk_structs.h> #include "perk_driver_impl.h" #include "perk_dprintf_impl.h" #include "perk_errinfo_impl.h" +static const char * pe_i386_reloc_type_desc[0x16] = { + [PE_IMAGE_REL_I386_ABSOLUTE] = "PE_IMAGE_REL_I386_ABSOLUTE", + [PE_IMAGE_REL_I386_DIR16] = "PE_IMAGE_REL_I386_DIR16", + [PE_IMAGE_REL_I386_REL16] = "PE_IMAGE_REL_I386_REL16", + [PE_IMAGE_REL_I386_DIR32] = "PE_IMAGE_REL_I386_DIR32", + [PE_IMAGE_REL_I386_DIR32NB] = "PE_IMAGE_REL_I386_DIR32NB", + [PE_IMAGE_REL_I386_SEG12] = "PE_IMAGE_REL_I386_SEG12", + [PE_IMAGE_REL_I386_SECTION] = "PE_IMAGE_REL_I386_SECTION", + [PE_IMAGE_REL_I386_SECREL] = "PE_IMAGE_REL_I386_SECREL", + [PE_IMAGE_REL_I386_TOKEN] = "PE_IMAGE_REL_I386_TOKEN", + [PE_IMAGE_REL_I386_SECREL7] = "PE_IMAGE_REL_I386_SECREL7", + [PE_IMAGE_REL_I386_REL32] = "PE_IMAGE_REL_I386_REL32", +}; + +static const char * pe_amd64_reloc_type_desc[0x12] = { + [PE_IMAGE_REL_AMD64_ABSOLUTE] = "PE_IMAGE_REL_AMD64_ABSOLUTE", + [PE_IMAGE_REL_AMD64_ADDR64] = "PE_IMAGE_REL_AMD64_ADDR64", + [PE_IMAGE_REL_AMD64_ADDR32] = "PE_IMAGE_REL_AMD64_ADDR32", + [PE_IMAGE_REL_AMD64_ADDR32NB] = "PE_IMAGE_REL_AMD64_ADDR32NB", + [PE_IMAGE_REL_AMD64_REL32] = "PE_IMAGE_REL_AMD64_REL32", + [PE_IMAGE_REL_AMD64_REL32_1] = "PE_IMAGE_REL_AMD64_REL32_1", + [PE_IMAGE_REL_AMD64_REL32_2] = "PE_IMAGE_REL_AMD64_REL32_2", + [PE_IMAGE_REL_AMD64_REL32_3] = "PE_IMAGE_REL_AMD64_REL32_3", + [PE_IMAGE_REL_AMD64_REL32_4] = "PE_IMAGE_REL_AMD64_REL32_4", + [PE_IMAGE_REL_AMD64_REL32_5] = "PE_IMAGE_REL_AMD64_REL32_5", + [PE_IMAGE_REL_AMD64_SECTION] = "PE_IMAGE_REL_AMD64_SECTION", + [PE_IMAGE_REL_AMD64_SECREL] = "PE_IMAGE_REL_AMD64_SECREL", + [PE_IMAGE_REL_AMD64_SECREL7] = "PE_IMAGE_REL_AMD64_SECREL7", + [PE_IMAGE_REL_AMD64_TOKEN] = "PE_IMAGE_REL_AMD64_TOKEN", + [PE_IMAGE_REL_AMD64_SREL32] = "PE_IMAGE_REL_AMD64_SREL32", + [PE_IMAGE_REL_AMD64_PAIR] = "PE_IMAGE_REL_AMD64_PAIR", + [PE_IMAGE_REL_AMD64_SSPAN32] = "PE_IMAGE_REL_AMD64_SSPAN32", +}; + static int pe_output_section_names( const struct pe_driver_ctx * dctx, const struct pe_image_meta * meta, @@ -47,12 +82,14 @@ static int pe_output_section_names_yaml( static int pe_output_section_record_yaml( int fdout, const struct pe_driver_ctx * dctx, + const struct pe_image_meta * meta, const struct pe_meta_sec_hdr * s, const unsigned char * base) { int i; const struct pe_raw_coff_reloc * r; struct pe_meta_coff_reloc m; + char reltypedesc[64]; if (pe_dprintf(fdout, " - section:\n" @@ -89,17 +126,42 @@ static int pe_output_section_record_yaml( for (i=0; i<s->sh_num_of_relocs; i++) { pe_read_coff_reloc(&r[i],&m); + memset(reltypedesc,0,sizeof(reltypedesc)); + + switch (meta->m_abi) { + case PE_ABI_PE32: + if (m.rel_type <= PE_IMAGE_REL_I386_REL32) + snprintf(reltypedesc,sizeof(reltypedesc), + "0x%04x (%s)", + m.rel_type, + pe_i386_reloc_type_desc[m.rel_type]); + break; + + case PE_ABI_PE64: + if (m.rel_type <= PE_IMAGE_REL_AMD64_SSPAN32) + snprintf(reltypedesc,sizeof(reltypedesc), + "0x%04x (%s)", + m.rel_type, + pe_amd64_reloc_type_desc[m.rel_type]); + break; + + default: + snprintf(reltypedesc,sizeof(reltypedesc), + "0x%04x", + m.rel_type); + } if (pe_dprintf( fdout, " - reloction-record:\n" " - [ rva: 0x%08x ]\n" - " - [ sym: 0x%08x ]\n" - " - [ type: %d ]\n" + " - [ sym: 0x%08x (%s) ]\n" + " - [ type: %s ]\n" "\n", m.rel_rva, m.rel_sym, - m.rel_type) < 0) + meta->m_symvec_symidx[m.rel_sym]->cs_name, + reltypedesc) < 0) return PERK_FILE_ERROR(dctx); } @@ -118,7 +180,7 @@ static int pe_output_section_records_yaml( for (i=0; i<meta->m_coff.cfh_num_of_sections; i++) if (pe_output_section_record_yaml( - fdout,dctx, + fdout,dctx,meta, &meta->m_sectbl[i], meta->r_image.map_addr) < 0) return PERK_NESTED_ERROR(dctx); @@ -126,7 +188,7 @@ static int pe_output_section_records_yaml( return 0; } -static int pe_output_image_sections_yaml( +static int pe_output_pecoff_sections_yaml( const struct pe_driver_ctx * dctx, const struct pe_image_meta * meta, int fdout) @@ -142,14 +204,14 @@ static int pe_output_image_sections_yaml( return 0; } -int pe_output_image_sections( +int pe_output_pecoff_sections( const struct pe_driver_ctx * dctx, const struct pe_image_meta * meta) { int fdout = pe_driver_fdout(dctx); if (dctx->cctx->fmtflags & PERK_PRETTY_YAML) { - if (pe_output_image_sections_yaml(dctx,meta,fdout) < 0) + if (pe_output_pecoff_sections_yaml(dctx,meta,fdout) < 0) return PERK_NESTED_ERROR(dctx); } else { diff --git a/src/output/pe_output_image_strings.c b/src/output/pe_output_pecoff_strings.c index a0ca849..917f655 100644 --- a/src/output/pe_output_image_strings.c +++ b/src/output/pe_output_pecoff_strings.c @@ -14,7 +14,7 @@ #include "perk_dprintf_impl.h" #include "perk_errinfo_impl.h" -int pe_output_image_strings( +int pe_output_pecoff_strings( const struct pe_driver_ctx * dctx, const struct pe_image_meta * meta) { diff --git a/src/output/pe_output_image_symbols.c b/src/output/pe_output_pecoff_symbols.c index 7e5e640..0c2eaa1 100644 --- a/src/output/pe_output_image_symbols.c +++ b/src/output/pe_output_pecoff_symbols.c @@ -261,7 +261,7 @@ static int pe_output_symbol_records_yaml( return 0; } -static int pe_output_image_symbols_yaml( +static int pe_output_pecoff_symbols_yaml( const struct pe_driver_ctx * dctx, const struct pe_image_meta * meta, int fdout) @@ -277,7 +277,7 @@ static int pe_output_image_symbols_yaml( return 0; } -int pe_output_image_symbols( +int pe_output_pecoff_symbols( const struct pe_driver_ctx * dctx, const struct pe_image_meta * meta) { @@ -287,7 +287,7 @@ int pe_output_image_symbols( return 0; if (dctx->cctx->fmtflags & PERK_PRETTY_YAML) { - if (pe_output_image_symbols_yaml(dctx,meta,fdout) < 0) + if (pe_output_pecoff_symbols_yaml(dctx,meta,fdout) < 0) return PERK_NESTED_ERROR(dctx); } else { |