aboutsummaryrefslogtreecommitdiff
path: root/modules/objfmts/macho/macho-objfmt.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/objfmts/macho/macho-objfmt.c')
-rw-r--r--modules/objfmts/macho/macho-objfmt.c30
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
};