summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/perk/perk.h12
-rw-r--r--include/perk/perk_output.h1
-rw-r--r--project/common.mk4
-rw-r--r--project/extras.mk9
-rw-r--r--src/cmds/pe_cmd_ar.c2
-rw-r--r--src/cmds/pe_cmd_nm.c15
-rw-r--r--src/cmds/pe_cmd_perk.c3
-rw-r--r--src/cmds/pe_cmd_size.c15
-rw-r--r--src/driver/pe_amain.c24
-rw-r--r--src/driver/pe_driver_ctx.c40
-rw-r--r--src/internal/perk_driver_impl.h3
-rw-r--r--src/internal/perk_synopsis_impl.h22
-rw-r--r--src/skin/pe_skin_default.c2
-rw-r--r--src/skin/pe_skin_nm.c13
-rw-r--r--src/skin/pe_skin_perk.c4
-rw-r--r--src/skin/pe_skin_size.c13
16 files changed, 168 insertions, 14 deletions
diff --git a/include/perk/perk.h b/include/perk/perk.h
index 95f3b53..6952b1b 100644
--- a/include/perk/perk.h
+++ b/include/perk/perk.h
@@ -120,6 +120,15 @@ enum pe_cmd {
PERK_CMD_DEFAULT,
PERK_CMD_PERK,
PERK_CMD_AR,
+ PERK_CMD_NM,
+ PERK_CMD_SIZE,
+ PERK_CMD_STRIP,
+ PERK_CMD_RANLIB,
+ PERK_CMD_STRINGS,
+ PERK_CMD_OBJDUMP,
+ PERK_CMD_OBJCOPY,
+ PERK_CMD_READCOFF,
+ PERK_CMD_ADDR2LINE,
PERK_CMD_CAP,
};
@@ -292,6 +301,9 @@ perk_api int pe_lib_set_driver_fdctx (struct pe_driver_ctx *, const s
/* cmd api */
perk_api int pe_cmd_perk (const struct pe_driver_ctx *, const char *);
+perk_api int pe_cmd_nm (const struct pe_driver_ctx *, const char *);
+perk_api int pe_cmd_size (const struct pe_driver_ctx *, const char *);
+
perk_api int pe_cmd_ar (const struct pe_driver_ctx *, uint64_t,
const char *, const char *, const char **);
diff --git a/include/perk/perk_output.h b/include/perk/perk_output.h
index 313f609..5c022b6 100644
--- a/include/perk/perk_output.h
+++ b/include/perk/perk_output.h
@@ -13,6 +13,7 @@
#define PERK_OUTPUT_IMAGE_SECTIONS 0x00000010
#define PERK_OUTPUT_IMAGE_SYMBOLS 0x00000020
#define PERK_OUTPUT_IMAGE_STRINGS 0x00000040
+#define PERK_OUTPUT_BASE_RELOCS 0x00000080
#define PERK_OUTPUT_MDSO_LIBS 0x00000200
#define PERK_OUTPUT_MDSO_SYMS 0x00000400
diff --git a/project/common.mk b/project/common.mk
index ba389c6..50583dc 100644
--- a/project/common.mk
+++ b/project/common.mk
@@ -7,7 +7,9 @@ API_SRCS = \
src/arbits/output/pe_ar_list_members.c \
src/arbits/output/pe_ar_print_members.c \
src/cmds/pe_cmd_ar.c \
+ src/cmds/pe_cmd_nm.c \
src/cmds/pe_cmd_perk.c \
+ src/cmds/pe_cmd_size.c \
src/crc/pe_crc32.c \
src/crc/pe_crc64.c \
src/driver/pe_amain.c \
@@ -47,7 +49,9 @@ API_SRCS = \
src/reader/pe_read_section_header.c \
src/skin/pe_skin_default.c \
src/skin/pe_skin_ar.c \
+ src/skin/pe_skin_nm.c \
src/skin/pe_skin_perk.c \
+ src/skin/pe_skin_size.c \
INTERNAL_SRCS = \
src/internal/$(PACKAGE)_dprintf_impl.c \
diff --git a/project/extras.mk b/project/extras.mk
index b4af0c3..41eb35d 100644
--- a/project/extras.mk
+++ b/project/extras.mk
@@ -9,6 +9,15 @@ src/driver/pe_driver_ctx.lo: version.tag
install-app-extras:
mkdir -p $(DESTDIR)$(BINDIR)
+
rm -f bin/$(NICKNAME)-ar$(OS_APP_SUFFIX).tmp
ln -s ./$(NICKNAME)$(OS_APP_SUFFIX) bin/$(NICKNAME)-ar$(OS_APP_SUFFIX).tmp
mv bin/$(NICKNAME)-ar$(OS_APP_SUFFIX).tmp $(DESTDIR)$(BINDIR)/$(NICKNAME)-ar$(OS_APP_SUFFIX)
+
+ rm -f bin/$(NICKNAME)-nm$(OS_APP_SUFFIX).tmp
+ ln -s ./$(NICKNAME)$(OS_APP_SUFFIX) bin/$(NICKNAME)-nm$(OS_APP_SUFFIX).tmp
+ mv bin/$(NICKNAME)-nm$(OS_APP_SUFFIX).tmp $(DESTDIR)$(BINDIR)/$(NICKNAME)-nm$(OS_APP_SUFFIX)
+
+ rm -f bin/$(NICKNAME)-size$(OS_APP_SUFFIX).tmp
+ ln -s ./$(NICKNAME)$(OS_APP_SUFFIX) bin/$(NICKNAME)-size$(OS_APP_SUFFIX).tmp
+ mv bin/$(NICKNAME)-size$(OS_APP_SUFFIX).tmp $(DESTDIR)$(BINDIR)/$(NICKNAME)-size$(OS_APP_SUFFIX)
diff --git a/src/cmds/pe_cmd_ar.c b/src/cmds/pe_cmd_ar.c
index 97e94c7..59d414f 100644
--- a/src/cmds/pe_cmd_ar.c
+++ b/src/cmds/pe_cmd_ar.c
@@ -9,8 +9,6 @@
#include "perk_errinfo_impl.h"
#include "perk_ar_impl.h"
-int pe_ar_list_members(const struct pe_archive_meta *, const char **);
-
static int pe_cmd_ar_perform_unit_actions(
const struct pe_driver_ctx * dctx,
const char * arname,
diff --git a/src/cmds/pe_cmd_nm.c b/src/cmds/pe_cmd_nm.c
new file mode 100644
index 0000000..87736ea
--- /dev/null
+++ b/src/cmds/pe_cmd_nm.c
@@ -0,0 +1,15 @@
+/***************************************************************/
+/* perk: PE Resource Kit */
+/* Copyright (C) 2015--2025 SysDeer Technologies, LLC */
+/* Released under GPLv2 and GPLv3; see COPYING.PERK. */
+/***************************************************************/
+
+#include <perk/perk.h>
+#include "perk_driver_impl.h"
+
+int pe_cmd_nm(const struct pe_driver_ctx * dctx, const char * path)
+{
+ (void)dctx;
+ (void)path;
+ return 0;
+}
diff --git a/src/cmds/pe_cmd_perk.c b/src/cmds/pe_cmd_perk.c
index bdb6364..37b80ee 100644
--- a/src/cmds/pe_cmd_perk.c
+++ b/src/cmds/pe_cmd_perk.c
@@ -64,6 +64,9 @@ static void pe_perform_unit_actions_impl(
if ((flags & PERK_OUTPUT_MDSO_LIBS) || (flags & PERK_OUTPUT_MDSO_SYMS))
pe_output_mdso_libraries(dctx,meta);
+ if (flags & PERK_OUTPUT_BASE_RELOCS)
+ pe_output_base_relocs(dctx,meta);
+
if (dctx->cctx->hdrdump)
pe_perform_hdrdump_actions(dctx,meta);
}
diff --git a/src/cmds/pe_cmd_size.c b/src/cmds/pe_cmd_size.c
new file mode 100644
index 0000000..4f16b75
--- /dev/null
+++ b/src/cmds/pe_cmd_size.c
@@ -0,0 +1,15 @@
+/***************************************************************/
+/* perk: PE Resource Kit */
+/* Copyright (C) 2015--2025 SysDeer Technologies, LLC */
+/* Released under GPLv2 and GPLv3; see COPYING.PERK. */
+/***************************************************************/
+
+#include <perk/perk.h>
+#include "perk_driver_impl.h"
+
+int pe_cmd_size(const struct pe_driver_ctx * dctx, const char * path)
+{
+ (void)dctx;
+ (void)path;
+ return 0;
+}
diff --git a/src/driver/pe_amain.c b/src/driver/pe_amain.c
index 547714a..5b85bef 100644
--- a/src/driver/pe_amain.c
+++ b/src/driver/pe_amain.c
@@ -57,13 +57,24 @@ static int pe_exit(struct pe_driver_ctx * dctx, int ret)
return ret;
}
+typedef int (*pe_cmd)(const struct pe_driver_ctx *, const char *);
+
+static void pe_cmd_common(
+ const struct pe_driver_ctx * dctx,
+ pe_cmd cmdfn)
+{
+ const char ** unit;
+
+ for (unit=dctx->units; *unit; unit++)
+ cmdfn(dctx,*unit);
+}
+
int pe_main(char ** argv, char ** envp, const struct pe_fd_ctx * fdctx)
{
int ret;
int fdout;
uint64_t flags;
struct pe_driver_ctx * dctx;
- const char ** unit;
const char * posname;
const char * arname;
const char ** arfiles;
@@ -83,8 +94,15 @@ int pe_main(char ** argv, char ** envp, const struct pe_fd_ctx * fdctx)
switch (dctx->cctx->cmd) {
case PERK_CMD_PERK:
- for (unit=dctx->units; *unit; unit++)
- pe_cmd_perk(dctx,*unit);
+ pe_cmd_common(dctx,pe_cmd_perk);
+ break;
+
+ case PERK_CMD_NM:
+ pe_cmd_common(dctx,pe_cmd_nm);
+ break;
+
+ case PERK_CMD_SIZE:
+ pe_cmd_common(dctx,pe_cmd_size);
break;
case PERK_CMD_AR:
diff --git a/src/driver/pe_driver_ctx.c b/src/driver/pe_driver_ctx.c
index 6a260bd..b99ee7f 100644
--- a/src/driver/pe_driver_ctx.c
+++ b/src/driver/pe_driver_ctx.c
@@ -29,6 +29,8 @@ static const struct pe_source_version pe_src_version = {
static const char * const perk_cmd_name[PERK_CMD_CAP] = {
[PERK_CMD_PERK] = "perk",
[PERK_CMD_AR] = "ar",
+ [PERK_CMD_NM] = "nm",
+ [PERK_CMD_SIZE] = "size",
};
/* perk command options */
@@ -36,6 +38,8 @@ static const struct argv_option * perk_cmd_options[PERK_CMD_CAP] = {
[PERK_CMD_DEFAULT] = pe_default_options,
[PERK_CMD_PERK] = pe_perk_options,
[PERK_CMD_AR] = pe_ar_options,
+ [PERK_CMD_NM] = pe_nm_options,
+ [PERK_CMD_SIZE] = pe_size_options,
};
/* default fd context */
@@ -98,6 +102,18 @@ static int pe_driver_usage(
cmdname,cmdname,cmdname);
break;
+ case PERK_CMD_NM:
+ snprintf(header,sizeof(header),
+ PERK_NM_CMD_SYNOPSIS,
+ cmdname,cmdname);
+ break;
+
+ case PERK_CMD_SIZE:
+ snprintf(header,sizeof(header),
+ PERK_SIZE_CMD_SYNOPSIS,
+ cmdname,cmdname);
+ break;
+
case PERK_CMD_PERK:
snprintf(header,sizeof(header),
PERK_PERK_CMD_SYNOPSIS,
@@ -159,6 +175,7 @@ static int pe_cmd_from_program(const char * program)
const char * dot;
const char * hyphen;
const char * mark;
+ enum pe_cmd cmd;
dot = strrchr(program,'.');
hyphen = strrchr(program,'-');
@@ -170,15 +187,12 @@ static int pe_cmd_from_program(const char * program)
else
mark = program;
- if (!strcmp(mark,"perk")) {
- return PERK_CMD_PERK;
-
- } else if (!strcmp(mark,"ar")) {
- return PERK_CMD_AR;
+ for (cmd=0; cmd<PERK_CMD_CAP; cmd++)
+ if (perk_cmd_name[cmd])
+ if (!strcmp(mark,perk_cmd_name[cmd]))
+ return cmd;
- } else {
- return PERK_CMD_DEFAULT;
- }
+ return PERK_CMD_DEFAULT;
}
static int pe_cctx_update(
@@ -251,6 +265,10 @@ static int pe_cctx_update(
cctx->fmtflags |= PERK_OUTPUT_IMAGE_STRINGS;
break;
+ case TAG_RELOCS:
+ cctx->fmtflags |= PERK_OUTPUT_BASE_RELOCS;
+ break;
+
case TAG_EXPSYMS:
cctx->fmtflags |= PERK_OUTPUT_EXPORT_SYMS;
break;
@@ -483,6 +501,12 @@ int pe_lib_get_driver_ctx(
} else if (cctx.cmd == PERK_CMD_AR) {
argv_optv_init(pe_ar_options,optv);
+
+ } else if (cctx.cmd == PERK_CMD_NM) {
+ argv_optv_init(pe_nm_options,optv);
+
+ } else if (cctx.cmd == PERK_CMD_SIZE) {
+ argv_optv_init(pe_size_options,optv);
}
/* process the selected tool's command-line arguments */
diff --git a/src/internal/perk_driver_impl.h b/src/internal/perk_driver_impl.h
index 5cd0d73..453a032 100644
--- a/src/internal/perk_driver_impl.h
+++ b/src/internal/perk_driver_impl.h
@@ -15,6 +15,8 @@
extern const struct argv_option pe_default_options[];
extern const struct argv_option pe_perk_options[];
extern const struct argv_option pe_ar_options[];
+extern const struct argv_option pe_nm_options[];
+extern const struct argv_option pe_size_options[];
enum app_tags {
TAG_HELP,
@@ -32,6 +34,7 @@ enum app_tags {
TAG_IMPSYMS,
TAG_DSOLIBS,
TAG_DSOSYMS,
+ TAG_RELOCS,
TAG_HDRDUMP,
TAG_AR_LIST_MEMBERS,
TAG_AR_PRINT_MEMBERS,
diff --git a/src/internal/perk_synopsis_impl.h b/src/internal/perk_synopsis_impl.h
index f3d0a3a..921a1db 100644
--- a/src/internal/perk_synopsis_impl.h
+++ b/src/internal/perk_synopsis_impl.h
@@ -7,6 +7,8 @@
#ifndef SLIBTOOL_SYNOPSIS_IMPL_H
#define SLIBTOOL_SYNOPSIS_IMPL_H
+
+
#define PERK_DEFAULT_CMD_SYNOPSIS \
"%s — PE/COFF Resource Kit\n\n" \
"Synopsis:\n" \
@@ -15,6 +17,8 @@
" %s --cmd=<command> [option] ... <file> ...\n\n" \
"Options:\n"
+
+
#define PERK_PERK_CMD_SYNOPSIS \
"%s — PE/COFF Resource Kit\n\n" \
"Synopsis:\n" \
@@ -22,6 +26,24 @@
" %s [option] ... <file> ...\n\n" \
"Options:\n"
+
+
+#define PERK_NM_CMD_SYNOPSIS \
+ "%s — PE/COFF Name Mangler\n\n" \
+ "Synopsis:\n" \
+ " %s [-V] [-APv] [-efox] [-g|-u] [-t format] <file> ...\n\n" \
+ "Options:\n"
+
+
+
+#define PERK_SIZE_CMD_SYNOPSIS \
+ "%s — PE/COFF Section Size Information\n\n" \
+ "Synopsis:\n" \
+ " %s [-V] [-A|-B|-G] [-d|-o|-x] [-t] [-f] <file> ...\n\n" \
+ "Options:\n"
+
+
+
#define PERK_AR_CMD_SYNOPSIS \
"%s — the PE/COFF Resource Kit Archiver\n\n" \
"Synopsis:\n" \
diff --git a/src/skin/pe_skin_default.c b/src/skin/pe_skin_default.c
index 95024c7..5e1ec12 100644
--- a/src/skin/pe_skin_default.c
+++ b/src/skin/pe_skin_default.c
@@ -10,7 +10,7 @@ const perk_hidden struct argv_option pe_default_options[] = {
"show usage information [listing %s options only]"},
{"cmd", 0,TAG_CMD,ARGV_OPTARG_REQUIRED,0,
- "perk|ar",0,
+ "perk|ar|nm|size",0,
"invoke one of the following perk commands: {%s}"},
{0,0,0,0,0,0,0,0}
diff --git a/src/skin/pe_skin_nm.c b/src/skin/pe_skin_nm.c
new file mode 100644
index 0000000..2525b9a
--- /dev/null
+++ b/src/skin/pe_skin_nm.c
@@ -0,0 +1,13 @@
+#include "perk_driver_impl.h"
+#include "perk_visibility_impl.h"
+#include "argv/argv.h"
+
+const perk_hidden struct argv_option pe_nm_options[] = {
+ {"version", 'V',TAG_VERSION,ARGV_OPTARG_NONE,0,0,0,
+ "show version information"},
+
+ {"help", 'h',TAG_HELP,ARGV_OPTARG_OPTIONAL,0,"short|long",0,
+ "show usage information [listing %s options only]"},
+
+ {0,0,0,0,0,0,0,0}
+};
diff --git a/src/skin/pe_skin_perk.c b/src/skin/pe_skin_perk.c
index 3678341..fd891c8 100644
--- a/src/skin/pe_skin_perk.c
+++ b/src/skin/pe_skin_perk.c
@@ -44,6 +44,10 @@ const perk_hidden struct argv_option pe_perk_options[] = {
"list .dsometa (mdso) dependency libraries "
"along with referenced symbols"},
+ {"relocs", 'r',TAG_RELOCS,ARGV_OPTARG_NONE,0,0,0,
+ "list image base relocations found "
+ "in the .reloc section"},
+
{"hdrdump", 'X',TAG_HDRDUMP,ARGV_OPTARG_OPTIONAL,0,
"dos|image.dos|"
"coff|coff.image|coff.object|coff.optional|"
diff --git a/src/skin/pe_skin_size.c b/src/skin/pe_skin_size.c
new file mode 100644
index 0000000..a8a5c61
--- /dev/null
+++ b/src/skin/pe_skin_size.c
@@ -0,0 +1,13 @@
+#include "perk_driver_impl.h"
+#include "perk_visibility_impl.h"
+#include "argv/argv.h"
+
+const perk_hidden struct argv_option pe_size_options[] = {
+ {"version", 'V',TAG_VERSION,ARGV_OPTARG_NONE,0,0,0,
+ "show version information"},
+
+ {"help", 'h',TAG_HELP,ARGV_OPTARG_OPTIONAL,0,"short|long",0,
+ "show usage information [listing %s options only]"},
+
+ {0,0,0,0,0,0,0,0}
+};