summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2021-04-09 07:01:53 +0000
committermidipix <writeonce@midipix.org>2021-04-09 07:11:47 +0000
commitd38fc0c36bc9530fdebf709316a73ad6db5e2db5 (patch)
treefc1fde9790611237ec46a7a4c9e70b35a7667d2d /src
parent44ba87393046804e3661da9cf9c8e639b82c5cf0 (diff)
downloadperk-d38fc0c36bc9530fdebf709316a73ad6db5e2db5.tar.bz2
perk-d38fc0c36bc9530fdebf709316a73ad6db5e2db5.tar.xz
driver: added --hdrdump support.
Diffstat (limited to 'src')
-rw-r--r--src/driver/pe_driver_ctx.c37
-rw-r--r--src/internal/perk_driver_impl.h1
-rw-r--r--src/skin/pe_skin_default.c10
3 files changed, 48 insertions, 0 deletions
diff --git a/src/driver/pe_driver_ctx.c b/src/driver/pe_driver_ctx.c
index 486284c..bc20b6d 100644
--- a/src/driver/pe_driver_ctx.c
+++ b/src/driver/pe_driver_ctx.c
@@ -215,6 +215,43 @@ int pe_get_driver_ctx(
case TAG_DSOSYMS:
cctx.fmtflags |= PERK_OUTPUT_MDSO_SYMS;
break;
+
+ case TAG_HDRDUMP:
+ if (!entry->arg) {
+ cctx.hdrdump = 0;
+ cctx.hdrdump = ~cctx.hdrdump;
+ } else if (!strcmp(entry->arg,"dos")) {
+ cctx.hdrdump = PERK_HDRDUMP_IMAGE_DOS_HEADER;
+ } else if (!strcmp(entry->arg,"image.dos")) {
+ cctx.hdrdump = PERK_HDRDUMP_IMAGE_DOS_HEADER;
+ } else if (!strcmp(entry->arg,"coff")) {
+ cctx.hdrdump = PERK_HDRDUMP_COFF_IMAGE_HEADER;
+ cctx.hdrdump |= PERK_HDRDUMP_COFF_OBJECT_HEADER;
+ cctx.hdrdump |= PERK_HDRDUMP_COFF_OPT_HEADER;
+ } else if (!strcmp(entry->arg,"coff.image")) {
+ cctx.hdrdump = PERK_HDRDUMP_COFF_IMAGE_HEADER;
+ } else if (!strcmp(entry->arg,"coff.obj")) {
+ cctx.hdrdump = PERK_HDRDUMP_COFF_OBJECT_HEADER;
+ } else if (!strcmp(entry->arg,"coff.object")) {
+ cctx.hdrdump = PERK_HDRDUMP_COFF_OBJECT_HEADER;
+ } else if (!strcmp(entry->arg,"coff.opt")) {
+ cctx.hdrdump = PERK_HDRDUMP_COFF_OPT_HEADER;
+ } else if (!strcmp(entry->arg,"coff.optional")) {
+ cctx.hdrdump = PERK_HDRDUMP_COFF_OPT_HEADER;
+ } else if (!strcmp(entry->arg,"sectbl")) {
+ cctx.hdrdump = PERK_HDRDUMP_SECTION_TABLE;
+ } else if (!strcmp(entry->arg,"section.table")) {
+ cctx.hdrdump = PERK_HDRDUMP_SECTION_TABLE;
+ } else if (!strcmp(entry->arg,"exphdr")) {
+ cctx.hdrdump = PERK_HDRDUMP_EXPORT_HEADER;
+ } else if (!strcmp(entry->arg,"export.header")) {
+ cctx.hdrdump = PERK_HDRDUMP_EXPORT_HEADER;
+ } else if (!strcmp(entry->arg,"imptbl")) {
+ cctx.hdrdump = PERK_HDRDUMP_IMPORT_TABLE;
+ } else if (!strcmp(entry->arg,"import.table")) {
+ cctx.hdrdump = PERK_HDRDUMP_IMPORT_TABLE;
+ }
+ break;
}
} else
nunits++;
diff --git a/src/internal/perk_driver_impl.h b/src/internal/perk_driver_impl.h
index b17b7be..dafad86 100644
--- a/src/internal/perk_driver_impl.h
+++ b/src/internal/perk_driver_impl.h
@@ -27,6 +27,7 @@ enum app_tags {
TAG_IMPSYMS,
TAG_DSOLIBS,
TAG_DSOSYMS,
+ TAG_HDRDUMP,
};
struct pe_driver_ctx_impl {
diff --git a/src/skin/pe_skin_default.c b/src/skin/pe_skin_default.c
index 60663ea..963af6e 100644
--- a/src/skin/pe_skin_default.c
+++ b/src/skin/pe_skin_default.c
@@ -40,5 +40,15 @@ const struct argv_option pe_default_options[] = {
"list .dsometa (mdso) dependency libraries "
"along with referenced symbols"},
+ {"hdrdump", 'X',TAG_HDRDUMP,ARGV_OPTARG_OPTIONAL,0,
+ "dos|image.dos|"
+ "coff|coff.image|coff.object|coff.optional|"
+ "sectbl|section.table|"
+ "exphdr|export.header|"
+ "imptbl|import.table",0,
+ "output struct-based information for "
+ "either all headers (the default) "
+ "or a specific header"},
+
{0,0,0,0,0,0,0,0}
};