* config/obj-macho.c (obj_mach_o_is_frame_section): New.
	(obj_mach_o_allow_local_subtract): New.
	* config/obj-macho.h (md_allow_local_subtract): Define.
	(obj_mach_o_allow_local_subtract): Declare.
This commit is contained in:
Iain Sandoe
2012-02-20 20:11:32 +00:00
parent a5759139f8
commit 854ac8ba3b
3 changed files with 44 additions and 0 deletions

View File

@@ -1,3 +1,10 @@
2012-02-20 Iain Sandoe <idsandoe@googlemail.com>
* config/obj-macho.c (obj_mach_o_is_frame_section): New.
(obj_mach_o_allow_local_subtract): New.
* config/obj-macho.h (md_allow_local_subtract): Define.
(obj_mach_o_allow_local_subtract): Declare.
2012-02-20 Iain Sandoe <idsandoe@googlemail.com>
* config/obj-macho.c (obj_mach_o_make_or_get_sect): In the absence of

View File

@@ -1495,6 +1495,19 @@ obj_macho_frob_symbol (struct symbol *sp)
return 0;
}
/* Relocation rules are different in frame sections. */
static int
obj_mach_o_is_frame_section (segT sec)
{
int l;
l = strlen (segment_name (sec));
if ((l == 9 && strncmp (".eh_frame", segment_name (sec), 9) == 0)
|| (l == 12 && strncmp (".debug_frame", segment_name (sec), 12) == 0))
return 1;
return 0;
}
/* Zerofill and GB Zerofill sections must be sorted to follow all other
sections in their segments.
@@ -1757,3 +1770,21 @@ obj_mach_o_process_stab (int what, const char *string,
/* It's a debug symbol. */
s->symbol.flags |= BSF_DEBUGGING;
}
/* Unless we're in a frame section, we need to force relocs to be generated for
local subtractions. We might eliminate them later (if they are within the
same sub-section) but we don't know that at the point that this decision is
being made. */
int
obj_mach_o_allow_local_subtract (expressionS * left ATTRIBUTE_UNUSED,
expressionS * right ATTRIBUTE_UNUSED,
segT seg)
{
/* Don't interfere if it's one of the GAS internal sections. */
if (! SEG_NORMAL (seg))
return 1;
/* Allow in frame sections, otherwise emit a reloc. */
return obj_mach_o_is_frame_section (seg);
}

View File

@@ -73,6 +73,12 @@ void obj_mach_o_reorder_section_relocs (asection *, arelent **, unsigned int);
#define SET_SECTION_RELOCS(sec, relocs, n) \
obj_mach_o_reorder_section_relocs (sec, relocs, n)
/* Emit relocs for local subtracts, to cater for subsections-via-symbols. */
#define md_allow_local_subtract(LEFT, RIGHT, SECTION) \
obj_mach_o_allow_local_subtract (LEFT, RIGHT, SECTION)
extern int obj_mach_o_allow_local_subtract (expressionS *, expressionS *,
segT);
#define EMIT_SECTION_SYMBOLS 0
#define OBJ_PROCESS_STAB(SEG,W,S,T,O,D) obj_mach_o_process_stab(W,S,T,O,D)