diff options
Diffstat (limited to 'modules/objfmts/macho/macho-objfmt.c')
-rw-r--r-- | modules/objfmts/macho/macho-objfmt.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/modules/objfmts/macho/macho-objfmt.c b/modules/objfmts/macho/macho-objfmt.c index a8aea65..a6f8282 100644 --- a/modules/objfmts/macho/macho-objfmt.c +++ b/modules/objfmts/macho/macho-objfmt.c @@ -91,7 +91,7 @@ */ #include <util.h> -/*@unused@*/ RCSID("$Id: macho-objfmt.c 2166 2009-01-02 08:33:21Z peter $"); +/*@unused@*/ RCSID("$Id: macho-objfmt.c 2345 2010-08-01 01:27:40Z peter $"); #include <libyasm.h> @@ -532,7 +532,7 @@ macho_objfmt_output_value(yasm_value *value, unsigned char *buf, if ((vis & YASM_SYM_EXTERN) || (vis & YASM_SYM_COMMON)) { reloc->ext = 1; info->msd->extreloc = 1; /* section has external relocations */ - } else if (!value->curpos_rel && !info->is_64) { + } else if (!info->is_64) { /*@dependent@*/ /*@null@*/ yasm_bytecode *sym_precbc; /* Local symbols need valued to their actual address */ @@ -1001,7 +1001,7 @@ macho_objfmt_calc_sectsize(yasm_section *sect, /*@null@ */ void *d) unsigned long delta = msd->vmoff % align; if (delta > 0) { msd->vmoff += align - delta; - info->vmsize += delta; + info->vmsize += align - delta; } } @@ -1188,7 +1188,7 @@ macho_objfmt_output(yasm_object *object, FILE *f, int all_syms, /* next: section headers */ /* offset to relocs for first section */ - info.rel_base = align32((long)fileoffset + (long)info.filesize); + info.rel_base = align32((long)fileoff_sections); info.s_reloff = 0; /* offset for relocs of following sections */ yasm_object_sections_traverse(object, &info, macho_objfmt_output_secthead); @@ -1217,8 +1217,8 @@ macho_objfmt_output(yasm_object *object, FILE *f, int all_syms, } /* padding to long boundary */ - if (info.rel_base - (fileoffset + info.filesize)) { - fwrite(pad_data, info.rel_base - (fileoffset + info.filesize), 1, f); + if ((info.rel_base - fileoff_sections) > 0) { + fwrite(pad_data, info.rel_base - fileoff_sections, 1, f); } /* relocation data */ @@ -1242,10 +1242,11 @@ macho_objfmt_destroy(yasm_objfmt *objfmt) yasm_xfree(objfmt); } -static macho_section_data * -macho_objfmt_init_new_section(yasm_object *object, yasm_section *sect, - const char *sectname, unsigned long line) +static void +macho_objfmt_init_new_section(yasm_section *sect, unsigned long line) { + yasm_object *object = yasm_section_get_object(sect); + const char *sectname = yasm_section_get_name(sect); yasm_objfmt_macho *objfmt_macho = (yasm_objfmt_macho *)object->objfmt; macho_section_data *data; yasm_symrec *sym; @@ -1265,7 +1266,6 @@ macho_objfmt_init_new_section(yasm_object *object, yasm_section *sect, sym = yasm_symtab_define_label(object->symtab, sectname, yasm_section_bcs_first(sect), 1, line); data->sym = sym; - return data; } static yasm_section * @@ -1278,7 +1278,7 @@ macho_objfmt_add_default_section(yasm_object *object) retval = yasm_object_get_general(object, "LC_SEGMENT.__TEXT.__text", 0, 1, 0, &isnew, 0); if (isnew) { - msd = macho_objfmt_init_new_section(object, retval, ".text", 0); + msd = yasm_section_get_data(retval, &macho_section_data_cb); msd->segname = yasm__xstrdup("__TEXT"); msd->sectname = yasm__xstrdup("__text"); msd->flags = S_ATTR_PURE_INSTRUCTIONS; @@ -1471,10 +1471,7 @@ macho_objfmt_section_switch(yasm_object *object, yasm_valparamhead *valparams, &isnew, line); yasm_xfree(realname); - if (isnew) - msd = macho_objfmt_init_new_section(object, retval, sectname, line); - else - msd = yasm_section_get_data(retval, &macho_section_data_cb); + msd = yasm_section_get_data(retval, &macho_section_data_cb); if (isnew || yasm_section_is_default(retval)) { yasm_section_set_default(retval, 0); @@ -1564,6 +1561,7 @@ yasm_objfmt_module yasm_macho_LTX_objfmt = { macho_objfmt_output, macho_objfmt_destroy, macho_objfmt_add_default_section, + macho_objfmt_init_new_section, macho_objfmt_section_switch, macho_objfmt_get_special_sym }; @@ -1582,6 +1580,7 @@ yasm_objfmt_module yasm_macho32_LTX_objfmt = { macho_objfmt_output, macho_objfmt_destroy, macho_objfmt_add_default_section, + macho_objfmt_init_new_section, macho_objfmt_section_switch, macho_objfmt_get_special_sym }; @@ -1600,6 +1599,7 @@ yasm_objfmt_module yasm_macho64_LTX_objfmt = { macho_objfmt_output, macho_objfmt_destroy, macho_objfmt_add_default_section, + macho_objfmt_init_new_section, macho_objfmt_section_switch, macho_objfmt_get_special_sym }; |