diff options
Diffstat (limited to 'src')
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. */ /****************************************************************/ @@ -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); |