From a3e2cfa926e49bb4f63557bd990f83b8f4685734 Mon Sep 17 00:00:00 2001 From: midipix Date: Fri, 3 Aug 2018 20:56:45 +0000 Subject: library interfaces: object file generation: simplify, re-implement with mmap. --- src/object/mdso_objgen_dsometa.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) (limited to 'src/object/mdso_objgen_dsometa.c') diff --git a/src/object/mdso_objgen_dsometa.c b/src/object/mdso_objgen_dsometa.c index dfe8a33..388e296 100644 --- a/src/object/mdso_objgen_dsometa.c +++ b/src/object/mdso_objgen_dsometa.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -32,11 +33,11 @@ struct mdso_dsometa_object { int mdso_objgen_dsometa( const struct mdso_driver_ctx * dctx, - FILE * fout, struct mdso_object * vobj) { struct mdso_dsometa_object * dsometa; struct pe_raw_coff_symbol * symrec; + void * addr; unsigned char * mark; struct pe_raw_aux_rec_section * aux; size_t buflen; @@ -65,21 +66,25 @@ int mdso_objgen_dsometa( cstlen = (3 * liblen) + 48; objlen = sizeof(*dsometa) + cstlen; - if (vobj && vobj->addr && (vobj->size < objlen)) + if (vobj->addr && (vobj->size < objlen)) return MDSO_BUFFER_ERROR(dctx); - if (vobj && !vobj->addr) { - vobj->size = objlen; + if ((addr = vobj->addr)) { + (void)0; + + } else { + vobj->size = objlen; vobj->mapstrsnum = 1; vobj->mapstrslen = 10 + liblen; - return 0; - } - if (vobj) - dsometa = (struct mdso_dsometa_object *)vobj->addr; + if (!vobj->name) + return 0; + + else if (mdso_create_object(dctx,vobj) < 0) + return MDSO_NESTED_ERROR(dctx); + } - else if (!(dsometa = calloc(1,objlen))) - return MDSO_SYSTEM_ERROR(dctx); + dsometa = (struct mdso_dsometa_object *)vobj->addr; if (dctx->cctx->drvflags & MDSO_DRIVER_QUAD_PTR) { reclen = sizeof(struct mdso_meta_record_m64); @@ -220,20 +225,17 @@ int mdso_objgen_dsometa( memcpy(&mark[9],dctx->cctx->libname,liblen); /* archive symbol map */ - if (vobj && vobj->mapstrs) + if (vobj->mapstrs) memcpy(vobj->mapstrs,mark,9+liblen); /* .libname */ mark = dsometa->hdr.cfh_machine; memcpy(&mark[stroff],dctx->cctx->libname,liblen); - /* tada */ - if (fout) - if (fwrite(dsometa,objlen,1,fout) == 0) - return MDSO_FILE_ERROR(dctx); - - if (!vobj) - free(dsometa); + /* fs object unmap */ + if (!addr) + munmap(vobj->addr,vobj->size); + /* tada */ return 0; } -- cgit v1.2.3