summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mdso/mdso.h1
-rw-r--r--include/mdso/mdso_output.h19
-rw-r--r--project/common.mk1
-rw-r--r--project/headers.mk1
-rw-r--r--src/driver/mdso_driver_ctx.c14
-rw-r--r--src/internal/mdso_driver_impl.h2
-rw-r--r--src/mdso.c7
-rw-r--r--src/output/mdso_output_export_symbols.c49
-rw-r--r--src/skin/mdso_skin_default.c6
9 files changed, 100 insertions, 0 deletions
diff --git a/include/mdso/mdso.h b/include/mdso/mdso.h
index de0bd89..24159b4 100644
--- a/include/mdso/mdso.h
+++ b/include/mdso/mdso.h
@@ -81,6 +81,7 @@ mdso_api int mdso_map_input (int fd, const char * path, int prot, struct mdso_
mdso_api int mdso_unmap_input (struct mdso_input *);
/* utility api */
+mdso_api int mdso_output_export_symbols(const struct mdso_unit_ctx *, const struct mdso_common_ctx *, FILE *);
/* low-level api */
mdso_api uint32_t mdso_crc32_mbstr (const unsigned char * str, size_t * symlen);
diff --git a/include/mdso/mdso_output.h b/include/mdso/mdso_output.h
new file mode 100644
index 0000000..9b158ed
--- /dev/null
+++ b/include/mdso/mdso_output.h
@@ -0,0 +1,19 @@
+#ifndef MDSO_OUTPUT_H
+#define MDSO_OUTPUT_H
+
+#include <stdint.h>
+
+#define MDSO_PRETTY(x) ((uint64_t)x << 32)
+
+/* output actions */
+#define MDSO_OUTPUT_EXPORT_SYMS 0x00000001
+
+
+/* pretty-printer flags */
+#define MDSO_PRETTY_LIST MDSO_PRETTY(0x00000001)
+#define MDSO_PRETTY_TABLE MDSO_PRETTY(0x00000002)
+#define MDSO_PRETTY_READOBJ MDSO_PRETTY(0x00000004)
+#define MDSO_PRETTY_OBJDUMP MDSO_PRETTY(0x00000008)
+#define MDSO_PRETTY_YAML MDSO_PRETTY(0x00000010)
+
+#endif
diff --git a/project/common.mk b/project/common.mk
index bf8df42..12c02e4 100644
--- a/project/common.mk
+++ b/project/common.mk
@@ -4,6 +4,7 @@ COMMON_SRCS = \
src/driver/mdso_driver_ctx.c \
src/driver/mdso_unit_ctx.c \
src/logic/mdso_map_input.c \
+ src/output/mdso_output_export_symbols.c \
src/skin/mdso_skin_default.c \
APP_SRCS = \
diff --git a/project/headers.mk b/project/headers.mk
index 8cf926a..2722875 100644
--- a/project/headers.mk
+++ b/project/headers.mk
@@ -3,6 +3,7 @@ API_HEADERS = \
$(PROJECT_DIR)/include/$(PACKAGE)/mdso_api.h \
$(PROJECT_DIR)/include/$(PACKAGE)/mdso_crc32.h \
$(PROJECT_DIR)/include/$(PACKAGE)/mdso_crc64.h \
+ $(PROJECT_DIR)/include/$(PACKAGE)/mdso_output.h \
INTERNAL_HEADERS = \
$(PROJECT_DIR)/src/internal/argv/argv.h \
diff --git a/src/driver/mdso_driver_ctx.c b/src/driver/mdso_driver_ctx.c
index 9c891de..c1e34ba 100644
--- a/src/driver/mdso_driver_ctx.c
+++ b/src/driver/mdso_driver_ctx.c
@@ -11,6 +11,7 @@
#define ARGV_DRIVER
#include <mdso/mdso.h>
+#include <mdso/mdso_output.h>
#include "mdso_driver_impl.h"
#include "argv/argv.h"
@@ -98,6 +99,7 @@ int mdso_get_driver_ctx(
struct argv_entry * entry;
size_t nunits;
const char * program;
+ const char * pretty;
options = mdso_default_options;
@@ -105,6 +107,7 @@ int mdso_get_driver_ctx(
return -1;
nunits = 0;
+ pretty = 0;
program = argv_program_name(argv[0]);
memset(&cctx,0,sizeof(cctx));
@@ -122,11 +125,22 @@ int mdso_get_driver_ctx(
case TAG_VERSION:
cctx.drvflags |= MDSO_DRIVER_VERSION;
break;
+
+ case TAG_PRETTY:
+ pretty = entry->arg;
+ break;
+
+ case TAG_EXPSYMS:
+ cctx.fmtflags |= MDSO_OUTPUT_EXPORT_SYMS;
+ break;
}
} else
nunits++;
}
+ if (pretty && !strcmp(pretty,"yaml"))
+ cctx.fmtflags |= MDSO_PRETTY_YAML;
+
if (!(ctx = mdso_driver_ctx_alloc(meta,nunits)))
return mdso_get_driver_ctx_fail(meta);
diff --git a/src/internal/mdso_driver_impl.h b/src/internal/mdso_driver_impl.h
index aa09197..d76f29e 100644
--- a/src/internal/mdso_driver_impl.h
+++ b/src/internal/mdso_driver_impl.h
@@ -10,6 +10,8 @@
enum app_tags {
TAG_HELP,
TAG_VERSION,
+ TAG_PRETTY,
+ TAG_EXPSYMS,
};
struct mdso_expsyms {
diff --git a/src/mdso.c b/src/mdso.c
index 3370f58..1480325 100644
--- a/src/mdso.c
+++ b/src/mdso.c
@@ -7,6 +7,7 @@
#include <stdio.h>
#include <unistd.h>
#include <mdso/mdso.h>
+#include <mdso/mdso_output.h>
#include "mdso_version.h"
#ifndef MDSO_DRIVER_FLAGS
@@ -23,6 +24,12 @@ static ssize_t mdso_version(struct mdso_driver_ctx * dctx)
static void mdso_perform_unit_actions(struct mdso_unit_ctx * uctx)
{
+ uint64_t flags = uctx->cctx->fmtflags;
+
+ if (flags & MDSO_OUTPUT_EXPORT_SYMS) {
+ uctx->status = mdso_output_export_symbols(uctx,uctx->cctx,stdout);
+ uctx->nerrors += !!uctx->status;
+ }
}
static int mdso_exit(struct mdso_driver_ctx * dctx, int nerrors)
diff --git a/src/output/mdso_output_export_symbols.c b/src/output/mdso_output_export_symbols.c
new file mode 100644
index 0000000..eaac241
--- /dev/null
+++ b/src/output/mdso_output_export_symbols.c
@@ -0,0 +1,49 @@
+/****************************************************************/
+/* mdso: midipix dso scavenger */
+/* Copyright (C) 2015 Z. Gilboa */
+/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
+/****************************************************************/
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#include <mdso/mdso.h>
+#include <mdso/mdso_output.h>
+
+static int pretty_header(const struct mdso_common_ctx * cctx, FILE * fout)
+{
+ return (cctx->fmtflags & MDSO_PRETTY_YAML)
+ ? fputs("exports:\n",fout)
+ : 0;
+}
+
+static int pretty_export_item(const struct mdso_common_ctx * cctx, const char * name, FILE * fout)
+{
+ if (cctx->fmtflags & MDSO_PRETTY_YAML)
+ return fprintf(fout,"- %s\n",name);
+ else
+ return fprintf(fout,"%s\n",name);
+}
+
+int mdso_output_export_symbols(
+ const struct mdso_unit_ctx * uctx,
+ const struct mdso_common_ctx * cctx,
+ FILE * fout)
+{
+ const char * const * sym;
+
+ if (!uctx->syms[0])
+ return 0;
+
+ if ((pretty_header(cctx,fout)) < 0)
+ return -1;
+
+ for (sym=uctx->syms; *sym; sym++)
+ if ((pretty_export_item(cctx,*sym,fout)) < 0)
+ return -1;
+
+ return 0;
+}
diff --git a/src/skin/mdso_skin_default.c b/src/skin/mdso_skin_default.c
index c12f371..cf65a3f 100644
--- a/src/skin/mdso_skin_default.c
+++ b/src/skin/mdso_skin_default.c
@@ -8,5 +8,11 @@ const struct argv_option mdso_default_options[] = {
{"help", 'h',TAG_HELP,ARGV_OPTARG_OPTIONAL,"short|long",0,
"show usage information [listing %s options only]"},
+ {"pretty", 'p',TAG_PRETTY,ARGV_OPTARG_REQUIRED,"yaml",0,
+ "format output for parsing by %s"},
+
+ {"expsyms", 'e',TAG_EXPSYMS,ARGV_OPTARG_NONE,0,0,
+ "print exported symbols" },
+
{0}
};