summaryrefslogtreecommitdiffhomepage
path: root/src/output/pe_output_image_sections.c
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2025-06-12 04:54:59 +0000
committermidipix <writeonce@midipix.org>2025-06-12 04:54:59 +0000
commit49d195e3fe64e7783efbcbf9e415e95bb4ae7305 (patch)
tree17a221fea449f7be5ec770ddb33f5823c444cea1 /src/output/pe_output_image_sections.c
parent2292ef3beb8de653e5aa3501448ac0b84e3dc7a6 (diff)
downloadperk-49d195e3fe64e7783efbcbf9e415e95bb4ae7305.tar.bz2
perk-49d195e3fe64e7783efbcbf9e415e95bb4ae7305.tar.xz
pe_output_image_sections(): output relocation records in verbose mode.
Diffstat (limited to 'src/output/pe_output_image_sections.c')
-rw-r--r--src/output/pe_output_image_sections.c37
1 files changed, 35 insertions, 2 deletions
diff --git a/src/output/pe_output_image_sections.c b/src/output/pe_output_image_sections.c
index 5a7ef21..9233fef 100644
--- a/src/output/pe_output_image_sections.c
+++ b/src/output/pe_output_image_sections.c
@@ -8,6 +8,7 @@
#include <perk/perk.h>
#include <perk/perk_output.h>
+#include <perk/perk_structs.h>
#include "perk_driver_impl.h"
#include "perk_dprintf_impl.h"
#include "perk_errinfo_impl.h"
@@ -46,8 +47,13 @@ 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_meta_sec_hdr * s)
+ 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;
+
if (pe_dprintf(fdout,
" - section:\n"
" - [ name: %s ]\n"
@@ -73,6 +79,30 @@ static int pe_output_section_record_yaml(
s->sh_characteristics) < 0)
return PERK_FILE_ERROR(dctx);
+ if (s->sh_num_of_relocs == 0)
+ return 0;
+
+ if (pe_dprintf(fdout," - relocation-records:\n") < 0)
+ return PERK_FILE_ERROR(dctx);
+
+ r = (const struct pe_raw_coff_reloc *)&base[s->sh_ptr_to_relocs];
+
+ for (i=0; i<s->sh_num_of_relocs; i++) {
+ pe_read_coff_reloc(&r[i],&m);
+
+ if (pe_dprintf(
+ fdout,
+ " - reloction-record:\n"
+ " - [ rva: 0x%08x ]\n"
+ " - [ sym: 0x%08x ]\n"
+ " - [ type: %d ]\n"
+ "\n",
+ m.rel_rva,
+ m.rel_sym,
+ m.rel_type) < 0)
+ return PERK_FILE_ERROR(dctx);
+ }
+
return 0;
}
@@ -87,7 +117,10 @@ static int pe_output_section_records_yaml(
return PERK_FILE_ERROR(dctx);
for (i=0; i<meta->m_coff.cfh_num_of_sections; i++)
- if (pe_output_section_record_yaml(fdout,dctx,&meta->m_sectbl[i]) < 0)
+ if (pe_output_section_record_yaml(
+ fdout,dctx,
+ &meta->m_sectbl[i],
+ meta->r_image.map_addr) < 0)
return PERK_NESTED_ERROR(dctx);
return 0;