diff options
author | midipix <writeonce@midipix.org> | 2017-02-13 00:50:48 -0500 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2017-02-13 01:52:14 -0500 |
commit | 63cd760776dd9cfc14525acfe7f1af02e9aa2fb8 (patch) | |
tree | 17b060b7daf4995583708c761e2733879e0a0296 /src/driver | |
parent | 1c23fb505d3a0a8e76e95e4198cb1d25cd13356e (diff) | |
download | mdso-63cd760776dd9cfc14525acfe7f1af02e9aa2fb8.tar.bz2 mdso-63cd760776dd9cfc14525acfe7f1af02e9aa2fb8.tar.xz |
unit context: added symbol characteristics and DATA support.
Diffstat (limited to 'src/driver')
-rw-r--r-- | src/driver/mdso_unit_ctx.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/driver/mdso_unit_ctx.c b/src/driver/mdso_unit_ctx.c index 4d068bf..01ef303 100644 --- a/src/driver/mdso_unit_ctx.c +++ b/src/driver/mdso_unit_ctx.c @@ -22,6 +22,9 @@ static int mdso_free_unit_ctx_impl(struct mdso_unit_ctx_impl * ctx, int status) if (ctx->expsyms && ctx->expsyms->buffer) free(ctx->expsyms->buffer); + if (ctx->expsyms && ctx->expsyms->stype) + free(ctx->expsyms->stype); + if (ctx->expsyms) free(ctx->expsyms); @@ -90,8 +93,10 @@ static int mdso_create_symbol_vector(struct mdso_unit_ctx_impl * ctx) size_t nbytes; size_t size; char * dst; + const char * base; const char * ch; const char ** sym; + int stype; const char exphdr[] = "EXPORTS\n"; const char imphdr[] = "IMPORTS\n"; @@ -103,7 +108,7 @@ static int mdso_create_symbol_vector(struct mdso_unit_ctx_impl * ctx) nsyms += (*ch == '\n'); size = offsetof(struct mdso_unit_ctx_impl,expsyms); - size += (nsyms+1)*sizeof(const char *); + size += (++nsyms)*sizeof(const char *); if (!(ctx->expsyms = calloc(1,size))) return -1; @@ -111,6 +116,10 @@ static int mdso_create_symbol_vector(struct mdso_unit_ctx_impl * ctx) if (!(ctx->expsyms->buffer = calloc(1,ctx->map.size))) return -1; + if (!(ctx->expsyms->stype = calloc(nsyms,sizeof(int)))) + return -1; + + base = ctx->map.addr; ch = ctx->map.addr; nbytes = ctx->map.size; sym = ctx->expsyms->syms; @@ -135,7 +144,7 @@ static int mdso_create_symbol_vector(struct mdso_unit_ctx_impl * ctx) while (nbytes && ((nbytes < size) || (strncmp(ch,imphdr,size)))) { /* vector */ - *sym++ = dst; + *sym = dst; /* symbol */ for (; nbytes && ((*ch!=' ') @@ -150,6 +159,16 @@ static int mdso_create_symbol_vector(struct mdso_unit_ctx_impl * ctx) for (; nbytes && (*ch!='\n'); nbytes--) ch++; + /* stype */ + stype = ((*ch=='\n') + && ((ch-base) >= 6) + && !strncmp(&ch[-5]," DATA\n",6)) + ? MDSO_SYMBOL_TYPE_DATA + : MDSO_SYMBOL_TYPE_CODE; + + ctx->expsyms->stype[sym - ctx->expsyms->syms] = stype; + sym++; + /* advance to next symbol */ for (; nbytes && ((*ch==' ') || (*ch=='\t') @@ -213,6 +232,7 @@ int mdso_get_unit_ctx( ctx->uctx.map = &ctx->map; ctx->uctx.cctx = &ctx->cctx; ctx->uctx.syms = ctx->expsyms->syms; + ctx->uctx.stype = ctx->expsyms->stype; *pctx = &ctx->uctx; return 0; |