}
static bool
-obj_mach_o_in_different_subsection (symbolS *a, symbolS *b)
+obj_mach_o_in_different_subsection (symbolS *a, segT aseg, valueT offset,
+ symbolS *b)
{
fragS *fa;
fragS *fb;
return true;
}
- fa = symbol_get_frag (a);
+ if (symbol_section_p (a) && aseg != NULL)
+ fa = get_frag_for_address (NULL, seg_info (aseg), offset);
+ else
+ fa = symbol_get_frag (a);
fb = symbol_get_frag (b);
if (fa == NULL || fb == NULL)
{
{
if (! SEG_NORMAL (seg))
return true;
- return obj_mach_o_in_different_subsection (fix->fx_addsy, fix->fx_subsy);
+ return obj_mach_o_in_different_subsection (fix->fx_addsy, seg,
+ fix->fx_offset, fix->fx_subsy);
}
bool
symbolS *fragsym = fix->fx_frag->obj_frag_data.subsection;
if (fragsym == NULL)
return false;
- return obj_mach_o_in_different_subsection (fix->fx_subsy, fragsym);
+ return obj_mach_o_in_different_subsection (fix->fx_subsy, NULL, 0, fragsym);
}
bool
if (fix->fx_addsy != NULL)
{
symbolS *subsec = fix->fx_frag->obj_frag_data.subsection;
- symbolS *targ = fix->fx_addsy;
/* There might be no subsections at all. */
if (subsec == NULL)
return false;
- if (S_GET_SEGMENT (targ) == absolute_section)
+ symbolS *targ = fix->fx_addsy;
+ segT targseg = S_GET_SEGMENT (targ);
+ if (targseg == absolute_section)
return false;
- return obj_mach_o_in_different_subsection (targ, subsec);
+ return obj_mach_o_in_different_subsection (targ, targseg,
+ fix->fx_offset, subsec);
}
return false;
}
#as: --divide
#objdump: -dw
#name: .insn (32-bit code)
-#xfail: *-*-darwin*
.*: +file format .*
}
}
-static fragS *
-get_frag_for_reloc (fragS *last_frag,
- const segment_info_type *seginfo,
- const struct reloc_list *r)
+fragS *
+get_frag_for_address (fragS *last_frag,
+ const segment_info_type *seginfo,
+ addressT addr)
{
fragS *f;
for (f = last_frag; f != NULL; f = f->fr_next)
- if (f->fr_address <= r->u.b.r.address
- && r->u.b.r.address < f->fr_address + f->fr_fix)
+ if (f->fr_address <= addr && addr < f->fr_address + f->fr_fix)
return f;
for (f = seginfo->frchainP->frch_root; f != NULL; f = f->fr_next)
- if (f->fr_address <= r->u.b.r.address
- && r->u.b.r.address < f->fr_address + f->fr_fix)
+ if (f->fr_address <= addr && addr < f->fr_address + f->fr_fix)
return f;
for (f = seginfo->frchainP->frch_root; f != NULL; f = f->fr_next)
- if (f->fr_address <= r->u.b.r.address
- && r->u.b.r.address <= f->fr_address + f->fr_fix)
+ if (f->fr_address <= addr && addr <= f->fr_address + f->fr_fix)
return f;
- as_bad_where (r->file, r->line,
- _("reloc not within (fixed part of) section"));
return NULL;
}
+static fragS *
+get_frag_for_reloc (fragS *last_frag,
+ const segment_info_type *seginfo,
+ const struct reloc_list *r)
+{
+ fragS *f = get_frag_for_address (last_frag, seginfo, r->u.b.r.address);
+
+ if (f == NULL)
+ as_bad_where (r->file, r->line,
+ _("reloc not within (fixed part of) section"));
+ return f;
+}
+
static void
write_relocs (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
void *xxx ATTRIBUTE_UNUSED)
const expressionS *, int, bfd_reloc_code_real_type);
extern void write_print_statistics (FILE *);
extern void as_bad_subtract (fixS *);
+struct segment_info_struct;
+extern fragS *get_frag_for_address (fragS *, const struct segment_info_struct *,
+ addressT);
#endif /* __write_h__ */