Home | History | Annotate | Download | only in config
      1 /* Mach-O object file format
      2    Copyright (C) 2009-2014 Free Software Foundation, Inc.
      3 
      4    This file is part of GAS, the GNU Assembler.
      5 
      6    GAS is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as
      8    published by the Free Software Foundation; either version 3,
      9    or (at your option) any later version.
     10 
     11    GAS is distributed in the hope that it will be useful, but
     12    WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     14    the GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with GAS; see the file COPYING.  If not, write to the Free
     18    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
     19    02110-1301, USA.  */
     20 
     21 /* Here we handle the mach-o directives that are common to all architectures.
     22 
     23    Most significant are mach-o named sections and a variety of symbol type
     24    decorations.  */
     25 
     26 /* Mach-O supports multiple, named segments each of which may contain
     27    multiple named sections.  Thus the concept of subsectioning is
     28    handled by (say) having a __TEXT segment with appropriate flags from
     29    which subsections are generated like __text, __const etc.
     30 
     31    The well-known as short-hand section switch directives like .text, .data
     32    etc. are mapped onto predefined segment/section pairs using facilites
     33    supplied by the mach-o port of bfd.
     34 
     35    A number of additional mach-o short-hand section switch directives are
     36    also defined.  */
     37 
     38 #define OBJ_HEADER "obj-macho.h"
     39 
     40 #include "as.h"
     41 #include "subsegs.h"
     42 #include "symbols.h"
     43 #include "write.h"
     44 #include "mach-o.h"
     45 #include "mach-o/loader.h"
     46 #include "obj-macho.h"
     47 
     48 #include <string.h>
     49 
     50 /* Forward decls.  */
     51 static segT obj_mach_o_segT_from_bfd_name (const char *, int);
     52 
     53 /* TODO: Implement "-dynamic"/"-static" command line options.  */
     54 
     55 static int obj_mach_o_is_static;
     56 
     57 /* TODO: Implement the "-n" command line option to suppress the initial
     58    switch to the text segment.  */
     59 
     60 static int obj_mach_o_start_with_text_section = 1;
     61 
     62 /* Allow for special re-ordering on output.  */
     63 
     64 static int obj_mach_o_seen_objc_section;
     65 
     66 /* Start-up: At present, just create the sections we want.  */
     67 void
     68 mach_o_begin (void)
     69 {
     70   /* Mach-O only defines the .text section by default, and even this can
     71      be suppressed by a flag.  In the latter event, the first code MUST
     72      be a section definition.  */
     73   if (obj_mach_o_start_with_text_section)
     74     {
     75       text_section = obj_mach_o_segT_from_bfd_name (TEXT_SECTION_NAME, 1);
     76       subseg_set (text_section, 0);
     77       if (obj_mach_o_is_static)
     78 	{
     79 	  bfd_mach_o_section *mo_sec
     80 			= bfd_mach_o_get_mach_o_section (text_section);
     81 	  mo_sec->flags &= ~BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS;
     82 	}
     83     }
     84 }
     85 
     86 /* Remember the subsections_by_symbols state in case we need to reset
     87    the file flags.  */
     88 
     89 static int obj_mach_o_subsections_by_symbols;
     90 
     91 /* This will put at most 16 characters (terminated by a ',' or newline) from
     92    the input stream into dest.  If there are more than 16 chars before the
     93    delimiter, a warning is given and the string is truncated.  On completion of
     94    this function, input_line_pointer will point to the char after the ',' or
     95    to the newline.
     96 
     97    It trims leading and trailing space.  */
     98 
     99 static int
    100 collect_16char_name (char *dest, const char *msg, int require_comma)
    101 {
    102   char c, *namstart;
    103 
    104   SKIP_WHITESPACE ();
    105   namstart = input_line_pointer;
    106 
    107   while ( (c = *input_line_pointer) != ','
    108 	 && !is_end_of_line[(unsigned char) c])
    109     input_line_pointer++;
    110 
    111   {
    112       int len = input_line_pointer - namstart; /* could be zero.  */
    113       /* lose any trailing space.  */
    114       while (len > 0 && namstart[len-1] == ' ')
    115         len--;
    116       if (len > 16)
    117         {
    118           *input_line_pointer = '\0'; /* make a temp string.  */
    119 	  as_bad (_("the %s name '%s' is too long (maximum 16 characters)"),
    120 		     msg, namstart);
    121 	  *input_line_pointer = c; /* restore for printing.  */
    122 	  len = 16;
    123 	}
    124       if (len > 0)
    125         memcpy (dest, namstart, len);
    126   }
    127 
    128   if (c != ',' && require_comma)
    129     {
    130       as_bad (_("expected a %s name followed by a `,'"), msg);
    131       return 1;
    132     }
    133 
    134   return 0;
    135 }
    136 
    137 static int
    138 obj_mach_o_get_section_names (char *seg, char *sec,
    139 			      unsigned segl, unsigned secl)
    140 {
    141   /* Zero-length segment and section names are allowed.  */
    142   /* Parse segment name.  */
    143   memset (seg, 0, segl);
    144   if (collect_16char_name (seg, "segment", 1))
    145     {
    146       ignore_rest_of_line ();
    147       return 0;
    148     }
    149   input_line_pointer++; /* Skip the terminating ',' */
    150 
    151   /* Parse section name, which can be empty.  */
    152   memset (sec, 0, secl);
    153   collect_16char_name (sec, "section", 0);
    154   return 1;
    155 }
    156 
    157 /* Build (or get) a section from the mach-o description - which includes
    158    optional definitions for type, attributes, alignment and stub size.
    159 
    160    BFD supplies default values for sections which have a canonical name.  */
    161 
    162 #define SECT_TYPE_SPECIFIED 0x0001
    163 #define SECT_ATTR_SPECIFIED 0x0002
    164 #define SECT_ALGN_SPECIFIED 0x0004
    165 #define SECT_STUB_SPECIFIED 0x0008
    166 
    167 static segT
    168 obj_mach_o_make_or_get_sect (char * segname, char * sectname,
    169 			     unsigned int specified_mask,
    170 			     unsigned int usectype, unsigned int usecattr,
    171 			     unsigned int ualign, offsetT stub_size)
    172 {
    173   unsigned int sectype, secattr, secalign;
    174   flagword oldflags, flags;
    175   const char *name;
    176   segT sec;
    177   bfd_mach_o_section *msect;
    178   const mach_o_section_name_xlat *xlat;
    179 
    180   /* This provides default bfd flags and default mach-o section type and
    181      attributes along with the canonical name.  */
    182   xlat = bfd_mach_o_section_data_for_mach_sect (stdoutput, segname, sectname);
    183 
    184   /* TODO: more checking of whether overides are acually allowed.  */
    185 
    186   if (xlat != NULL)
    187     {
    188       name = xstrdup (xlat->bfd_name);
    189       sectype = xlat->macho_sectype;
    190       if (specified_mask & SECT_TYPE_SPECIFIED)
    191 	{
    192 	  if ((sectype == BFD_MACH_O_S_ZEROFILL
    193 	       || sectype == BFD_MACH_O_S_GB_ZEROFILL)
    194 	      && sectype != usectype)
    195 	    as_bad (_("cannot overide zerofill section type for `%s,%s'"),
    196 		    segname, sectname);
    197 	  else
    198 	    sectype = usectype;
    199 	}
    200       secattr = xlat->macho_secattr;
    201       secalign = xlat->sectalign;
    202       flags = xlat->bfd_flags;
    203     }
    204   else
    205     {
    206       /* There is no normal BFD section name for this section.  Create one.
    207          The name created doesn't really matter as it will never be written
    208          on disk.  */
    209       size_t seglen = strlen (segname);
    210       size_t sectlen = strlen (sectname);
    211       char *n;
    212 
    213       n = xmalloc (seglen + 1 + sectlen + 1);
    214       memcpy (n, segname, seglen);
    215       n[seglen] = '.';
    216       memcpy (n + seglen + 1, sectname, sectlen);
    217       n[seglen + 1 + sectlen] = 0;
    218       name = n;
    219       if (specified_mask & SECT_TYPE_SPECIFIED)
    220 	sectype = usectype;
    221       else
    222 	sectype = BFD_MACH_O_S_REGULAR;
    223       secattr = BFD_MACH_O_S_ATTR_NONE;
    224       secalign = 0;
    225       flags = SEC_NO_FLAGS;
    226     }
    227 
    228   /* For now, just use what the user provided.  */
    229 
    230   if (specified_mask & SECT_ATTR_SPECIFIED)
    231     secattr = usecattr;
    232 
    233   if (specified_mask & SECT_ALGN_SPECIFIED)
    234     secalign = ualign;
    235 
    236   /* Sub-segments don't exists as is on Mach-O.  */
    237   sec = subseg_new (name, 0);
    238 
    239   oldflags = bfd_get_section_flags (stdoutput, sec);
    240   msect = bfd_mach_o_get_mach_o_section (sec);
    241 
    242   if (oldflags == SEC_NO_FLAGS)
    243     {
    244       /* In the absence of canonical information, try to determine CODE and
    245 	 DEBUG section flags from the mach-o section data.  */
    246       if (flags == SEC_NO_FLAGS
    247 	  && (specified_mask & SECT_ATTR_SPECIFIED)
    248 	  && (secattr & BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS))
    249 	flags |= SEC_CODE;
    250 
    251       if (flags == SEC_NO_FLAGS
    252 	  && (specified_mask & SECT_ATTR_SPECIFIED)
    253 	  && (secattr & BFD_MACH_O_S_ATTR_DEBUG))
    254 	flags |= SEC_DEBUGGING;
    255 
    256       /* New, so just use the defaults or what's specified.  */
    257       if (! bfd_set_section_flags (stdoutput, sec, flags))
    258 	as_warn (_("failed to set flags for \"%s\": %s"),
    259 		 bfd_section_name (stdoutput, sec),
    260 		 bfd_errmsg (bfd_get_error ()));
    261 
    262       strncpy (msect->segname, segname, sizeof (msect->segname));
    263       strncpy (msect->sectname, sectname, sizeof (msect->sectname));
    264 
    265       msect->align = secalign;
    266       msect->flags = sectype | secattr;
    267 
    268       if (sectype == BFD_MACH_O_S_ZEROFILL
    269 	  || sectype == BFD_MACH_O_S_GB_ZEROFILL)
    270         seg_info (sec)->bss = 1;
    271     }
    272   else if (flags != SEC_NO_FLAGS)
    273     {
    274       if (flags != oldflags
    275 	  || msect->flags != (secattr | sectype))
    276 	as_warn (_("Ignoring changed section attributes for %s"), name);
    277     }
    278 
    279   if (specified_mask & SECT_STUB_SPECIFIED)
    280     /* At present, the stub size is not supplied from the BFD tables.  */
    281     msect->reserved2 = stub_size;
    282 
    283   return sec;
    284 }
    285 
    286 /* .section
    287 
    288    The '.section' specification syntax looks like:
    289    .section <segment> , <section> [, type [, attribs [, size]]]
    290 
    291    White space is allowed everywhere between elements.
    292 
    293    <segment> and <section> may be from 0 to 16 chars in length - they may
    294    contain spaces but leading and trailing space will be trimmed.  It is
    295    mandatory that they be present (or that zero-length names are indicated
    296    by ",,").
    297 
    298    There is only a single section type for any entry.
    299 
    300    There may be multiple attributes, they are delimited by `+'.
    301 
    302    Not all section types and attributes are accepted by the Darwin system
    303    assemblers as user-specifiable - although, at present, we do here.  */
    304 
    305 static void
    306 obj_mach_o_section (int ignore ATTRIBUTE_UNUSED)
    307 {
    308   unsigned int sectype = BFD_MACH_O_S_REGULAR;
    309   unsigned int specified_mask = 0;
    310   unsigned int secattr = 0;
    311   offsetT sizeof_stub = 0;
    312   segT new_seg;
    313   char segname[17];
    314   char sectname[17];
    315 
    316 #ifdef md_flush_pending_output
    317   md_flush_pending_output ();
    318 #endif
    319 
    320   /* Get the User's segment annd section names.  */
    321   if (! obj_mach_o_get_section_names (segname, sectname, 17, 17))
    322     return;
    323 
    324   /* Parse section type, if present.  */
    325   if (*input_line_pointer == ',')
    326     {
    327       char *p;
    328       char c;
    329       char tmpc;
    330       int len;
    331       input_line_pointer++;
    332       SKIP_WHITESPACE ();
    333       p = input_line_pointer;
    334       while ((c = *input_line_pointer) != ','
    335 	      && !is_end_of_line[(unsigned char) c])
    336 	input_line_pointer++;
    337 
    338       len = input_line_pointer - p;
    339       /* strip trailing spaces.  */
    340       while (len > 0 && p[len-1] == ' ')
    341 	len--;
    342       tmpc = p[len];
    343 
    344       /* Temporarily make a string from the token.  */
    345       p[len] = 0;
    346       sectype = bfd_mach_o_get_section_type_from_name (stdoutput, p);
    347       if (sectype > 255) /* Max Section ID == 255.  */
    348         {
    349           as_bad (_("unknown or invalid section type '%s'"), p);
    350 	  p[len] = tmpc;
    351 	  ignore_rest_of_line ();
    352 	  return;
    353         }
    354       else
    355 	specified_mask |= SECT_TYPE_SPECIFIED;
    356       /* Restore.  */
    357       p[len] = tmpc;
    358 
    359       /* Parse attributes.
    360 	 TODO: check validity of attributes for section type.  */
    361       if ((specified_mask & SECT_TYPE_SPECIFIED)
    362 	  && c == ',')
    363         {
    364           do
    365             {
    366               int attr;
    367 
    368 	      /* Skip initial `,' and subsequent `+'.  */
    369               input_line_pointer++;
    370 	      SKIP_WHITESPACE ();
    371 	      p = input_line_pointer;
    372 	      while ((c = *input_line_pointer) != '+'
    373 		      && c != ','
    374 		      && !is_end_of_line[(unsigned char) c])
    375 		input_line_pointer++;
    376 
    377 	      len = input_line_pointer - p;
    378 	      /* strip trailing spaces.  */
    379 	      while (len > 0 && p[len-1] == ' ')
    380 		len--;
    381 	      tmpc = p[len];
    382 
    383 	      /* Temporarily make a string from the token.  */
    384 	      p[len] ='\0';
    385               attr = bfd_mach_o_get_section_attribute_from_name (p);
    386 	      if (attr == -1)
    387 		{
    388                   as_bad (_("unknown or invalid section attribute '%s'"), p);
    389 		  p[len] = tmpc;
    390 		  ignore_rest_of_line ();
    391 		  return;
    392                 }
    393               else
    394 		{
    395 		  specified_mask |= SECT_ATTR_SPECIFIED;
    396                   secattr |= attr;
    397 		}
    398 	      /* Restore.  */
    399 	      p[len] = tmpc;
    400             }
    401           while (*input_line_pointer == '+');
    402 
    403           /* Parse sizeof_stub.  */
    404           if ((specified_mask & SECT_ATTR_SPECIFIED)
    405 	      && *input_line_pointer == ',')
    406             {
    407               if (sectype != BFD_MACH_O_S_SYMBOL_STUBS)
    408                 {
    409 		  as_bad (_("unexpected section size information"));
    410 		  ignore_rest_of_line ();
    411 		  return;
    412 		}
    413 
    414 	      input_line_pointer++;
    415               sizeof_stub = get_absolute_expression ();
    416               specified_mask |= SECT_STUB_SPECIFIED;
    417             }
    418           else if ((specified_mask & SECT_ATTR_SPECIFIED)
    419 		   && sectype == BFD_MACH_O_S_SYMBOL_STUBS)
    420             {
    421               as_bad (_("missing sizeof_stub expression"));
    422 	      ignore_rest_of_line ();
    423 	      return;
    424             }
    425         }
    426     }
    427 
    428   new_seg = obj_mach_o_make_or_get_sect (segname, sectname, specified_mask,
    429 					 sectype, secattr, 0 /*align */,
    430 					 sizeof_stub);
    431   if (new_seg != NULL)
    432     {
    433       subseg_set (new_seg, 0);
    434       demand_empty_rest_of_line ();
    435     }
    436 }
    437 
    438 /* .zerofill segname, sectname [, symbolname, size [, align]]
    439 
    440    Zerofill switches, temporarily, to a sect of type 'zerofill'.
    441 
    442    If a variable name is given, it defines that in the section.
    443    Otherwise it just creates the section if it doesn't exist.  */
    444 
    445 static void
    446 obj_mach_o_zerofill (int ignore ATTRIBUTE_UNUSED)
    447 {
    448   char segname[17];
    449   char sectname[17];
    450   segT old_seg = now_seg;
    451   segT new_seg;
    452   symbolS *sym = NULL;
    453   unsigned int align = 0;
    454   unsigned int specified_mask = 0;
    455   offsetT size = 0;
    456 
    457 #ifdef md_flush_pending_output
    458   md_flush_pending_output ();
    459 #endif
    460 
    461   /* Get the User's segment annd section names.  */
    462   if (! obj_mach_o_get_section_names (segname, sectname, 17, 17))
    463     return;
    464 
    465   /* Parse variable definition, if present.  */
    466   if (*input_line_pointer == ',')
    467     {
    468       /* Parse symbol, size [.align]
    469          We follow the method of s_common_internal, with the difference
    470          that the symbol cannot be a duplicate-common.  */
    471       char *name;
    472       char c;
    473       char *p;
    474       expressionS exp;
    475 
    476       input_line_pointer++; /* Skip ',' */
    477       SKIP_WHITESPACE ();
    478       name = input_line_pointer;
    479       c = get_symbol_end ();
    480       /* Just after name is now '\0'.  */
    481       p = input_line_pointer;
    482       *p = c;
    483 
    484       if (name == p)
    485 	{
    486 	  as_bad (_("expected symbol name"));
    487 	  ignore_rest_of_line ();
    488 	  goto done;
    489 	}
    490 
    491       SKIP_WHITESPACE ();
    492       if (*input_line_pointer == ',')
    493 	input_line_pointer++;
    494 
    495       expression_and_evaluate (&exp);
    496       if (exp.X_op != O_constant
    497 	  && exp.X_op != O_absent)
    498 	{
    499 	    as_bad (_("bad or irreducible absolute expression"));
    500 	  ignore_rest_of_line ();
    501 	  goto done;
    502 	}
    503       else if (exp.X_op == O_absent)
    504 	{
    505 	  as_bad (_("missing size expression"));
    506 	  ignore_rest_of_line ();
    507 	  goto done;
    508 	}
    509 
    510       size = exp.X_add_number;
    511       size &= ((offsetT) 2 << (stdoutput->arch_info->bits_per_address - 1)) - 1;
    512       if (exp.X_add_number != size || !exp.X_unsigned)
    513 	{
    514 	  as_warn (_("size (%ld) out of range, ignored"),
    515 		   (long) exp.X_add_number);
    516 	  ignore_rest_of_line ();
    517 	  goto done;
    518 	}
    519 
    520      *p = 0; /* Make the name into a c string for err messages.  */
    521      sym = symbol_find_or_make (name);
    522      if (S_IS_DEFINED (sym) || symbol_equated_p (sym))
    523 	{
    524 	  as_bad (_("symbol `%s' is already defined"), name);
    525 	  *p = c;
    526 	  ignore_rest_of_line ();
    527 	   goto done;
    528 	}
    529 
    530       size = S_GET_VALUE (sym);
    531       if (size == 0)
    532 	size = exp.X_add_number;
    533       else if (size != exp.X_add_number)
    534 	as_warn (_("size of \"%s\" is already %ld; not changing to %ld"),
    535 		   name, (long) size, (long) exp.X_add_number);
    536 
    537       *p = c;  /* Restore the termination char.  */
    538 
    539       SKIP_WHITESPACE ();
    540       if (*input_line_pointer == ',')
    541 	{
    542 	  align = (unsigned int) parse_align (0);
    543 	  if (align == (unsigned int) -1)
    544 	    {
    545 	      as_warn (_("align value not recognized, using size"));
    546 	      align = size;
    547 	    }
    548 	  if (align > 15)
    549 	    {
    550 	      as_warn (_("Alignment (%lu) too large: 15 assumed."),
    551 			(unsigned long)align);
    552 	      align = 15;
    553 	    }
    554 	  specified_mask |= SECT_ALGN_SPECIFIED;
    555 	}
    556     }
    557  /* else just a section definition.  */
    558 
    559   specified_mask |= SECT_TYPE_SPECIFIED;
    560   new_seg = obj_mach_o_make_or_get_sect (segname, sectname, specified_mask,
    561 					 BFD_MACH_O_S_ZEROFILL,
    562 					 BFD_MACH_O_S_ATTR_NONE,
    563 					 align, (offsetT) 0 /*stub size*/);
    564   if (new_seg == NULL)
    565     return;
    566 
    567   /* In case the user specifies the bss section by mach-o name.
    568      Create it on demand */
    569   if (strcmp (new_seg->name, BSS_SECTION_NAME) == 0
    570       && bss_section == NULL)
    571     bss_section = new_seg;
    572 
    573   subseg_set (new_seg, 0);
    574 
    575   if (sym != NULL)
    576     {
    577       char *pfrag;
    578 
    579       if (align)
    580 	{
    581 	  record_alignment (new_seg, align);
    582 	  frag_align (align, 0, 0);
    583 	}
    584 
    585       /* Detach from old frag.  */
    586       if (S_GET_SEGMENT (sym) == new_seg)
    587 	symbol_get_frag (sym)->fr_symbol = NULL;
    588 
    589       symbol_set_frag (sym, frag_now);
    590       pfrag = frag_var (rs_org, 1, 1, 0, sym, size, NULL);
    591       *pfrag = 0;
    592 
    593       S_SET_SEGMENT (sym, new_seg);
    594       if (new_seg == bss_section)
    595 	S_CLEAR_EXTERNAL (sym);
    596     }
    597 
    598 done:
    599   /* switch back to the section that was current before the .zerofill.  */
    600   subseg_set (old_seg, 0);
    601 }
    602 
    603 static segT
    604 obj_mach_o_segT_from_bfd_name (const char *nam, int must_succeed)
    605 {
    606   const mach_o_section_name_xlat *xlat;
    607   const char *segn;
    608   segT sec;
    609 
    610   /* BFD has tables of flags and default attributes for all the sections that
    611      have a 'canonical' name.  */
    612   xlat = bfd_mach_o_section_data_for_bfd_name (stdoutput, nam, &segn);
    613   if (xlat == NULL)
    614     {
    615       if (must_succeed)
    616 	as_fatal (_("BFD is out of sync with GAS, "
    617 		     "unhandled well-known section type `%s'"), nam);
    618       return NULL;
    619     }
    620 
    621   sec = bfd_get_section_by_name (stdoutput, nam);
    622   if (sec == NULL)
    623     {
    624       bfd_mach_o_section *msect;
    625 
    626       sec = subseg_force_new (xlat->bfd_name, 0);
    627 
    628       /* Set default type, attributes and alignment.  */
    629       msect = bfd_mach_o_get_mach_o_section (sec);
    630       msect->flags = xlat->macho_sectype | xlat->macho_secattr;
    631       msect->align = xlat->sectalign;
    632 
    633       if ((msect->flags & BFD_MACH_O_SECTION_TYPE_MASK)
    634 	  == BFD_MACH_O_S_ZEROFILL)
    635 	seg_info (sec)->bss = 1;
    636     }
    637 
    638   return sec;
    639 }
    640 
    641 static const char * const known_sections[] =
    642 {
    643   /*  0 */ NULL,
    644   /* __TEXT */
    645   /*  1 */ ".const",
    646   /*  2 */ ".static_const",
    647   /*  3 */ ".cstring",
    648   /*  4 */ ".literal4",
    649   /*  5 */ ".literal8",
    650   /*  6 */ ".literal16",
    651   /*  7 */ ".constructor",
    652   /*  8 */ ".destructor",
    653   /*  9 */ ".eh_frame",
    654   /* __DATA */
    655   /* 10 */ ".const_data",
    656   /* 11 */ ".static_data",
    657   /* 12 */ ".mod_init_func",
    658   /* 13 */ ".mod_term_func",
    659   /* 14 */ ".dyld",
    660   /* 15 */ ".cfstring"
    661 };
    662 
    663 /* Interface for a known non-optional section directive.  */
    664 
    665 static void
    666 obj_mach_o_known_section (int sect_index)
    667 {
    668   segT section;
    669 
    670 #ifdef md_flush_pending_output
    671   md_flush_pending_output ();
    672 #endif
    673 
    674   section = obj_mach_o_segT_from_bfd_name (known_sections[sect_index], 1);
    675   if (section != NULL)
    676     subseg_set (section, 0);
    677 
    678   /* else, we leave the section as it was; there was a fatal error anyway.  */
    679 }
    680 
    681 static const char * const objc_sections[] =
    682 {
    683   /*  0 */ NULL,
    684   /*  1 */ ".objc_class",
    685   /*  2 */ ".objc_meta_class",
    686   /*  3 */ ".objc_cat_cls_meth",
    687   /*  4 */ ".objc_cat_inst_meth",
    688   /*  5 */ ".objc_protocol",
    689   /*  6 */ ".objc_string_object",
    690   /*  7 */ ".objc_cls_meth",
    691   /*  8 */ ".objc_inst_meth",
    692   /*  9 */ ".objc_cls_refs",
    693   /* 10 */ ".objc_message_refs",
    694   /* 11 */ ".objc_symbols",
    695   /* 12 */ ".objc_category",
    696   /* 13 */ ".objc_class_vars",
    697   /* 14 */ ".objc_instance_vars",
    698   /* 15 */ ".objc_module_info",
    699   /* 16 */ ".cstring", /* objc_class_names Alias for .cstring */
    700   /* 17 */ ".cstring", /* Alias objc_meth_var_types for .cstring */
    701   /* 18 */ ".cstring", /* objc_meth_var_names Alias for .cstring */
    702   /* 19 */ ".objc_selector_strs",
    703   /* 20 */ ".objc_image_info", /* extension.  */
    704   /* 21 */ ".objc_selector_fixup", /* extension.  */
    705   /* 22 */ ".objc1_class_ext", /* ObjC-1 extension.  */
    706   /* 23 */ ".objc1_property_list", /* ObjC-1 extension.  */
    707   /* 24 */ ".objc1_protocol_ext" /* ObjC-1 extension.  */
    708 };
    709 
    710 /* This currently does the same as known_sections, but kept separate for
    711    ease of maintenance.  */
    712 
    713 static void
    714 obj_mach_o_objc_section (int sect_index)
    715 {
    716   segT section;
    717 
    718 #ifdef md_flush_pending_output
    719   md_flush_pending_output ();
    720 #endif
    721 
    722   section = obj_mach_o_segT_from_bfd_name (objc_sections[sect_index], 1);
    723   if (section != NULL)
    724     {
    725       obj_mach_o_seen_objc_section = 1; /* We need to ensure that certain
    726 					   sections are present and in the
    727 					   right order.  */
    728       subseg_set (section, 0);
    729     }
    730 
    731   /* else, we leave the section as it was; there was a fatal error anyway.  */
    732 }
    733 
    734 /* Debug section directives.  */
    735 
    736 static const char * const debug_sections[] =
    737 {
    738   /*  0 */ NULL,
    739   /* __DWARF */
    740   /*  1 */ ".debug_frame",
    741   /*  2 */ ".debug_info",
    742   /*  3 */ ".debug_abbrev",
    743   /*  4 */ ".debug_aranges",
    744   /*  5 */ ".debug_macinfo",
    745   /*  6 */ ".debug_line",
    746   /*  7 */ ".debug_loc",
    747   /*  8 */ ".debug_pubnames",
    748   /*  9 */ ".debug_pubtypes",
    749   /* 10 */ ".debug_str",
    750   /* 11 */ ".debug_ranges",
    751   /* 12 */ ".debug_macro"
    752 };
    753 
    754 /* ??? Maybe these should be conditional on gdwarf-*.
    755    It`s also likely that we will need to be able to set them from the cfi
    756    code.  */
    757 
    758 static void
    759 obj_mach_o_debug_section (int sect_index)
    760 {
    761   segT section;
    762 
    763 #ifdef md_flush_pending_output
    764   md_flush_pending_output ();
    765 #endif
    766 
    767   section = obj_mach_o_segT_from_bfd_name (debug_sections[sect_index], 1);
    768   if (section != NULL)
    769     subseg_set (section, 0);
    770 
    771   /* else, we leave the section as it was; there was a fatal error anyway.  */
    772 }
    773 
    774 /* This could be moved to the tc-xx files, but there is so little dependency
    775    there, that the code might as well be shared.  */
    776 
    777 struct opt_tgt_sect
    778 {
    779  const char *name;
    780  unsigned x86_val;
    781  unsigned ppc_val;
    782 };
    783 
    784 /* The extensions here are for specific sections that are generated by GCC
    785    and Darwin system tools, but don't have directives in the `system as'.  */
    786 
    787 static const struct opt_tgt_sect tgt_sections[] =
    788 {
    789   /*  0 */ { NULL, 0, 0},
    790   /*  1 */ { ".lazy_symbol_pointer", 0, 0},
    791   /*  2 */ { ".lazy_symbol_pointer2", 0, 0}, /* X86 - extension */
    792   /*  3 */ { ".lazy_symbol_pointer3", 0, 0}, /* X86 - extension */
    793   /*  4 */ { ".non_lazy_symbol_pointer", 0, 0},
    794   /*  5 */ { ".non_lazy_symbol_pointer_x86", 0, 0}, /* X86 - extension */
    795   /*  6 */ { ".symbol_stub", 16, 20},
    796   /*  7 */ { ".symbol_stub1", 0, 16}, /* PPC - extension */
    797   /*  8 */ { ".picsymbol_stub", 26, 36},
    798   /*  9 */ { ".picsymbol_stub1", 0, 32}, /* PPC - extension */
    799   /* 10 */ { ".picsymbol_stub2", 25, 0}, /* X86 - extension */
    800   /* 11 */ { ".picsymbol_stub3", 5, 0}, /* X86 - extension  */
    801 };
    802 
    803 /* Interface for an optional section directive.  */
    804 
    805 static void
    806 obj_mach_o_opt_tgt_section (int sect_index)
    807 {
    808   const struct opt_tgt_sect *tgtsct = &tgt_sections[sect_index];
    809   segT section;
    810 
    811 #ifdef md_flush_pending_output
    812   md_flush_pending_output ();
    813 #endif
    814 
    815   section = obj_mach_o_segT_from_bfd_name (tgtsct->name, 0);
    816   if (section == NULL)
    817     {
    818       as_bad (_("%s is not used for the selected target"), tgtsct->name);
    819       /* Leave the section as it is.  */
    820     }
    821   else
    822     {
    823       bfd_mach_o_section *mo_sec = bfd_mach_o_get_mach_o_section (section);
    824       subseg_set (section, 0);
    825 #if defined (TC_I386)
    826       mo_sec->reserved2 = tgtsct->x86_val;
    827 #elif defined (TC_PPC)
    828       mo_sec->reserved2 = tgtsct->ppc_val;
    829 #else
    830       mo_sec->reserved2 = 0;
    831 #endif
    832     }
    833 }
    834 
    835 /* We don't necessarily have the three 'base' sections on mach-o.
    836    Normally, we would start up with only the 'text' section defined.
    837    However, even that can be suppressed with (TODO) c/l option "-n".
    838    Thus, we have to be able to create all three sections on-demand.  */
    839 
    840 static void
    841 obj_mach_o_base_section (int sect_index)
    842 {
    843   segT section;
    844 
    845 #ifdef md_flush_pending_output
    846   md_flush_pending_output ();
    847 #endif
    848 
    849   /* We don't support numeric (or any other) qualifications on the
    850      well-known section shorthands.  */
    851   demand_empty_rest_of_line ();
    852 
    853   switch (sect_index)
    854     {
    855       /* Handle the three sections that are globally known within GAS.
    856 	 For Mach-O, these are created on demand rather than at startup.  */
    857       case 1:
    858 	if (text_section == NULL)
    859 	  text_section = obj_mach_o_segT_from_bfd_name (TEXT_SECTION_NAME, 1);
    860 	if (obj_mach_o_is_static)
    861 	  {
    862 	    bfd_mach_o_section *mo_sec
    863 		= bfd_mach_o_get_mach_o_section (text_section);
    864 	    mo_sec->flags &= ~BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS;
    865 	  }
    866 	section = text_section;
    867 	break;
    868       case 2:
    869 	if (data_section == NULL)
    870 	  data_section = obj_mach_o_segT_from_bfd_name (DATA_SECTION_NAME, 1);
    871 	section = data_section;
    872 	break;
    873       case 3:
    874         /* ??? maybe this achieves very little, as an addition.  */
    875 	if (bss_section == NULL)
    876 	  {
    877 	    bss_section = obj_mach_o_segT_from_bfd_name (BSS_SECTION_NAME, 1);
    878 	    seg_info (bss_section)->bss = 1;
    879 	  }
    880 	section = bss_section;
    881 	break;
    882       default:
    883         as_fatal (_("internal error: base section index out of range"));
    884         return;
    885 	break;
    886     }
    887   subseg_set (section, 0);
    888 }
    889 
    890 /* This finishes off parsing a .comm or .lcomm statement, which both can have
    891    an (optional) alignment field.  It also allows us to create the bss section
    892    on demand.  */
    893 
    894 static symbolS *
    895 obj_mach_o_common_parse (int is_local, symbolS *symbolP,
    896 			 addressT size)
    897 {
    898   addressT align = 0;
    899   bfd_mach_o_asymbol *s;
    900 
    901   SKIP_WHITESPACE ();
    902 
    903   /* Both comm and lcomm take an optional alignment, as a power
    904      of two between 1 and 15.  */
    905   if (*input_line_pointer == ',')
    906     {
    907       /* We expect a power of 2.  */
    908       align = parse_align (0);
    909       if (align == (addressT) -1)
    910 	return NULL;
    911       if (align > 15)
    912 	{
    913 	  as_warn (_("Alignment (%lu) too large: 15 assumed."),
    914 		  (unsigned long)align);
    915 	  align = 15;
    916 	}
    917     }
    918 
    919   s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (symbolP);
    920   if (is_local)
    921     {
    922       /* Create the BSS section on demand.  */
    923       if (bss_section == NULL)
    924 	{
    925 	  bss_section = obj_mach_o_segT_from_bfd_name (BSS_SECTION_NAME, 1);
    926 	  seg_info (bss_section)->bss = 1;
    927 	}
    928       bss_alloc (symbolP, size, align);
    929       s->n_type = BFD_MACH_O_N_SECT;
    930       S_CLEAR_EXTERNAL (symbolP);
    931     }
    932   else
    933     {
    934       S_SET_VALUE (symbolP, size);
    935       S_SET_ALIGN (symbolP, align);
    936       S_SET_EXTERNAL (symbolP);
    937       S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
    938       s->n_type = BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT;
    939     }
    940 
    941   /* This is a data object (whatever we choose that to mean).  */
    942   s->symbol.flags |= BSF_OBJECT;
    943 
    944   /* We've set symbol qualifiers, so validate if you can.  */
    945   s->symbol.udata.i = SYM_MACHO_FIELDS_NOT_VALIDATED;
    946 
    947   return symbolP;
    948 }
    949 
    950 static void
    951 obj_mach_o_comm (int is_local)
    952 {
    953   s_comm_internal (is_local, obj_mach_o_common_parse);
    954 }
    955 
    956 /* Set properties that apply to the whole file.  At present, the only
    957    one defined, is subsections_via_symbols.  */
    958 
    959 typedef enum obj_mach_o_file_properties {
    960   OBJ_MACH_O_FILE_PROP_NONE = 0,
    961   OBJ_MACH_O_FILE_PROP_SUBSECTS_VIA_SYMS,
    962   OBJ_MACH_O_FILE_PROP_MAX
    963 } obj_mach_o_file_properties;
    964 
    965 static void
    966 obj_mach_o_fileprop (int prop)
    967 {
    968   if (prop < 0 || prop >= OBJ_MACH_O_FILE_PROP_MAX)
    969     as_fatal (_("internal error: bad file property ID %d"), prop);
    970 
    971   switch ((obj_mach_o_file_properties) prop)
    972     {
    973       case OBJ_MACH_O_FILE_PROP_SUBSECTS_VIA_SYMS:
    974         obj_mach_o_subsections_by_symbols = 1;
    975 	if (!bfd_set_private_flags (stdoutput,
    976 				    BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS))
    977 	  as_bad (_("failed to set subsections by symbols"));
    978 	demand_empty_rest_of_line ();
    979 	break;
    980       default:
    981 	break;
    982     }
    983 }
    984 
    985 /* Temporary markers for symbol reference data.
    986    Lazy will remain in place.  */
    987 #define LAZY 0x01
    988 #define REFE 0x02
    989 
    990 /* We have a bunch of qualifiers that may be applied to symbols.
    991    .globl is handled here so that we might make sure that conflicting qualifiers
    992    are caught where possible.  */
    993 
    994 typedef enum obj_mach_o_symbol_type {
    995   OBJ_MACH_O_SYM_UNK = 0,
    996   OBJ_MACH_O_SYM_LOCAL = 1,
    997   OBJ_MACH_O_SYM_GLOBL = 2,
    998   OBJ_MACH_O_SYM_REFERENCE = 3,
    999   OBJ_MACH_O_SYM_WEAK_REF = 4,
   1000   OBJ_MACH_O_SYM_LAZY_REF = 5,
   1001   OBJ_MACH_O_SYM_WEAK_DEF = 6,
   1002   OBJ_MACH_O_SYM_PRIV_EXT = 7,
   1003   OBJ_MACH_O_SYM_NO_DEAD_STRIP = 8,
   1004   OBJ_MACH_O_SYM_WEAK = 9
   1005 } obj_mach_o_symbol_type;
   1006 
   1007 /* Set Mach-O-specific symbol qualifiers. */
   1008 
   1009 static int
   1010 obj_mach_o_set_symbol_qualifier (symbolS *sym, int type)
   1011 {
   1012   int is_defined;
   1013   bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (sym);
   1014   bfd_mach_o_section *sec;
   1015   int sectype = -1;
   1016 
   1017   /* If the symbol is defined, then we can do more rigorous checking on
   1018      the validity of the qualifiers.  Otherwise, we are stuck with waiting
   1019      until it's defined - or until write the file.
   1020 
   1021      In certain cases (e.g. when a symbol qualifier is intended to introduce
   1022      an undefined symbol in a stubs section) we should check that the current
   1023      section is appropriate to the qualifier.  */
   1024 
   1025   is_defined = s->symbol.section != bfd_und_section_ptr;
   1026   if (is_defined)
   1027     sec = bfd_mach_o_get_mach_o_section (s->symbol.section) ;
   1028   else
   1029     sec = bfd_mach_o_get_mach_o_section (now_seg) ;
   1030 
   1031   if (sec != NULL)
   1032     sectype = sec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
   1033 
   1034   switch ((obj_mach_o_symbol_type) type)
   1035     {
   1036       case OBJ_MACH_O_SYM_LOCAL:
   1037 	/* This is an extension over the system tools.  */
   1038         if (s->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT))
   1039 	  {
   1040 	    as_bad (_("'%s' previously declared as '%s'."), s->symbol.name,
   1041 		      (s->n_type & BFD_MACH_O_N_PEXT) ? "private extern"
   1042 						      : "global" );
   1043 	    s->symbol.udata.i = SYM_MACHO_FIELDS_UNSET;
   1044 	    return 1;
   1045 	  }
   1046 	else
   1047 	  {
   1048 	    s->n_type &= ~BFD_MACH_O_N_EXT;
   1049 	    S_CLEAR_EXTERNAL (sym);
   1050 	  }
   1051 	break;
   1052 
   1053       case OBJ_MACH_O_SYM_PRIV_EXT:
   1054 	s->n_type |= BFD_MACH_O_N_PEXT ;
   1055 	s->n_desc &= ~LAZY; /* The native tool switches this off too.  */
   1056 	/* We follow the system tools in marking PEXT as also global.  */
   1057 	/* Fall through.  */
   1058 
   1059       case OBJ_MACH_O_SYM_GLOBL:
   1060 	/* It's not an error to define a symbol and then make it global.  */
   1061 	s->n_type |= BFD_MACH_O_N_EXT;
   1062 	S_SET_EXTERNAL (sym);
   1063 	break;
   1064 
   1065       case OBJ_MACH_O_SYM_REFERENCE:
   1066         if (is_defined)
   1067           s->n_desc |= BFD_MACH_O_N_NO_DEAD_STRIP;
   1068         else
   1069           s->n_desc |= (REFE | BFD_MACH_O_N_NO_DEAD_STRIP);
   1070 	break;
   1071 
   1072       case OBJ_MACH_O_SYM_LAZY_REF:
   1073         if (is_defined)
   1074           s->n_desc |= BFD_MACH_O_N_NO_DEAD_STRIP;
   1075         else
   1076           s->n_desc |= (REFE | LAZY | BFD_MACH_O_N_NO_DEAD_STRIP);
   1077 	break;
   1078 
   1079       /* Force ld to retain the symbol - even if it appears unused.  */
   1080       case OBJ_MACH_O_SYM_NO_DEAD_STRIP:
   1081 	s->n_desc |= BFD_MACH_O_N_NO_DEAD_STRIP ;
   1082 	break;
   1083 
   1084       /* Mach-O's idea of weak ...  */
   1085       case OBJ_MACH_O_SYM_WEAK_REF:
   1086 	s->n_desc |= BFD_MACH_O_N_WEAK_REF ;
   1087 	break;
   1088 
   1089       case OBJ_MACH_O_SYM_WEAK_DEF:
   1090 	if (is_defined && sectype != BFD_MACH_O_S_COALESCED)
   1091 	  {
   1092 	    as_bad (_("'%s' can't be a weak_definition (currently only"
   1093 		      " supported in sections of type coalesced)"),
   1094 		      s->symbol.name);
   1095 	    s->symbol.udata.i = SYM_MACHO_FIELDS_UNSET;
   1096 	    return 1;
   1097 	  }
   1098 	else
   1099 	  s->n_desc |= BFD_MACH_O_N_WEAK_DEF;
   1100 	break;
   1101 
   1102       case OBJ_MACH_O_SYM_WEAK:
   1103         /* A generic 'weak' - we try to figure out what it means at
   1104 	   symbol frob time.  */
   1105 	S_SET_WEAK (sym);
   1106 	break;
   1107 
   1108       default:
   1109 	break;
   1110     }
   1111 
   1112     /* We've seen some kind of qualifier - check validity if or when the entity
   1113      is defined.  */
   1114   s->symbol.udata.i = SYM_MACHO_FIELDS_NOT_VALIDATED;
   1115   return 0;
   1116 }
   1117 
   1118 /* Respond to symbol qualifiers.
   1119    All of the form:
   1120    .<qualifier> symbol [, symbol]*
   1121    a list of symbols is an extension over the Darwin system as.  */
   1122 
   1123 static void
   1124 obj_mach_o_sym_qual (int ntype)
   1125 {
   1126   char *name;
   1127   char c;
   1128   symbolS *symbolP;
   1129 
   1130 #ifdef md_flush_pending_output
   1131   md_flush_pending_output ();
   1132 #endif
   1133 
   1134   do
   1135     {
   1136       name = input_line_pointer;
   1137       c = get_symbol_end ();
   1138       symbolP = symbol_find_or_make (name);
   1139       obj_mach_o_set_symbol_qualifier (symbolP, ntype);
   1140       *input_line_pointer = c;
   1141       SKIP_WHITESPACE ();
   1142       c = *input_line_pointer;
   1143       if (c == ',')
   1144 	{
   1145 	  input_line_pointer++;
   1146 	  SKIP_WHITESPACE ();
   1147 	  if (is_end_of_line[(unsigned char) *input_line_pointer])
   1148 	    c = '\n';
   1149 	}
   1150     }
   1151   while (c == ',');
   1152 
   1153   demand_empty_rest_of_line ();
   1154 }
   1155 
   1156 typedef struct obj_mach_o_indirect_sym
   1157 {
   1158   symbolS *sym;
   1159   segT sect;
   1160   struct obj_mach_o_indirect_sym *next;
   1161 } obj_mach_o_indirect_sym;
   1162 
   1163 /* We store in order an maintain a pointer to the last one - to save reversing
   1164    later.  */
   1165 obj_mach_o_indirect_sym *indirect_syms;
   1166 obj_mach_o_indirect_sym *indirect_syms_tail;
   1167 
   1168 static void
   1169 obj_mach_o_indirect_symbol (int arg ATTRIBUTE_UNUSED)
   1170 {
   1171   bfd_mach_o_section *sec = bfd_mach_o_get_mach_o_section (now_seg);
   1172 
   1173 #ifdef md_flush_pending_output
   1174   md_flush_pending_output ();
   1175 #endif
   1176 
   1177   if (obj_mach_o_is_static)
   1178     as_bad (_("use of .indirect_symbols requires `-dynamic'"));
   1179 
   1180   switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
   1181     {
   1182       case BFD_MACH_O_S_SYMBOL_STUBS:
   1183       case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
   1184       case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
   1185         {
   1186           obj_mach_o_indirect_sym *isym;
   1187 	  char *name = input_line_pointer;
   1188 	  char c = get_symbol_end ();
   1189 	  symbolS *sym = symbol_find_or_make (name);
   1190 	  unsigned int elsize =
   1191 			bfd_mach_o_section_get_entry_size (stdoutput, sec);
   1192 
   1193 	  if (elsize == 0)
   1194 	    {
   1195 	      as_bad (_("attempt to add an indirect_symbol to a stub or"
   1196 			" reference section with a zero-sized element at %s"),
   1197 			name);
   1198 	      *input_line_pointer = c;
   1199 	      ignore_rest_of_line ();
   1200 	      return;
   1201 	  }
   1202 	  *input_line_pointer = c;
   1203 
   1204 	  /* The indirect symbols are validated after the symbol table is
   1205 	     frozen, we must make sure that if a local symbol is used as an
   1206 	     indirect, it is promoted to a 'real' one.  Fetching the bfd sym
   1207 	     achieves this.  */
   1208 	  symbol_get_bfdsym (sym);
   1209 	  isym = (obj_mach_o_indirect_sym *)
   1210 			xmalloc (sizeof (obj_mach_o_indirect_sym));
   1211 
   1212 	  /* Just record the data for now, we will validate it when we
   1213 	     compute the output in obj_mach_o_set_indirect_symbols.  */
   1214 	  isym->sym = sym;
   1215 	  isym->sect = now_seg;
   1216 	  isym->next = NULL;
   1217 	  if (indirect_syms == NULL)
   1218 	    indirect_syms = isym;
   1219 	  else
   1220 	    indirect_syms_tail->next = isym;
   1221 	  indirect_syms_tail = isym;
   1222 	}
   1223         break;
   1224 
   1225       default:
   1226 	as_bad (_("an .indirect_symbol must be in a symbol pointer"
   1227 		  " or stub section."));
   1228 	ignore_rest_of_line ();
   1229 	return;
   1230     }
   1231   demand_empty_rest_of_line ();
   1232 }
   1233 
   1234 const pseudo_typeS mach_o_pseudo_table[] =
   1235 {
   1236   /* Section directives.  */
   1237   { "comm", obj_mach_o_comm, 0 },
   1238   { "lcomm", obj_mach_o_comm, 1 },
   1239 
   1240   { "text", obj_mach_o_base_section, 1},
   1241   { "data", obj_mach_o_base_section, 2},
   1242   { "bss", obj_mach_o_base_section, 3},   /* extension */
   1243 
   1244   { "const", obj_mach_o_known_section, 1},
   1245   { "static_const", obj_mach_o_known_section, 2},
   1246   { "cstring", obj_mach_o_known_section, 3},
   1247   { "literal4", obj_mach_o_known_section, 4},
   1248   { "literal8", obj_mach_o_known_section, 5},
   1249   { "literal16", obj_mach_o_known_section, 6},
   1250   { "constructor", obj_mach_o_known_section, 7},
   1251   { "destructor", obj_mach_o_known_section, 8},
   1252   { "eh_frame", obj_mach_o_known_section, 9},
   1253 
   1254   { "const_data", obj_mach_o_known_section, 10},
   1255   { "static_data", obj_mach_o_known_section, 11},
   1256   { "mod_init_func", obj_mach_o_known_section, 12},
   1257   { "mod_term_func", obj_mach_o_known_section, 13},
   1258   { "dyld", obj_mach_o_known_section, 14},
   1259   { "cfstring", obj_mach_o_known_section, 15},
   1260 
   1261   { "objc_class", obj_mach_o_objc_section, 1},
   1262   { "objc_meta_class", obj_mach_o_objc_section, 2},
   1263   { "objc_cat_cls_meth", obj_mach_o_objc_section, 3},
   1264   { "objc_cat_inst_meth", obj_mach_o_objc_section, 4},
   1265   { "objc_protocol", obj_mach_o_objc_section, 5},
   1266   { "objc_string_object", obj_mach_o_objc_section, 6},
   1267   { "objc_cls_meth", obj_mach_o_objc_section, 7},
   1268   { "objc_inst_meth", obj_mach_o_objc_section, 8},
   1269   { "objc_cls_refs", obj_mach_o_objc_section, 9},
   1270   { "objc_message_refs", obj_mach_o_objc_section, 10},
   1271   { "objc_symbols", obj_mach_o_objc_section, 11},
   1272   { "objc_category", obj_mach_o_objc_section, 12},
   1273   { "objc_class_vars", obj_mach_o_objc_section, 13},
   1274   { "objc_instance_vars", obj_mach_o_objc_section, 14},
   1275   { "objc_module_info", obj_mach_o_objc_section, 15},
   1276   { "objc_class_names", obj_mach_o_objc_section, 16}, /* Alias for .cstring */
   1277   { "objc_meth_var_types", obj_mach_o_objc_section, 17}, /* Alias for .cstring */
   1278   { "objc_meth_var_names", obj_mach_o_objc_section, 18}, /* Alias for .cstring */
   1279   { "objc_selector_strs", obj_mach_o_objc_section, 19},
   1280   { "objc_image_info", obj_mach_o_objc_section, 20}, /* extension.  */
   1281   { "objc_selector_fixup", obj_mach_o_objc_section, 21}, /* extension.  */
   1282   { "objc1_class_ext", obj_mach_o_objc_section, 22}, /* ObjC-1 extension.  */
   1283   { "objc1_property_list", obj_mach_o_objc_section, 23}, /* ObjC-1 extension.  */
   1284   { "objc1_protocol_ext", obj_mach_o_objc_section, 24}, /* ObjC-1 extension.  */
   1285 
   1286   { "debug_frame", obj_mach_o_debug_section, 1}, /* extension.  */
   1287   { "debug_info", obj_mach_o_debug_section, 2}, /* extension.  */
   1288   { "debug_abbrev", obj_mach_o_debug_section, 3}, /* extension.  */
   1289   { "debug_aranges", obj_mach_o_debug_section, 4}, /* extension.  */
   1290   { "debug_macinfo", obj_mach_o_debug_section, 5}, /* extension.  */
   1291   { "debug_line", obj_mach_o_debug_section, 6}, /* extension.  */
   1292   { "debug_loc", obj_mach_o_debug_section, 7}, /* extension.  */
   1293   { "debug_pubnames", obj_mach_o_debug_section, 8}, /* extension.  */
   1294   { "debug_pubtypes", obj_mach_o_debug_section, 9}, /* extension.  */
   1295   { "debug_str", obj_mach_o_debug_section, 10}, /* extension.  */
   1296   { "debug_ranges", obj_mach_o_debug_section, 11}, /* extension.  */
   1297   { "debug_macro", obj_mach_o_debug_section, 12}, /* extension.  */
   1298 
   1299   { "lazy_symbol_pointer", obj_mach_o_opt_tgt_section, 1},
   1300   { "lazy_symbol_pointer2", obj_mach_o_opt_tgt_section, 2}, /* extension.  */
   1301   { "lazy_symbol_pointer3", obj_mach_o_opt_tgt_section, 3}, /* extension.  */
   1302   { "non_lazy_symbol_pointer", obj_mach_o_opt_tgt_section, 4},
   1303   { "non_lazy_symbol_pointer_x86", obj_mach_o_opt_tgt_section, 5}, /* extension.  */
   1304   { "symbol_stub", obj_mach_o_opt_tgt_section, 6},
   1305   { "symbol_stub1", obj_mach_o_opt_tgt_section, 7}, /* extension.  */
   1306   { "picsymbol_stub", obj_mach_o_opt_tgt_section, 8}, /* extension.  */
   1307   { "picsymbol_stub1", obj_mach_o_opt_tgt_section, 9}, /* extension.  */
   1308   { "picsymbol_stub2", obj_mach_o_opt_tgt_section, 4}, /* extension.  */
   1309   { "picsymbol_stub3", obj_mach_o_opt_tgt_section, 4}, /* extension.  */
   1310 
   1311   { "section", obj_mach_o_section, 0},
   1312   { "zerofill", obj_mach_o_zerofill, 0},
   1313 
   1314   /* Symbol qualifiers.  */
   1315   {"local",		obj_mach_o_sym_qual, OBJ_MACH_O_SYM_LOCAL},
   1316   {"globl",		obj_mach_o_sym_qual, OBJ_MACH_O_SYM_GLOBL},
   1317   {"reference",		obj_mach_o_sym_qual, OBJ_MACH_O_SYM_REFERENCE},
   1318   {"weak_reference",	obj_mach_o_sym_qual, OBJ_MACH_O_SYM_WEAK_REF},
   1319   {"lazy_reference",	obj_mach_o_sym_qual, OBJ_MACH_O_SYM_LAZY_REF},
   1320   {"weak_definition",	obj_mach_o_sym_qual, OBJ_MACH_O_SYM_WEAK_DEF},
   1321   {"private_extern",	obj_mach_o_sym_qual, OBJ_MACH_O_SYM_PRIV_EXT},
   1322   {"no_dead_strip",	obj_mach_o_sym_qual, OBJ_MACH_O_SYM_NO_DEAD_STRIP},
   1323   {"weak",		obj_mach_o_sym_qual, OBJ_MACH_O_SYM_WEAK}, /* ext */
   1324 
   1325   { "indirect_symbol",	obj_mach_o_indirect_symbol, 0},
   1326 
   1327   /* File flags.  */
   1328   { "subsections_via_symbols", obj_mach_o_fileprop,
   1329 			       OBJ_MACH_O_FILE_PROP_SUBSECTS_VIA_SYMS},
   1330 
   1331   {NULL, NULL, 0}
   1332 };
   1333 
   1334 /* Determine the default n_type value for a symbol from its section.  */
   1335 
   1336 static unsigned
   1337 obj_mach_o_type_for_symbol (bfd_mach_o_asymbol *s)
   1338 {
   1339   if (s->symbol.section == bfd_abs_section_ptr)
   1340     return BFD_MACH_O_N_ABS;
   1341   else if (s->symbol.section == bfd_com_section_ptr
   1342 	   || s->symbol.section == bfd_und_section_ptr)
   1343     return BFD_MACH_O_N_UNDF;
   1344   else
   1345     return BFD_MACH_O_N_SECT;
   1346 }
   1347 
   1348 void
   1349 obj_mach_o_frob_colon (const char *name)
   1350 {
   1351   if (!bfd_is_local_label_name (stdoutput, name))
   1352     {
   1353       /* A non-local label will create a new subsection, so start a new
   1354          frag.  */
   1355       frag_wane (frag_now);
   1356       frag_new (0);
   1357     }
   1358 }
   1359 
   1360 /* We need to check the correspondence between some kinds of symbols and their
   1361    sections.  Common and BSS vars will seen via the obj_macho_comm() function.
   1362 
   1363    The earlier we can pick up a problem, the better the diagnostics will be.
   1364 
   1365    However, when symbol type information is attached, the symbol section will
   1366    quite possibly be unknown.  So we are stuck with checking (most of the)
   1367    validity at the time the file is written (unfortunately, then one doesn't
   1368    get line number information in the diagnostic).  */
   1369 
   1370 /* Here we pick up the case where symbol qualifiers have been applied that
   1371    are possibly incompatible with the section etc. that the symbol is defined
   1372    in.  */
   1373 
   1374 void obj_mach_o_frob_label (struct symbol *sp)
   1375 {
   1376   bfd_mach_o_asymbol *s;
   1377   unsigned base_type;
   1378   bfd_mach_o_section *sec;
   1379   int sectype = -1;
   1380 
   1381   if (!bfd_is_local_label_name (stdoutput, S_GET_NAME (sp)))
   1382     {
   1383       /* If this is a non-local label, it should have started a new sub-
   1384 	 section.  */
   1385       gas_assert (frag_now->obj_frag_data.subsection == NULL);
   1386       frag_now->obj_frag_data.subsection = sp;
   1387     }
   1388 
   1389   /* Leave local symbols alone.  */
   1390 
   1391   if (S_IS_LOCAL (sp))
   1392     return;
   1393 
   1394   s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (sp);
   1395   /* Leave debug symbols alone.  */
   1396   if ((s->n_type & BFD_MACH_O_N_STAB) != 0)
   1397     return;
   1398 
   1399   /* This is the base symbol type, that we mask in.  */
   1400   base_type = obj_mach_o_type_for_symbol (s);
   1401 
   1402   sec = bfd_mach_o_get_mach_o_section (s->symbol.section);
   1403   if (sec != NULL)
   1404     sectype = sec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
   1405 
   1406   /* If there is a pre-existing qualifier, we can make some checks about
   1407      validity now.  */
   1408 
   1409   if(s->symbol.udata.i == SYM_MACHO_FIELDS_NOT_VALIDATED)
   1410     {
   1411       if ((s->n_desc & BFD_MACH_O_N_WEAK_DEF)
   1412 	  && sectype != BFD_MACH_O_S_COALESCED)
   1413 	{
   1414 	  as_bad (_("'%s' can't be a weak_definition (currently only supported"
   1415 		    " in sections of type coalesced)"), s->symbol.name);
   1416 	  /* Don't cascade errors.  */
   1417 	  s->symbol.udata.i = SYM_MACHO_FIELDS_UNSET;
   1418 	}
   1419 
   1420       /* Have we changed from an undefined to defined ref? */
   1421       s->n_desc &= ~(REFE | LAZY);
   1422     }
   1423 
   1424   s->n_type &= ~BFD_MACH_O_N_TYPE;
   1425   s->n_type |= base_type;
   1426 }
   1427 
   1428 /* This is the fall-back, we come here when we get to the end of the file and
   1429    the symbol is not defined - or there are combinations of qualifiers required
   1430    (e.g. global + weak_def).  */
   1431 
   1432 int
   1433 obj_mach_o_frob_symbol (struct symbol *sp)
   1434 {
   1435   bfd_mach_o_asymbol *s;
   1436   unsigned base_type;
   1437   bfd_mach_o_section *sec;
   1438   int sectype = -1;
   1439 
   1440   /* Leave local symbols alone.  */
   1441   if (S_IS_LOCAL (sp))
   1442     return 0;
   1443 
   1444   s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (sp);
   1445   /* Leave debug symbols alone.  */
   1446   if ((s->n_type & BFD_MACH_O_N_STAB) != 0)
   1447     return 0;
   1448 
   1449   base_type = obj_mach_o_type_for_symbol (s);
   1450   sec = bfd_mach_o_get_mach_o_section (s->symbol.section);
   1451   if (sec != NULL)
   1452     sectype = sec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
   1453 
   1454   if (s->symbol.section == bfd_und_section_ptr)
   1455     {
   1456       /* ??? Do we really gain much from implementing this as well as the
   1457 	 mach-o specific ones?  */
   1458       if (s->symbol.flags & BSF_WEAK)
   1459 	s->n_desc |= BFD_MACH_O_N_WEAK_REF;
   1460 
   1461       /* Undefined syms, become extern.  */
   1462       s->n_type |= BFD_MACH_O_N_EXT;
   1463       S_SET_EXTERNAL (sp);
   1464     }
   1465   else if (s->symbol.section == bfd_com_section_ptr)
   1466     {
   1467       /* ... so do comm.  */
   1468       s->n_type |= BFD_MACH_O_N_EXT;
   1469       S_SET_EXTERNAL (sp);
   1470     }
   1471   else
   1472     {
   1473       if ((s->symbol.flags & BSF_WEAK)
   1474 	   && (sectype == BFD_MACH_O_S_COALESCED)
   1475 	   && (s->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT)))
   1476 	s->n_desc |= BFD_MACH_O_N_WEAK_DEF;
   1477 /* ??? we should do this - but then that reveals that the semantics of weak
   1478        are different from what's supported in mach-o object files.
   1479       else
   1480 	as_bad (_("'%s' can't be a weak_definition."),
   1481 		s->symbol.name); */
   1482     }
   1483 
   1484   if (s->symbol.udata.i == SYM_MACHO_FIELDS_UNSET)
   1485     {
   1486       /* Anything here that should be added that is non-standard.  */
   1487       s->n_desc &= ~BFD_MACH_O_REFERENCE_MASK;
   1488     }
   1489   else if (s->symbol.udata.i == SYM_MACHO_FIELDS_NOT_VALIDATED)
   1490     {
   1491       /* Try to validate any combinations.  */
   1492       if (s->n_desc & BFD_MACH_O_N_WEAK_DEF)
   1493 	{
   1494 	  if (s->symbol.section == bfd_und_section_ptr)
   1495 	    as_bad (_("'%s' can't be a weak_definition (since it is"
   1496 		      " undefined)"), s->symbol.name);
   1497 	  else if (sectype != BFD_MACH_O_S_COALESCED)
   1498 	    as_bad (_("'%s' can't be a weak_definition (currently only supported"
   1499 		      " in sections of type coalesced)"), s->symbol.name);
   1500 	  else if (! (s->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT)))
   1501 	    as_bad (_("Non-global symbol: '%s' can't be a weak_definition."),
   1502 		    s->symbol.name);
   1503 	}
   1504 
   1505     }
   1506   else
   1507     as_bad (_("internal error: [%s] unexpected code [%lx] in frob symbol"),
   1508 	    s->symbol.name, (unsigned long)s->symbol.udata.i);
   1509 
   1510   s->n_type &= ~BFD_MACH_O_N_TYPE;
   1511   s->n_type |= base_type;
   1512 
   1513   if (s->symbol.flags & BSF_GLOBAL)
   1514     s->n_type |= BFD_MACH_O_N_EXT;
   1515 
   1516   /* This cuts both ways - we promote some things to external above.  */
   1517   if (s->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT))
   1518     S_SET_EXTERNAL (sp);
   1519 
   1520   return 0;
   1521 }
   1522 
   1523 /* Support stabs for mach-o.  */
   1524 
   1525 void
   1526 obj_mach_o_process_stab (int what, const char *string,
   1527 			 int type, int other, int desc)
   1528 {
   1529   symbolS *symbolP;
   1530   bfd_mach_o_asymbol *s;
   1531 
   1532   switch (what)
   1533     {
   1534       case 'd':
   1535 	symbolP = symbol_new ("", now_seg, frag_now_fix (), frag_now);
   1536 	/* Special stabd NULL name indicator.  */
   1537 	S_SET_NAME (symbolP, NULL);
   1538 	break;
   1539 
   1540       case 'n':
   1541       case 's':
   1542 	symbolP = symbol_new (string, undefined_section, (valueT) 0,
   1543 			      &zero_address_frag);
   1544 	pseudo_set (symbolP);
   1545 	break;
   1546 
   1547       default:
   1548 	as_bad(_("unrecognized stab type '%c'"), (char)what);
   1549 	abort ();
   1550 	break;
   1551     }
   1552 
   1553   s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (symbolP);
   1554   s->n_type = type;
   1555   s->n_desc = desc;
   1556   /* For stabd, this will eventually get overwritten by the section number.  */
   1557   s->n_sect = other;
   1558 
   1559   /* It's a debug symbol.  */
   1560   s->symbol.flags |= BSF_DEBUGGING;
   1561 
   1562   /* We've set it - so check it, if you can, but don't try to create the
   1563      flags.  */
   1564   s->symbol.udata.i = SYM_MACHO_FIELDS_NOT_VALIDATED;
   1565 }
   1566 
   1567 /* This is a place to check for any errors that we can't detect until we know
   1568    what remains undefined at the end of assembly.  */
   1569 
   1570 static void
   1571 obj_mach_o_check_before_writing (bfd *abfd ATTRIBUTE_UNUSED,
   1572 				 asection *sec,
   1573 				 void *unused ATTRIBUTE_UNUSED)
   1574 {
   1575   fixS *fixP;
   1576   struct frchain *frchp;
   1577   segment_info_type *seginfo = seg_info (sec);
   1578 
   1579   if (seginfo == NULL)
   1580     return;
   1581 
   1582   /* We are not allowed subtractions where either of the operands is
   1583      undefined.  So look through the frags for any fixes to check.  */
   1584   for (frchp = seginfo->frchainP; frchp != NULL; frchp = frchp->frch_next)
   1585    for (fixP = frchp->fix_root; fixP != NULL; fixP = fixP->fx_next)
   1586     {
   1587       if (fixP->fx_addsy != NULL
   1588 	  && fixP->fx_subsy != NULL
   1589 	  && (! S_IS_DEFINED (fixP->fx_addsy)
   1590 	      || ! S_IS_DEFINED (fixP->fx_subsy)))
   1591 	{
   1592 	  segT add_symbol_segment = S_GET_SEGMENT (fixP->fx_addsy);
   1593 	  segT sub_symbol_segment = S_GET_SEGMENT (fixP->fx_subsy);
   1594 
   1595 	  if (! S_IS_DEFINED (fixP->fx_addsy)
   1596 	      && S_IS_DEFINED (fixP->fx_subsy))
   1597 	    {
   1598 	      as_bad_where (fixP->fx_file, fixP->fx_line,
   1599 		_("`%s' can't be undefined in `%s' - `%s' {%s section}"),
   1600 		S_GET_NAME (fixP->fx_addsy), S_GET_NAME (fixP->fx_addsy),
   1601 		S_GET_NAME (fixP->fx_subsy), segment_name (sub_symbol_segment));
   1602 	    }
   1603 	  else if (! S_IS_DEFINED (fixP->fx_subsy)
   1604 		   && S_IS_DEFINED (fixP->fx_addsy))
   1605 	    {
   1606 	      as_bad_where (fixP->fx_file, fixP->fx_line,
   1607 		_("`%s' can't be undefined in `%s' {%s section} - `%s'"),
   1608 		S_GET_NAME (fixP->fx_subsy), S_GET_NAME (fixP->fx_addsy),
   1609 		segment_name (add_symbol_segment), S_GET_NAME (fixP->fx_subsy));
   1610 	    }
   1611 	  else
   1612 	    {
   1613 	      as_bad_where (fixP->fx_file, fixP->fx_line,
   1614 		_("`%s' and `%s' can't be undefined in `%s' - `%s'"),
   1615 		S_GET_NAME (fixP->fx_addsy), S_GET_NAME (fixP->fx_subsy),
   1616 		S_GET_NAME (fixP->fx_addsy), S_GET_NAME (fixP->fx_subsy));
   1617 	    }
   1618 	}
   1619     }
   1620 }
   1621 
   1622 /* Do any checks that we can't complete without knowing what's undefined.  */
   1623 void
   1624 obj_mach_o_pre_output_hook (void)
   1625 {
   1626   bfd_map_over_sections (stdoutput, obj_mach_o_check_before_writing, (char *) 0);
   1627 }
   1628 
   1629 /* Here we count up frags in each subsection (where a sub-section is defined
   1630    as starting with a non-local symbol).
   1631    Note that, if there are no non-local symbols in a section, all the frags will
   1632    be attached as one anonymous subsection.  */
   1633 
   1634 static void
   1635 obj_mach_o_set_subsections (bfd *abfd ATTRIBUTE_UNUSED,
   1636                             asection *sec,
   1637                             void *unused ATTRIBUTE_UNUSED)
   1638 {
   1639   segment_info_type *seginfo = seg_info (sec);
   1640   symbolS *cur_subsection = NULL;
   1641   struct obj_mach_o_symbol_data *cur_subsection_data = NULL;
   1642   fragS *frag;
   1643   frchainS *chain;
   1644 
   1645   /* Protect against sections not created by gas.  */
   1646   if (seginfo == NULL)
   1647     return;
   1648 
   1649   /* Attach every frag to a subsection.  */
   1650   for (chain = seginfo->frchainP; chain != NULL; chain = chain->frch_next)
   1651     for (frag = chain->frch_root; frag != NULL; frag = frag->fr_next)
   1652       {
   1653         if (frag->obj_frag_data.subsection == NULL)
   1654           frag->obj_frag_data.subsection = cur_subsection;
   1655         else
   1656           {
   1657             cur_subsection = frag->obj_frag_data.subsection;
   1658             cur_subsection_data = symbol_get_obj (cur_subsection);
   1659             cur_subsection_data->subsection_size = 0;
   1660           }
   1661         if (cur_subsection_data != NULL)
   1662           {
   1663             /* Update subsection size.  */
   1664             cur_subsection_data->subsection_size += frag->fr_fix;
   1665           }
   1666       }
   1667 }
   1668 
   1669 /* Handle mach-o subsections-via-symbols counting up frags belonging to each
   1670    sub-section.  */
   1671 
   1672 void
   1673 obj_mach_o_pre_relax_hook (void)
   1674 {
   1675   bfd_map_over_sections (stdoutput, obj_mach_o_set_subsections, (char *) 0);
   1676 }
   1677 
   1678 /* Zerofill and GB Zerofill sections must be sorted to follow all other
   1679    sections in their segments.
   1680 
   1681    The native 'as' leaves the sections physically in the order they appear in
   1682    the source, and adjusts the section VMAs to meet the constraint.
   1683 
   1684    We follow this for now - if nothing else, it makes comparison easier.
   1685 
   1686    An alternative implementation would be to sort the sections as ld requires.
   1687    It might be advantageous to implement such a scheme in the future (or even
   1688    to make the style of section ordering user-selectable).  */
   1689 
   1690 typedef struct obj_mach_o_set_vma_data
   1691 {
   1692   bfd_vma vma;
   1693   unsigned vma_pass;
   1694   unsigned zerofill_seen;
   1695   unsigned gb_zerofill_seen;
   1696 } obj_mach_o_set_vma_data;
   1697 
   1698 /* We do (possibly) three passes through to set the vma, so that:
   1699 
   1700    zerofill sections get VMAs after all others in their segment
   1701    GB zerofill get VMAs last.
   1702 
   1703    As we go, we notice if we see any Zerofill or GB Zerofill sections, so that
   1704    we can skip the additional passes if there's nothing to do.  */
   1705 
   1706 static void
   1707 obj_mach_o_set_section_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *v_p)
   1708 {
   1709   bfd_mach_o_section *ms = bfd_mach_o_get_mach_o_section (sec);
   1710   unsigned bfd_align = bfd_get_section_alignment (abfd, sec);
   1711   obj_mach_o_set_vma_data *p = (struct obj_mach_o_set_vma_data *)v_p;
   1712   unsigned sectype = (ms->flags & BFD_MACH_O_SECTION_TYPE_MASK);
   1713   unsigned zf;
   1714 
   1715   zf = 0;
   1716   if (sectype == BFD_MACH_O_S_ZEROFILL)
   1717     {
   1718       zf = 1;
   1719       p->zerofill_seen = zf;
   1720     }
   1721   else if (sectype == BFD_MACH_O_S_GB_ZEROFILL)
   1722     {
   1723       zf = 2;
   1724       p->gb_zerofill_seen = zf;
   1725     }
   1726 
   1727   if (p->vma_pass != zf)
   1728     return;
   1729 
   1730   /* We know the section size now - so make a vma for the section just
   1731      based on order.  */
   1732   ms->size = bfd_get_section_size (sec);
   1733 
   1734   /* Make sure that the align agrees, and set to the largest value chosen.  */
   1735   ms->align = ms->align > bfd_align ? ms->align : bfd_align;
   1736   bfd_set_section_alignment (abfd, sec, ms->align);
   1737 
   1738   p->vma += (1 << ms->align) - 1;
   1739   p->vma &= ~((1 << ms->align) - 1);
   1740   ms->addr = p->vma;
   1741   bfd_set_section_vma (abfd, sec, p->vma);
   1742   p->vma += ms->size;
   1743 }
   1744 
   1745 /* (potentially) three passes over the sections, setting VMA.  We skip the
   1746   {gb}zerofill passes if we didn't see any of the relevant sections.  */
   1747 
   1748 void obj_mach_o_post_relax_hook (void)
   1749 {
   1750   obj_mach_o_set_vma_data d;
   1751 
   1752   memset (&d, 0, sizeof (d));
   1753 
   1754   bfd_map_over_sections (stdoutput, obj_mach_o_set_section_vma, (char *) &d);
   1755   if ((d.vma_pass = d.zerofill_seen) != 0)
   1756     bfd_map_over_sections (stdoutput, obj_mach_o_set_section_vma, (char *) &d);
   1757   if ((d.vma_pass = d.gb_zerofill_seen) != 0)
   1758     bfd_map_over_sections (stdoutput, obj_mach_o_set_section_vma, (char *) &d);
   1759 }
   1760 
   1761 static void
   1762 obj_mach_o_set_indirect_symbols (bfd *abfd, asection *sec,
   1763 				 void *xxx ATTRIBUTE_UNUSED)
   1764 {
   1765   bfd_vma sect_size = bfd_section_size (abfd, sec);
   1766   bfd_mach_o_section *ms = bfd_mach_o_get_mach_o_section (sec);
   1767   unsigned lazy = 0;
   1768 
   1769   /* See if we have any indirect syms to consider.  */
   1770   if (indirect_syms == NULL)
   1771     return;
   1772 
   1773   /* Process indirect symbols.
   1774      Check for errors, if OK attach them as a flat array to the section
   1775      for which they are defined.  */
   1776 
   1777   switch (ms->flags & BFD_MACH_O_SECTION_TYPE_MASK)
   1778     {
   1779       case BFD_MACH_O_S_SYMBOL_STUBS:
   1780       case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
   1781 	lazy = LAZY;
   1782 	/* Fall through.  */
   1783       case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
   1784 	{
   1785 	  unsigned int nactual = 0;
   1786 	  unsigned int ncalc;
   1787 	  obj_mach_o_indirect_sym *isym;
   1788 	  obj_mach_o_indirect_sym *list = NULL;
   1789 	  obj_mach_o_indirect_sym *list_tail = NULL;
   1790 	  unsigned long eltsiz =
   1791 			bfd_mach_o_section_get_entry_size (abfd, ms);
   1792 
   1793 	  for (isym = indirect_syms; isym != NULL; isym = isym->next)
   1794 	    {
   1795 	      if (isym->sect == sec)
   1796 		{
   1797 		  nactual++;
   1798 		  if (list == NULL)
   1799 		    list = isym;
   1800 		  else
   1801 		    list_tail->next = isym;
   1802 		  list_tail = isym;
   1803 		}
   1804 	    }
   1805 
   1806 	  /* If none are in this section, stop here.  */
   1807 	  if (nactual == 0)
   1808 	    break;
   1809 
   1810 	  /* If we somehow added indirect symbols to a section with a zero
   1811 	     entry size, we're dead ... */
   1812 	  gas_assert (eltsiz != 0);
   1813 
   1814 	  ncalc = (unsigned int) (sect_size / eltsiz);
   1815 	  if (nactual != ncalc)
   1816 	    as_bad (_("the number of .indirect_symbols defined in section %s"
   1817 		      " does not match the number expected (%d defined, %d"
   1818 		      " expected)"), sec->name, nactual, ncalc);
   1819 	  else
   1820 	    {
   1821 	      unsigned n;
   1822 	      bfd_mach_o_asymbol *sym;
   1823 	      ms->indirect_syms =
   1824 			bfd_zalloc (abfd,
   1825 				    nactual * sizeof (bfd_mach_o_asymbol *));
   1826 
   1827 	      if (ms->indirect_syms == NULL)
   1828 		{
   1829 		  as_fatal (_("internal error: failed to allocate %d indirect"
   1830 			      "symbol pointers"), nactual);
   1831 		}
   1832 
   1833 	      for (isym = list, n = 0; isym != NULL; isym = isym->next, n++)
   1834 		{
   1835 		  sym = (bfd_mach_o_asymbol *)symbol_get_bfdsym (isym->sym);
   1836 		  /* Array is init to NULL & NULL signals a local symbol
   1837 		     If the section is lazy-bound, we need to keep the
   1838 		     reference to the symbol, since dyld can override.
   1839 
   1840 		     Absolute symbols are handled specially.  */
   1841 		  if (sym->symbol.section == bfd_abs_section_ptr)
   1842 		    ms->indirect_syms[n] = sym;
   1843 		  else if (S_IS_LOCAL (isym->sym) && ! lazy)
   1844 		    ;
   1845 		  else
   1846 		    {
   1847 		      if (sym == NULL)
   1848 		        ;
   1849 		      /* If the symbols is external ...  */
   1850 		      else if (S_IS_EXTERNAL (isym->sym)
   1851 			       || (sym->n_type & BFD_MACH_O_N_EXT)
   1852 			       || ! S_IS_DEFINED (isym->sym)
   1853 			       || lazy)
   1854 			{
   1855 			  sym->n_desc &= ~LAZY;
   1856 			  /* ... it can be lazy, if not defined or hidden.  */
   1857 			  if ((sym->n_type & BFD_MACH_O_N_TYPE)
   1858 			       == BFD_MACH_O_N_UNDF
   1859 			      && ! (sym->n_type & BFD_MACH_O_N_PEXT)
   1860 			      && (sym->n_type & BFD_MACH_O_N_EXT))
   1861 			    sym->n_desc |= lazy;
   1862 			  ms->indirect_syms[n] = sym;
   1863 		        }
   1864 		    }
   1865 		}
   1866 	    }
   1867 	}
   1868 	break;
   1869 
   1870       default:
   1871 	break;
   1872     }
   1873 }
   1874 
   1875 /* The process of relocation could alter what's externally visible, thus we
   1876    leave setting the indirect symbols until last.  */
   1877 
   1878 void
   1879 obj_mach_o_frob_file_after_relocs (void)
   1880 {
   1881   bfd_map_over_sections (stdoutput, obj_mach_o_set_indirect_symbols, (char *) 0);
   1882 }
   1883 
   1884 /* Reverse relocations order to make ld happy.  */
   1885 
   1886 void
   1887 obj_mach_o_reorder_section_relocs (asection *sec, arelent **rels, unsigned int n)
   1888 {
   1889   unsigned int i;
   1890   unsigned int max = n / 2;
   1891 
   1892   for (i = 0; i < max; i++)
   1893     {
   1894       arelent *r = rels[i];
   1895       rels[i] = rels[n - i - 1];
   1896       rels[n - i - 1] = r;
   1897     }
   1898   bfd_set_reloc (stdoutput, sec, rels, n);
   1899 }
   1900 
   1901 /* Relocation rules are different in frame sections.  */
   1902 
   1903 static int
   1904 obj_mach_o_is_frame_section (segT sec)
   1905 {
   1906   int l;
   1907   l = strlen (segment_name (sec));
   1908   if ((l == 9 && strncmp (".eh_frame", segment_name (sec), 9) == 0)
   1909        || (l == 12 && strncmp (".debug_frame", segment_name (sec), 12) == 0))
   1910     return 1;
   1911   return 0;
   1912 }
   1913 
   1914 /* Unless we're in a frame section, we need to force relocs to be generated for
   1915    local subtractions.  We might eliminate them later (if they are within the
   1916    same sub-section) but we don't know that at the point that this decision is
   1917    being made.  */
   1918 
   1919 int
   1920 obj_mach_o_allow_local_subtract (expressionS * left ATTRIBUTE_UNUSED,
   1921 				 expressionS * right ATTRIBUTE_UNUSED,
   1922 				 segT seg)
   1923 {
   1924   /* Don't interfere if it's one of the GAS internal sections.  */
   1925   if (! SEG_NORMAL (seg))
   1926     return 1;
   1927 
   1928   /* Allow in frame sections, otherwise emit a reloc.  */
   1929   return obj_mach_o_is_frame_section (seg);
   1930 }
   1931 
   1932 int
   1933 obj_mach_o_in_different_subsection (symbolS *a, symbolS *b)
   1934 {
   1935   fragS *fa;
   1936   fragS *fb;
   1937 
   1938   if (S_GET_SEGMENT (a) != S_GET_SEGMENT (b)
   1939       || !S_IS_DEFINED (a)
   1940       || !S_IS_DEFINED (b))
   1941     {
   1942       /* Not in the same segment, or undefined symbol.  */
   1943       return 1;
   1944     }
   1945 
   1946   fa = symbol_get_frag (a);
   1947   fb = symbol_get_frag (b);
   1948   if (fa == NULL || fb == NULL)
   1949     {
   1950       /* One of the symbols is not in a subsection.  */
   1951       return 1;
   1952     }
   1953 
   1954   return fa->obj_frag_data.subsection != fb->obj_frag_data.subsection;
   1955 }
   1956 
   1957 int
   1958 obj_mach_o_force_reloc_sub_same (fixS *fix, segT seg)
   1959 {
   1960   if (! SEG_NORMAL (seg))
   1961     return 1;
   1962   return obj_mach_o_in_different_subsection (fix->fx_addsy, fix->fx_subsy);
   1963 }
   1964 
   1965 int
   1966 obj_mach_o_force_reloc_sub_local (fixS *fix, segT seg ATTRIBUTE_UNUSED)
   1967 {
   1968   return obj_mach_o_in_different_subsection (fix->fx_addsy, fix->fx_subsy);
   1969 }
   1970 
   1971 int
   1972 obj_mach_o_force_reloc (fixS *fix)
   1973 {
   1974   if (generic_force_reloc (fix))
   1975     return 1;
   1976 
   1977   /* Force a reloc if the target is not in the same subsection.
   1978      FIXME: handle (a - b) where a and b belongs to the same subsection ?  */
   1979   if (fix->fx_addsy != NULL)
   1980     {
   1981       symbolS *subsec = fix->fx_frag->obj_frag_data.subsection;
   1982       symbolS *targ = fix->fx_addsy;
   1983 
   1984       /* There might be no subsections at all.  */
   1985       if (subsec == NULL)
   1986         return 0;
   1987 
   1988       if (S_GET_SEGMENT (targ) == absolute_section)
   1989         return 0;
   1990 
   1991       return obj_mach_o_in_different_subsection (targ, subsec);
   1992     }
   1993   return 0;
   1994 }
   1995