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