From: Iain Sandoe Date: Mon, 20 Feb 2012 20:11:32 +0000 (+0000) Subject: gas: X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=854ac8ba3bf9147a714428f694ab992b7fe93d13;p=binutils-gdb.git gas: * 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. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index d6d30c13af3..2f9d09a2e31 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2012-02-20 Iain Sandoe + + * 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 * config/obj-macho.c (obj_mach_o_make_or_get_sect): In the absence of diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c index b0ef7411bc7..46233840176 100644 --- a/gas/config/obj-macho.c +++ b/gas/config/obj-macho.c @@ -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); +} diff --git a/gas/config/obj-macho.h b/gas/config/obj-macho.h index bb8daf90c05..e081ba0ec2d 100644 --- a/gas/config/obj-macho.h +++ b/gas/config/obj-macho.h @@ -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)