summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/archive/mdso_argen_common.c30
-rw-r--r--src/crc/mdso_crc32.c2
-rw-r--r--src/crc/mdso_crc64.c2
-rw-r--r--src/driver/mdso_amain.c2
-rw-r--r--src/driver/mdso_driver_ctx.c7
-rw-r--r--src/driver/mdso_unit_ctx.c9
-rw-r--r--src/helper/mdso_create_output.c2
-rw-r--r--src/helper/mdso_map_input.c9
-rw-r--r--src/internal/argv/argv.h131
-rw-r--r--src/internal/mdso_driver_impl.h1
-rw-r--r--src/internal/mdso_errinfo_impl.c2
-rw-r--r--src/internal/mdso_errinfo_impl.h2
-rw-r--r--src/internal/mdso_hexfmt_impl.c35
-rw-r--r--src/internal/mdso_hexfmt_impl.h14
-rw-r--r--src/internal/mdso_object_impl.h16
-rw-r--r--src/internal/perk/perk_structs.h4
-rw-r--r--src/logic/mdso_asmgen_dsometa.c2
-rw-r--r--src/logic/mdso_asmgen_symentry.c2
-rw-r--r--src/mdso.c5
-rw-r--r--src/object/mdso_objgen_dsometa.c9
-rw-r--r--src/object/mdso_objgen_symentry.c94
-rw-r--r--src/output/mdso_output_error.c2
-rw-r--r--src/output/mdso_output_export_symbols.c2
-rw-r--r--src/output/mdso_output_expsyms_crc.c6
-rw-r--r--src/util/mdso_create_implib_archive.c2
-rw-r--r--src/util/mdso_create_implib_objects.c57
-rw-r--r--src/util/mdso_create_implib_sources.c56
27 files changed, 402 insertions, 103 deletions
diff --git a/src/archive/mdso_argen_common.c b/src/archive/mdso_argen_common.c
index a2553c0..2d2f3c5 100644
--- a/src/archive/mdso_argen_common.c
+++ b/src/archive/mdso_argen_common.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
@@ -11,16 +11,31 @@
#include <sys/mman.h>
#include <mdso/mdso.h>
+#include "mdso_object_impl.h"
#include "mdso_errinfo_impl.h"
#include "perk_structs.h"
+static void mdso_obj_write_objname(char * ch, off_t objidx)
+{
+ ch[0] = 's';
+
+ ch[6] = (objidx % 10) + '0'; objidx /= 10;
+ ch[5] = (objidx % 10) + '0'; objidx /= 10;
+ ch[4] = (objidx % 10) + '0'; objidx /= 10;
+ ch[3] = (objidx % 10) + '0'; objidx /= 10;
+ ch[2] = (objidx % 10) + '0'; objidx /= 10;
+ ch[1] = (objidx % 10) + '0'; objidx /= 10;
+
+ ch[7] = '.';
+ ch[8] = 'o';
+}
+
static void mdso_argen_common_hdr(
struct pe_raw_archive_common_hdr * arhdr,
char * file_id,
size_t size)
{
size_t slen;
- char sbuf[10];
memset(arhdr,0x20,sizeof(*arhdr));
@@ -33,8 +48,7 @@ static void mdso_argen_common_hdr(
arhdr->ar_file_mode[0] = '0';
arhdr->ar_time_date_stamp[0] = '0';
- slen = sprintf(sbuf,"%zu",size);
- memcpy(arhdr->ar_file_size,sbuf,slen);
+ mdso_obj_write_dec(arhdr->ar_file_size,size);
arhdr->ar_end_tag[0] = 0x60;
arhdr->ar_end_tag[1] = 0x0a;
@@ -138,10 +152,6 @@ int mdso_argen_common(
objlen += sizeof(uint32_t) * (1 + mapstrsnum);
objlen += mapstrslen;
- objlen += 15;
- objlen |= 15;
- objlen ^= 15;
-
/* archive meta info, in-memory mapping */
if (vobj->addr && (vobj->size < objlen))
return MDSO_BUFFER_ERROR(dctx);
@@ -216,9 +226,7 @@ int mdso_argen_common(
idx += sizeof(uint32_t);
}
- sprintf(
- objname,"s%06zu.o",
- psym - symv);
+ mdso_obj_write_objname(objname,psym - symv);
ret = mdso_objgen_symentry(dctx,*psym,pobj);
diff --git a/src/crc/mdso_crc32.c b/src/crc/mdso_crc32.c
index 69ba162..85c90d4 100644
--- a/src/crc/mdso_crc32.c
+++ b/src/crc/mdso_crc32.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
diff --git a/src/crc/mdso_crc64.c b/src/crc/mdso_crc64.c
index 9502230..8745396 100644
--- a/src/crc/mdso_crc64.c
+++ b/src/crc/mdso_crc64.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
diff --git a/src/driver/mdso_amain.c b/src/driver/mdso_amain.c
index c0d0824..25c1f7c 100644
--- a/src/driver/mdso_amain.c
+++ b/src/driver/mdso_amain.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
diff --git a/src/driver/mdso_driver_ctx.c b/src/driver/mdso_driver_ctx.c
index 30d1ba7..bfa0d9e 100644
--- a/src/driver/mdso_driver_ctx.c
+++ b/src/driver/mdso_driver_ctx.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
@@ -240,6 +240,8 @@ int mdso_get_driver_ctx(
entry->arg,
optv,meta);
+ break;
+
case TAG_VERSION:
cctx.drvflags |= MDSO_DRIVER_VERSION;
break;
@@ -376,6 +378,9 @@ static void mdso_free_driver_ctx_impl(struct mdso_driver_ctx_alloc * ictx)
close(ictx->ctx.fddst);
if (ictx->ctx.fdtmpin >= 0)
+ unlink(ictx->ctx.tmpname);
+
+ if (ictx->ctx.fdtmpin >= 0)
close(ictx->ctx.fdtmpin);
if (ictx->ctx.asmbase)
diff --git a/src/driver/mdso_unit_ctx.c b/src/driver/mdso_unit_ctx.c
index d14beed..f21ccc4 100644
--- a/src/driver/mdso_unit_ctx.c
+++ b/src/driver/mdso_unit_ctx.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
@@ -42,7 +42,7 @@ static int mdso_stdin_to_tmp(const struct mdso_driver_ctx * dctx)
ssize_t cnt;
char * ch;
char buf[4096];
- char template[] = "/tmp/mdso_stdin_to_tmp_XXXXXX";
+ char tmpname[] = "/tmp/mdso_stdin_to_tmp_XXXXXX";
addr = (uintptr_t)dctx - offsetof(struct mdso_driver_ctx_impl,ctx);
ictx = (struct mdso_driver_ctx_impl *)addr;
@@ -50,14 +50,17 @@ static int mdso_stdin_to_tmp(const struct mdso_driver_ctx * dctx)
if (ictx->fdtmpin >= 0)
return dup(ictx->fdtmpin);
- if ((fdtmp = mkstemp(template)) < 0)
+ if ((fdtmp = mkstemp(tmpname)) < 0)
return -1;
if ((ictx->fdtmpin = dup(fdtmp)) < 0) {
close(fdtmp);
+ unlink(tmpname);
return -1;
}
+ strcpy(ictx->tmpname,tmpname);
+
for (;;) {
ret = read(0,buf,sizeof(buf)-1);
diff --git a/src/helper/mdso_create_output.c b/src/helper/mdso_create_output.c
index 9d95d10..163c5a5 100644
--- a/src/helper/mdso_create_output.c
+++ b/src/helper/mdso_create_output.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
diff --git a/src/helper/mdso_map_input.c b/src/helper/mdso_map_input.c
index ab4607f..df8072f 100644
--- a/src/helper/mdso_map_input.c
+++ b/src/helper/mdso_map_input.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
@@ -48,12 +48,11 @@ int mdso_map_input(
if (st.st_size == 0) {
map->size = 0;
map->addr = 0;
- return 0;
+ } else {
+ map->size = st.st_size;
+ map->addr = mmap(0,map->size,prot,MAP_PRIVATE,fd,0);
}
- map->size = st.st_size;
- map->addr = mmap(0,map->size,prot,MAP_PRIVATE,fd,0);
-
if (fnew)
close(fd);
diff --git a/src/internal/argv/argv.h b/src/internal/argv/argv.h
index 8f43ed8..0be1d0e 100644
--- a/src/internal/argv/argv.h
+++ b/src/internal/argv/argv.h
@@ -1,6 +1,6 @@
/****************************************************************************/
/* argv.h: a thread-safe argument vector parser and usage screen generator */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************************/
@@ -83,6 +83,7 @@ enum argv_error {
ARGV_ERROR_INTERNAL,
ARGV_ERROR_SHORT_OPTION,
ARGV_ERROR_LONG_OPTION,
+ ARGV_ERROR_VENDOR_OPTION,
ARGV_ERROR_OPTARG_NONE,
ARGV_ERROR_OPTARG_REQUIRED,
ARGV_ERROR_OPTARG_PARADIGM,
@@ -150,6 +151,12 @@ static void argv_usage(
const struct argv_option **,
const char * mode);
+static void argv_usage_plain(
+ int fd,
+ const char * header,
+ const struct argv_option **,
+ const char * mode);
+
static struct argv_meta * argv_get(
char **,
const struct argv_option **,
@@ -392,7 +399,11 @@ static void argv_scan(
fval = ch;
}
} else {
- ferr = ARGV_ERROR_SHORT_OPTION;
+ if ((ch == &parg[0][1]) && (ch[0] == 'W') && ch[1]) {
+ ferr = ARGV_ERROR_VENDOR_OPTION;
+ } else {
+ ferr = ARGV_ERROR_SHORT_OPTION;
+ }
}
} else if (!fnoscan && (fhybrid || is_long_option(ch))) {
@@ -407,49 +418,72 @@ static void argv_scan(
ch = *parg;
}
- if (fhybrid && !(option->flags & ARGV_OPTION_HYBRID_SWITCH))
+ /* now verify the proper setting of option values */
+ if (fhybrid && !(option->flags & ARGV_OPTION_HYBRID_SWITCH)) {
ferr = ARGV_ERROR_HYBRID_NONE;
- else if (!fhybrid && (option->flags & ARGV_OPTION_HYBRID_ONLY))
+
+ } else if (!fhybrid && (option->flags & ARGV_OPTION_HYBRID_ONLY)) {
ferr = ARGV_ERROR_HYBRID_ONLY;
- else if (option->optarg == ARGV_OPTARG_NONE) {
+
+ } else if (option->optarg == ARGV_OPTARG_NONE) {
if (val[0]) {
ferr = ARGV_ERROR_OPTARG_NONE;
ctx->errch = val + 1;
- } else
+ } else {
fval = false;
+ }
+
} else if (val[0] && (option->flags & ARGV_OPTION_HYBRID_JOINED)) {
fval = true;
ch = val;
- } else if (fhybrid && !val[0] && !(option->flags & ARGV_OPTION_HYBRID_SPACE))
- ferr = ARGV_ERROR_HYBRID_SPACE;
- else if (fhybrid && (val[0]=='=') && !(option->flags & ARGV_OPTION_HYBRID_EQUAL))
+
+ } else if (fhybrid && !val[0] && !(option->flags & ARGV_OPTION_HYBRID_SPACE)) {
+ if (option->optarg == ARGV_OPTARG_OPTIONAL) {
+ fval = false;
+
+ } else {
+ ferr = ARGV_ERROR_HYBRID_SPACE;
+ }
+
+ } else if (fhybrid && (val[0]=='=') && !(option->flags & ARGV_OPTION_HYBRID_EQUAL)) {
ferr = ARGV_ERROR_HYBRID_EQUAL;
- else if (fhybrid && (val[0]==',') && !(option->flags & ARGV_OPTION_HYBRID_COMMA))
+
+ } else if (fhybrid && (val[0]==',') && !(option->flags & ARGV_OPTION_HYBRID_COMMA)) {
ferr = ARGV_ERROR_HYBRID_COMMA;
- else if (!fhybrid && (val[0]==','))
+
+ } else if (!fhybrid && (val[0]==',')) {
ferr = ARGV_ERROR_HYBRID_COMMA;
- else if (val[0] && !val[1])
+
+ } else if (val[0] && !val[1]) {
ferr = ARGV_ERROR_OPTARG_REQUIRED;
- else if (val[0] && val[1]) {
+
+ } else if (val[0] && val[1]) {
fval = true;
ch = ++val;
+
} else if (option->optarg == ARGV_OPTARG_REQUIRED) {
- if (!val[0] && !*parg)
+ if (!val[0] && !*parg) {
ferr = ARGV_ERROR_OPTARG_REQUIRED;
- else if (*parg && is_short_option(*parg))
+
+ } else if (*parg && is_short_option(*parg)) {
ferr = ARGV_ERROR_OPTARG_REQUIRED;
- else if (*parg && is_long_option(*parg))
+
+ } else if (*parg && is_long_option(*parg)) {
ferr = ARGV_ERROR_OPTARG_REQUIRED;
- else if (*parg && is_last_option(*parg))
+
+ } else if (*parg && is_last_option(*parg)) {
ferr = ARGV_ERROR_OPTARG_REQUIRED;
- else
+
+ } else {
fval = true;
+ }
} else {
/* ARGV_OPTARG_OPTIONAL */
fval = val[0];
}
- } else
+ } else {
ferr = ARGV_ERROR_LONG_OPTION;
+ }
}
if (ferr == ARGV_ERROR_OK)
@@ -525,7 +559,11 @@ static const char * argv_program_name(const char * program_path)
static void argv_show_error(int fd, struct argv_ctx * ctx)
{
- char opt_short_name[2] = {0,0};
+ const char * src;
+ char * dst;
+ char * cap;
+ char opt_vendor_buf[256];
+ char opt_short_name[2] = {0,0};
if (ctx->erropt && ctx->erropt->short_name)
opt_short_name[0] = ctx->erropt->short_name;
@@ -541,6 +579,27 @@ static void argv_show_error(int fd, struct argv_ctx * ctx)
argv_dprintf(fd,"'--%s' is not a valid long option\n",ctx->errch);
break;
+ case ARGV_ERROR_VENDOR_OPTION:
+ src = ctx->errch;
+ dst = opt_vendor_buf;
+ cap = &opt_vendor_buf[sizeof(opt_vendor_buf)];
+
+ for (; src && *src && dst<cap; ) {
+ if ((*src == '=') || (*src == ',') || (*src == ':')) {
+ src = 0;
+ } else {
+ *dst++ = *src++;
+ }
+ }
+
+ if (dst == cap)
+ dst--;
+
+ *dst = '\0';
+
+ argv_dprintf(fd,"'-%s' is not a valid vendor option\n",opt_vendor_buf);
+ break;
+
case ARGV_ERROR_OPTARG_NONE:
argv_dprintf(fd,"'%s' is not a valid option value for [%s%s%s%s%s] "
"(option values may not be specified)\n",
@@ -557,7 +616,9 @@ static void argv_show_error(int fd, struct argv_ctx * ctx)
opt_short_name[0] ? "-" : "",
opt_short_name,
opt_short_name[0] ? "," : "",
- ctx->erropt->long_name ? "--" : "",
+ ctx->erropt->long_name
+ ? (ctx->erropt->flags & ARGV_OPTION_HYBRID_ONLY) ? "-" : "--"
+ : "",
ctx->erropt->long_name,
ctx->erropt->paradigm ? "one of the following values:" : "a value",
ctx->erropt->paradigm ? "{" : "",
@@ -763,11 +824,12 @@ static void argv_free(struct argv_meta * xmeta)
}
}
-static void argv_usage(
+static void argv_usage_impl(
int fd,
const char * header,
const struct argv_option ** options,
- const char * mode)
+ const char * mode,
+ int fcolor)
{
const struct argv_option ** optv;
const struct argv_option * option;
@@ -789,12 +851,13 @@ static void argv_usage(
const char cblue [] = "\x1b[34m";
const char ccyan [] = "\x1b[36m";
const char * color = ccyan;
- bool fcolor;
+
+ (void)argv_usage;
+ (void)argv_usage_plain;
fshort = mode ? !strcmp(mode,"short") : 0;
flong = fshort ? 0 : mode && !strcmp(mode,"long");
fboth = !fshort && !flong;
- fcolor = isatty(fd);
if (fcolor)
argv_dprintf(fd,"%s%s",cbold,cgreen);
@@ -936,6 +999,24 @@ static void argv_usage(
argv_dprintf(fd,creset);
}
+static void argv_usage(
+ int fd,
+ const char * header,
+ const struct argv_option ** options,
+ const char * mode)
+{
+ argv_usage_impl(fd,header,options,mode,isatty(fd));
+}
+
+static void argv_usage_plain(
+ int fd,
+ const char * header,
+ const struct argv_option ** options,
+ const char * mode)
+{
+ argv_usage_impl(fd,header,options,mode,0);
+}
+
#endif
#endif
diff --git a/src/internal/mdso_driver_impl.h b/src/internal/mdso_driver_impl.h
index dc37a66..02234f7 100644
--- a/src/internal/mdso_driver_impl.h
+++ b/src/internal/mdso_driver_impl.h
@@ -59,6 +59,7 @@ struct mdso_driver_ctx_impl {
struct mdso_error_info** erricap;
struct mdso_error_info * erriptr[64];
struct mdso_error_info erribuf[64];
+ char tmpname[32];
};
struct mdso_unit_ctx_impl {
diff --git a/src/internal/mdso_errinfo_impl.c b/src/internal/mdso_errinfo_impl.c
index 37ef64a..28a663c 100644
--- a/src/internal/mdso_errinfo_impl.c
+++ b/src/internal/mdso_errinfo_impl.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
diff --git a/src/internal/mdso_errinfo_impl.h b/src/internal/mdso_errinfo_impl.h
index 13aa0c3..6c83033 100644
--- a/src/internal/mdso_errinfo_impl.h
+++ b/src/internal/mdso_errinfo_impl.h
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
diff --git a/src/internal/mdso_hexfmt_impl.c b/src/internal/mdso_hexfmt_impl.c
new file mode 100644
index 0000000..33d337b
--- /dev/null
+++ b/src/internal/mdso_hexfmt_impl.c
@@ -0,0 +1,35 @@
+/****************************************************************/
+/* mdso: midipix dso scavenger */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
+/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
+/****************************************************************/
+
+#include <stdint.h>
+
+char buf[256] = {0};
+
+static unsigned char mdso_hexfmt[16] = {
+ '0','1','2','3','4','5','6','7',
+ '8','9','a','b','c','d','e','f',
+};
+
+void mdso_write_hex_64(char * ch, uint64_t val)
+{
+ ch[0xf] = mdso_hexfmt[val % 16]; val >>= 4;
+ ch[0xe] = mdso_hexfmt[val % 16]; val >>= 4;
+ ch[0xd] = mdso_hexfmt[val % 16]; val >>= 4;
+ ch[0xc] = mdso_hexfmt[val % 16]; val >>= 4;
+ ch[0xb] = mdso_hexfmt[val % 16]; val >>= 4;
+ ch[0xa] = mdso_hexfmt[val % 16]; val >>= 4;
+ ch[0x9] = mdso_hexfmt[val % 16]; val >>= 4;
+ ch[0x8] = mdso_hexfmt[val % 16]; val >>= 4;
+
+ ch[0x7] = mdso_hexfmt[val % 16]; val >>= 4;
+ ch[0x6] = mdso_hexfmt[val % 16]; val >>= 4;
+ ch[0x5] = mdso_hexfmt[val % 16]; val >>= 4;
+ ch[0x4] = mdso_hexfmt[val % 16]; val >>= 4;
+ ch[0x3] = mdso_hexfmt[val % 16]; val >>= 4;
+ ch[0x2] = mdso_hexfmt[val % 16]; val >>= 4;
+ ch[0x1] = mdso_hexfmt[val % 16]; val >>= 4;
+ ch[0x0] = mdso_hexfmt[val % 16]; val >>= 4;
+}
diff --git a/src/internal/mdso_hexfmt_impl.h b/src/internal/mdso_hexfmt_impl.h
new file mode 100644
index 0000000..1ad74d1
--- /dev/null
+++ b/src/internal/mdso_hexfmt_impl.h
@@ -0,0 +1,14 @@
+/****************************************************************/
+/* mdso: midipix dso scavenger */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
+/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
+/****************************************************************/
+
+#ifndef MDSO_HEXFMT_IMPL_H
+#define MDSO_HEXFMT_IMPL_H
+
+#include <stdint.h>
+
+void mdso_write_hex_64(char * ch, uint64_t val);
+
+#endif
diff --git a/src/internal/mdso_object_impl.h b/src/internal/mdso_object_impl.h
index b329ef9..539a77d 100644
--- a/src/internal/mdso_object_impl.h
+++ b/src/internal/mdso_object_impl.h
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
@@ -31,3 +31,17 @@ static inline void mdso_obj_write_quad(unsigned char * ch, uint64_t val)
ch[6] = val >> 48;
ch[7] = val >> 56;
}
+
+static inline void mdso_obj_write_dec(unsigned char * ch, uint64_t dec)
+{
+ int digits;
+ uint64_t val;
+
+ *ch = '0';
+
+ for (digits=0,val=dec; val; digits++)
+ val /= 10;
+
+ for (val=dec; val; val/=10)
+ ch[--digits] = (val % 10) + '0';
+}
diff --git a/src/internal/perk/perk_structs.h b/src/internal/perk/perk_structs.h
index 4dd2ffc..9ffb480 100644
--- a/src/internal/perk/perk_structs.h
+++ b/src/internal/perk/perk_structs.h
@@ -326,13 +326,13 @@ struct pe_raw_coff_symbol_name {
unsigned char cs_zeroes [0x04]; /* 0x00 */
unsigned char cs_offset [0x04]; /* 0x04 */
} long_name;
- };
+ } cs_u;
};
struct pe_raw_coff_strtbl {
unsigned char cst_size [0x04]; /* 0x00 */
- unsigned char cst_data[]; /* 0x04 */
+ unsigned char cst_data []; /* 0x04 */
};
diff --git a/src/logic/mdso_asmgen_dsometa.c b/src/logic/mdso_asmgen_dsometa.c
index 7c0b5ba..c0ef1ca 100644
--- a/src/logic/mdso_asmgen_dsometa.c
+++ b/src/logic/mdso_asmgen_dsometa.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
diff --git a/src/logic/mdso_asmgen_symentry.c b/src/logic/mdso_asmgen_symentry.c
index ef38182..d4c6892 100644
--- a/src/logic/mdso_asmgen_symentry.c
+++ b/src/logic/mdso_asmgen_symentry.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
diff --git a/src/mdso.c b/src/mdso.c
index 3ba66e7..8c8c6c8 100644
--- a/src/mdso.c
+++ b/src/mdso.c
@@ -1,12 +1,15 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
#include <mdso/mdso.h>
+#define MDSO_UNUSED_PARAMETER(p) (void)p
+
int main(int argc, char ** argv, char ** envp)
{
+ MDSO_UNUSED_PARAMETER(argc);
return mdso_main(argv,envp,0);
}
diff --git a/src/object/mdso_objgen_dsometa.c b/src/object/mdso_objgen_dsometa.c
index 388e296..138a4b3 100644
--- a/src/object/mdso_objgen_dsometa.c
+++ b/src/object/mdso_objgen_dsometa.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
@@ -18,6 +18,11 @@
#include "perk_consts.h"
#include "perk_structs.h"
+struct pe_raw_coff_strtbl_impl {
+ unsigned char cst_size [0x04];
+ unsigned char cst_data [0x10];
+};
+
struct mdso_unified_record {
unsigned char data[80];
};
@@ -28,7 +33,7 @@ struct mdso_dsometa_object {
struct mdso_unified_record rec[1];
struct pe_raw_coff_reloc rel[1];
struct pe_raw_coff_symbol sym[8];
- struct pe_raw_coff_strtbl cst;
+ struct pe_raw_coff_strtbl_impl cst;
};
int mdso_objgen_dsometa(
diff --git a/src/object/mdso_objgen_symentry.c b/src/object/mdso_objgen_symentry.c
index 159f924..9303a1e 100644
--- a/src/object/mdso_objgen_symentry.c
+++ b/src/object/mdso_objgen_symentry.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
@@ -18,6 +18,11 @@
#include "perk_consts.h"
#include "perk_structs.h"
+struct pe_raw_coff_strtbl_impl {
+ unsigned char cst_size [0x04];
+ unsigned char cst_data [0x10];
+};
+
struct mdso_symfn_refs {
unsigned char refs[16];
};
@@ -28,9 +33,68 @@ struct mdso_symentry_object {
struct mdso_symfn_refs ref[1];
struct pe_raw_coff_reloc rel[2];
struct pe_raw_coff_symbol sym[9];
- struct pe_raw_coff_strtbl cst;
+ struct pe_raw_coff_strtbl_impl cst;
};
+static void mdso_obj_write_secoff(unsigned char * ch, uint64_t secoff)
+{
+ *ch++ = '/';
+ mdso_obj_write_dec(ch,secoff);
+}
+
+static void mdso_obj_write_sym_symentry(char * ch, const char * sym)
+{
+ *ch++ = '.';
+
+ for (; *sym; )
+ *ch++ = *sym++;
+
+ memcpy(ch,"_symentry.s",11);
+}
+
+static void mdso_obj_write_sym_symstr(char * ch, const char * sym)
+{
+ memcpy(ch,".symstr_",8);
+ ch = &ch[8];
+
+ for (; *sym; )
+ *ch++ = *sym++;
+}
+
+static void mdso_obj_write_sym_impstr(char * ch, uint32_t uscore, const char * sym)
+{
+ memcpy(ch,"__imp_",6);
+ ch = &ch[6];
+
+ if (uscore)
+ *ch++ = '_';
+
+ for (; *sym; )
+ *ch++ = *sym++;
+}
+
+static void mdso_obj_write_sym_secstr(char * ch, const char * secname, const char * sym)
+{
+ for (; *secname; )
+ *ch++ = *secname++;
+
+ *ch++ = '$';
+
+ for (; *sym; )
+ *ch++ = *sym++;
+}
+
+static void mdso_obj_write_libname(char * ch, const char * secname, const char * sym)
+{
+ for (; *secname; )
+ *ch++ = *secname++;
+
+ *ch++ = '_';
+
+ for (; *sym; )
+ *ch++ = *sym++;
+}
+
int mdso_objgen_symentry(
const struct mdso_driver_ctx * dctx,
const char * sym,
@@ -42,6 +106,7 @@ int mdso_objgen_symentry(
void * mark;
char * ch;
char * strtbl;
+ const char * src;
struct pe_raw_aux_rec_section * aux;
size_t liblen;
uint32_t symlen;
@@ -147,13 +212,13 @@ int mdso_objgen_symentry(
mdso_obj_write_short(syment->hdr.cfh_characteristics,oattr);
/* .dsostrs section header */
- sprintf((char *)syment->sec[0].sh_name,"/%d",stroff_dsostrs);
+ mdso_obj_write_secoff(syment->sec[0].sh_name,stroff_dsostrs);
mdso_obj_write_long(syment->sec[0].sh_size_of_raw_data,symlen+1);
mdso_obj_write_long(syment->sec[0].sh_ptr_to_raw_data,stroff);
mdso_obj_write_long(syment->sec[0].sh_characteristics,sattr);
/* .dsosyms section header */
- sprintf((char *)syment->sec[1].sh_name,"/%d",stroff_dsosyms);
+ mdso_obj_write_secoff(syment->sec[1].sh_name,stroff_dsosyms);
mdso_obj_write_long(syment->sec[1].sh_size_of_raw_data,2*relrva);
mdso_obj_write_long(syment->sec[1].sh_ptr_to_raw_data,refoff);
mdso_obj_write_long(syment->sec[1].sh_ptr_to_relocs,reloff);
@@ -186,7 +251,7 @@ int mdso_objgen_symentry(
mdso_obj_write_long(&symrec[1].cs_name[4],stroff_file);
memcpy(symrec[0].cs_name,".file",5);
- sprintf(&strtbl[stroff_file],".%s_symentry.s",sym);
+ mdso_obj_write_sym_symentry(&strtbl[stroff_file],sym);
symrec += 2;
@@ -196,7 +261,7 @@ int mdso_objgen_symentry(
mdso_obj_write_short(symrec[0].cs_section_number,1);
mdso_obj_write_long(&symrec[0].cs_name[4],stroff_dsostrs);
- sprintf(&strtbl[stroff_dsostrs],"%s$%s",MDSO_STRS_SECTION,sym);
+ mdso_obj_write_sym_secstr(&strtbl[stroff_dsostrs],MDSO_STRS_SECTION,sym);
aux = (struct pe_raw_aux_rec_section *)&symrec[1];
mdso_obj_write_long(aux->aux_size,symlen+1);
@@ -210,7 +275,7 @@ int mdso_objgen_symentry(
mdso_obj_write_short(symrec[0].cs_section_number,2);
mdso_obj_write_long(&symrec[0].cs_name[4],stroff_dsosyms);
- sprintf(&strtbl[stroff_dsosyms],"%s$%s",MDSO_SYMS_SECTION,sym);
+ mdso_obj_write_sym_secstr(&strtbl[stroff_dsosyms],MDSO_SYMS_SECTION,sym);
aux = (struct pe_raw_aux_rec_section *)&symrec[1];
mdso_obj_write_long(aux->aux_size,2*relrva);
@@ -224,7 +289,7 @@ int mdso_objgen_symentry(
mdso_obj_write_short(symrec[0].cs_section_number,1);
mdso_obj_write_long(&symrec[0].cs_name[4],stroff_symstr);
- sprintf(&strtbl[stroff_symstr],".symstr_%s",sym);
+ mdso_obj_write_sym_symstr(&strtbl[stroff_symstr],sym);
symrec += 1;
@@ -234,13 +299,18 @@ int mdso_objgen_symentry(
mdso_obj_write_short(symrec[0].cs_section_number,2);
mdso_obj_write_long(&symrec[0].cs_name[4],stroff_impsym);
- sprintf(&strtbl[stroff_impsym],"__imp_%s%s",uscore ? "_" : "", sym);
+ mdso_obj_write_sym_impstr(&strtbl[stroff_impsym],uscore,sym);
symrec += 1;
/* archive symbol map */
- if (vobj->mapstrs)
- strcpy(vobj->mapstrs,&strtbl[stroff_impsym]);
+ if (vobj->mapstrs) {
+ ch = vobj->mapstrs;
+ src = &strtbl[stroff_impsym];
+
+ for (; *src; )
+ *ch++ = *src++;
+ }
/* coff symbol: .dsometa_libname */
symrec[0].cs_storage_class[0] = PE_IMAGE_SYM_CLASS_EXTERNAL;
@@ -249,7 +319,7 @@ int mdso_objgen_symentry(
mdso_obj_write_short(symrec[0].cs_section_number,0);
mdso_obj_write_long(&symrec[0].cs_name[4],stroff_libname);
- sprintf(&strtbl[stroff_libname],"%s_%s",
+ mdso_obj_write_libname(&strtbl[stroff_libname],
MDSO_META_SECTION,
dctx->cctx->libname);
diff --git a/src/output/mdso_output_error.c b/src/output/mdso_output_error.c
index 6a382b7..9e03448 100644
--- a/src/output/mdso_output_error.c
+++ b/src/output/mdso_output_error.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
diff --git a/src/output/mdso_output_export_symbols.c b/src/output/mdso_output_export_symbols.c
index 6f36a6d..5e22433 100644
--- a/src/output/mdso_output_export_symbols.c
+++ b/src/output/mdso_output_export_symbols.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
diff --git a/src/output/mdso_output_expsyms_crc.c b/src/output/mdso_output_expsyms_crc.c
index 45ff702..75202bf 100644
--- a/src/output/mdso_output_expsyms_crc.c
+++ b/src/output/mdso_output_expsyms_crc.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2019 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
@@ -22,7 +22,7 @@ static int pretty_expsym_crc32(
const char * name)
{
return mdso_dprintf(
- fdout,"%" PRIx32 " %s\n",
+ fdout,"%08" PRIx32 " %s\n",
mdso_crc32_mbstr((const unsigned char *)name,0),
name);
}
@@ -32,7 +32,7 @@ static int pretty_expsym_crc64(
const char * name)
{
return mdso_dprintf(
- fdout,"%" PRIx64 " %s\n",
+ fdout,"%016" PRIx64 " %s\n",
mdso_crc64_mbstr((const unsigned char *)name,0),
name);
}
diff --git a/src/util/mdso_create_implib_archive.c b/src/util/mdso_create_implib_archive.c
index a7e5cfe..13e5747 100644
--- a/src/util/mdso_create_implib_archive.c
+++ b/src/util/mdso_create_implib_archive.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
diff --git a/src/util/mdso_create_implib_objects.c b/src/util/mdso_create_implib_objects.c
index d310ff8..d165c34 100644
--- a/src/util/mdso_create_implib_objects.c
+++ b/src/util/mdso_create_implib_objects.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
@@ -9,19 +9,50 @@
#include <string.h>
#include <mdso/mdso.h>
+#include "mdso_hexfmt_impl.h"
#include "mdso_errinfo_impl.h"
-static void mdso_init_objname(char * buf, const char * fmt, const char * str)
+static void mdso_init_symentry(char * ch, const char * str)
{
- char hexstr[24];
- long long unsigned int crc64;
-
- if (strlen(str) + strlen(fmt) > (PATH_MAX - 1)) {
- crc64 = mdso_crc64_mbstr((const unsigned char *)str,0);
- sprintf(hexstr,"%llx",crc64);
- sprintf(buf,fmt,hexstr);
- } else
- sprintf(buf,fmt,str);
+ uint64_t crc64;
+ unsigned slen = 11;
+
+ ch[0] = '.';
+ ch++;
+
+ if (strlen(str) > (PATH_MAX - slen - 1)) {
+ crc64 = mdso_crc64_mbstr((unsigned char *)str,0);
+ mdso_write_hex_64(ch,crc64);
+ ch = &ch[16];
+ } else {
+ for (; *str; )
+ *ch++ = *str++;
+ }
+
+ memcpy(ch,"_symentry.o",slen);
+ ch[slen] = '\0';
+}
+
+static void mdso_init_dsometa(char * ch, const char * str)
+{
+ uint64_t crc64;
+ unsigned slen = 9;
+
+ memcpy(ch,".dsometa_",slen);
+ ch = &ch[slen];
+
+ if (strlen(str) > (PATH_MAX - slen - 1)) {
+ crc64 = mdso_crc64_mbstr((unsigned char *)str,0);
+ mdso_write_hex_64(ch,crc64);
+ ch = &ch[16];
+ } else {
+ for (; *str; )
+ *ch++ = *str++;
+ }
+
+ ch[0] = '.';
+ ch[1] = 'o';
+ ch[2] = '\0';
}
static void mdso_init_object(struct mdso_object * obj, const char * objname)
@@ -44,7 +75,7 @@ int mdso_create_implib_objects(const struct mdso_driver_ctx * dctx)
return MDSO_NESTED_ERROR(dctx);
for (sym=uctx->syms; *sym; sym++) {
- mdso_init_objname(objname,".%s_symentry.o",*sym);
+ mdso_init_symentry(objname,*sym);
mdso_init_object(&obj,objname);
if (mdso_objgen_symentry(dctx,*sym,&obj) < 0)
@@ -55,7 +86,7 @@ int mdso_create_implib_objects(const struct mdso_driver_ctx * dctx)
}
/* dsometa */
- mdso_init_objname(objname,".dsometa_%s.o",dctx->cctx->libname);
+ mdso_init_dsometa(objname,dctx->cctx->libname);
mdso_init_object(&obj,objname);
if (mdso_objgen_dsometa(dctx,&obj) < 0)
diff --git a/src/util/mdso_create_implib_sources.c b/src/util/mdso_create_implib_sources.c
index 317f2c8..5d002d5 100644
--- a/src/util/mdso_create_implib_sources.c
+++ b/src/util/mdso_create_implib_sources.c
@@ -1,6 +1,6 @@
/****************************************************************/
/* mdso: midipix dso scavenger */
-/* Copyright (C) 2015--2017 Z. Gilboa */
+/* Copyright (C) 2015--2024 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.MDSO. */
/****************************************************************/
@@ -10,21 +10,51 @@
#include <mdso/mdso.h>
#include "mdso_driver_impl.h"
+#include "mdso_hexfmt_impl.h"
#include "mdso_errinfo_impl.h"
-static void mdso_init_asmname(char * buf, const char * fmt, const char * str)
+static void mdso_init_symentry(char * ch, const char * str)
{
- char hexstr[24];
- long long unsigned int crc64;
-
- if (strlen(str) + strlen(fmt) > (PATH_MAX - 1)) {
- crc64 = mdso_crc64_mbstr((const unsigned char *)str,0);
- sprintf(hexstr,"%llx",crc64);
- sprintf(buf,fmt,hexstr);
- } else
- sprintf(buf,fmt,str);
+ uint64_t crc64;
+ unsigned slen = 11;
+
+ ch[0] = '.';
+ ch++;
+
+ if (strlen(str) > (PATH_MAX - slen - 1)) {
+ crc64 = mdso_crc64_mbstr((unsigned char *)str,0);
+ mdso_write_hex_64(ch,crc64);
+ ch = &ch[16];
+ } else {
+ for (; *str; )
+ *ch++ = *str++;
+ }
+
+ memcpy(ch,"_symentry.s",slen);
+ ch[slen] = '\0';
}
+static void mdso_init_dsometa(char * ch, const char * str)
+{
+ uint64_t crc64;
+ unsigned slen = 9;
+
+ memcpy(ch,".dsometa_",slen);
+ ch = &ch[slen];
+
+ if (strlen(str) > (PATH_MAX - slen - 1)) {
+ crc64 = mdso_crc64_mbstr((unsigned char *)str,0);
+ mdso_write_hex_64(ch,crc64);
+ ch = &ch[16];
+ } else {
+ for (; *str; )
+ *ch++ = *str++;
+ }
+
+ ch[0] = '.';
+ ch[1] = 's';
+ ch[2] = '\0';
+}
int mdso_create_implib_sources(const struct mdso_driver_ctx * dctx)
{
struct mdso_unit_ctx * uctx;
@@ -41,7 +71,7 @@ int mdso_create_implib_sources(const struct mdso_driver_ctx * dctx)
return MDSO_NESTED_ERROR(dctx);
for (sym=uctx->syms; *sym; sym++) {
- mdso_init_asmname(asmname,".%s_symentry.s",*sym);
+ mdso_init_symentry(asmname,*sym);
if ((fdout = mdso_create_asmsrc(dctx,asmname)) < 0)
return MDSO_NESTED_ERROR(dctx);
@@ -59,7 +89,7 @@ int mdso_create_implib_sources(const struct mdso_driver_ctx * dctx)
}
/* dsometa */
- mdso_init_asmname(asmname,".dsometa_%s.s",dctx->cctx->libname);
+ mdso_init_dsometa(asmname,dctx->cctx->libname);
if ((fdout = mdso_create_asmsrc(dctx,asmname)) < 0)
return MDSO_NESTED_ERROR(dctx);