From c02c6c72d0eba5552b8dfe0365934cfbcf4619df Mon Sep 17 00:00:00 2001 From: Jannis Harder Date: Sun, 29 Jul 2012 17:19:46 +0200 Subject: [PATCH] Interpret vstart as linear address Changed segment:offset calculations so that vstart = 16*segment + offset and vseg = segment instead of vstart = offset. Without this the existing code to infer vstart addresses is not useful. --- modules/objfmts/bin/bin-objfmt.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/modules/objfmts/bin/bin-objfmt.c b/modules/objfmts/bin/bin-objfmt.c index 37056097..69264a90 100644 --- a/modules/objfmts/bin/bin-objfmt.c +++ b/modules/objfmts/bin/bin-objfmt.c @@ -512,11 +512,15 @@ get_ssym_value(yasm_symrec *sym, unsigned long line) offset = yasm_intnum_copy(offset); - if (bsymd->which == SSYM_VSTART && bsd->ivseg != NULL) + if (bsymd->which == SSYM_VSTART && bsd->ivseg != NULL) { + yasm_intnum *tmp = yasm_intnum_create_int(16); + yasm_intnum_calc(tmp, YASM_EXPR_MUL, bsd->ivseg); + yasm_intnum_calc(offset, YASM_EXPR_SUB, tmp); + yasm_intnum_destroy(tmp); expr = yasm_expr_create(YASM_EXPR_SEGOFF, yasm_expr_int(yasm_intnum_copy(bsd->ivseg)), yasm_expr_int(offset), line); - else + } else expr = yasm_expr_create_ident(yasm_expr_int(offset), line); return expr; @@ -550,7 +554,11 @@ bin_objfmt_expr_xform(/*@returned@*/ /*@only@*/ yasm_expr *e, yasm_expr *sube; yasm_intnum *seg; - seg = yasm_intnum_copy(bsd->ivseg); + seg = yasm_intnum_create_int(16); + yasm_intnum_calc(seg, YASM_EXPR_MUL, bsd->ivseg); + yasm_intnum_calc(dist, YASM_EXPR_SUB, seg); + yasm_intnum_set(seg, bsd->ivseg); + sube = yasm_expr_create(YASM_EXPR_SEGOFF, yasm_expr_int(seg), yasm_expr_int(dist), e->line);