summaryrefslogtreecommitdiffhomepage
path: root/src/object/mdso_objgen_dsometa.c
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2018-08-03 20:56:45 +0000
committermidipix <writeonce@midipix.org>2018-08-03 21:13:30 -0400
commita3e2cfa926e49bb4f63557bd990f83b8f4685734 (patch)
tree3edaf363a11a1fe1050780de272309ca0ac40db8 /src/object/mdso_objgen_dsometa.c
parent18a091990a2de49fb0c9d85b0ae8e86825f2104f (diff)
downloadmdso-a3e2cfa926e49bb4f63557bd990f83b8f4685734.tar.bz2
mdso-a3e2cfa926e49bb4f63557bd990f83b8f4685734.tar.xz
library interfaces: object file generation: simplify, re-implement with mmap.
Diffstat (limited to 'src/object/mdso_objgen_dsometa.c')
-rw-r--r--src/object/mdso_objgen_dsometa.c38
1 files changed, 20 insertions, 18 deletions
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 <stdint.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/mman.h>
#include <mdso/mdso.h>
#include <mdso/mdso_specs.h>
@@ -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;
}