x86: correct "-Q" option handling
[external/binutils.git] / gas / config / obj-macho.c
1 /* Mach-O object file format
2    Copyright (C) 2009-2019 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_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 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_get_section_flags (stdoutput, 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 (stdoutput, sec, flags))
249         as_warn (_("failed to set flags for \"%s\": %s"),
250                  bfd_section_name (stdoutput, 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_line[(unsigned char) c])
329         input_line_pointer++;
330
331       len = input_line_pointer - p;
332       /* strip trailing spaces.  */
333       while (len > 0 && 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_line[(unsigned char) c])
368                 input_line_pointer++;
369
370               len = input_line_pointer - p;
371               /* strip trailing spaces.  */
372               while (len > 0 && 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       *p = 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_AFTER_NAME ();
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 &= ((offsetT) 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 = (unsigned int) parse_align (0);
535           if (align == (unsigned int) -1)
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, (offsetT) 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 ((obj_mach_o_file_properties) 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 ((obj_mach_o_symbol_type) 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       *input_line_pointer = c;
1132       SKIP_WHITESPACE_AFTER_NAME ();
1133       c = *input_line_pointer;
1134       if (c == ',')
1135         {
1136           input_line_pointer++;
1137           SKIP_WHITESPACE ();
1138           if (is_end_of_line[(unsigned char) *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_fix (), frag_now);
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, (valueT) 0,
1533                               &zero_address_frag);
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, (char *) 0);
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, (char *) 0);
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_get_section_alignment (abfd, sec);
1701   obj_mach_o_set_vma_data *p = (struct obj_mach_o_set_vma_data *)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_get_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 (abfd, 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 (abfd, 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, (char *) &d);
1745   if ((d.vma_pass = d.zerofill_seen) != 0)
1746     bfd_map_over_sections (stdoutput, obj_mach_o_set_section_vma, (char *) &d);
1747   if ((d.vma_pass = d.gb_zerofill_seen) != 0)
1748     bfd_map_over_sections (stdoutput, obj_mach_o_set_section_vma, (char *) &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 (abfd, 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 =
1781                         bfd_mach_o_section_get_entry_size (abfd, ms);
1782
1783           for (isym = indirect_syms; isym != NULL; isym = isym->next)
1784             {
1785               if (isym->sect == sec)
1786                 {
1787                   nactual++;
1788                   if (list == NULL)
1789                     list = isym;
1790                   else
1791                     list_tail->next = isym;
1792                   list_tail = isym;
1793                 }
1794             }
1795
1796           /* If none are in this section, stop here.  */
1797           if (nactual == 0)
1798             break;
1799
1800           /* If we somehow added indirect symbols to a section with a zero
1801              entry size, we're dead ... */
1802           gas_assert (eltsiz != 0);
1803
1804           ncalc = (unsigned int) (sect_size / eltsiz);
1805           if (nactual != ncalc)
1806             as_bad (_("the number of .indirect_symbols defined in section %s"
1807                       " does not match the number expected (%d defined, %d"
1808                       " expected)"), sec->name, nactual, ncalc);
1809           else
1810             {
1811               unsigned n;
1812               bfd_mach_o_asymbol *sym;
1813
1814               /* FIXME: It seems that there can be more indirect symbols
1815                  than is computed by the loop above.  So be paranoid and
1816                  allocate enough space for every symbol to be indirect.
1817                  See PR 21939 for an example of where this is needed.  */
1818               if (nactual < bfd_get_symcount (abfd))
1819                 nactual = bfd_get_symcount (abfd);
1820
1821               ms->indirect_syms =
1822                         bfd_zalloc (abfd,
1823                                     nactual * sizeof (bfd_mach_o_asymbol *));
1824
1825               if (ms->indirect_syms == NULL)
1826                 as_fatal (_("internal error: failed to allocate %d indirect"
1827                             "symbol pointers"), nactual);
1828
1829               for (isym = list, n = 0; isym != NULL; isym = isym->next, n++)
1830                 {
1831                   sym = (bfd_mach_o_asymbol *)symbol_get_bfdsym (isym->sym);
1832                   /* Array is init to NULL & NULL signals a local symbol
1833                      If the section is lazy-bound, we need to keep the
1834                      reference to the symbol, since dyld can override.
1835
1836                      Absolute symbols are handled specially.  */
1837                   if (sym->symbol.section == bfd_abs_section_ptr)
1838                     {
1839                       if (n >= nactual)
1840                         as_fatal (_("internal error: more indirect mach-o symbols than expected"));
1841                       ms->indirect_syms[n] = sym;
1842                     }
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                           if (n >= nactual)
1863                             as_fatal (_("internal error: more indirect mach-o symbols than expected"));
1864                           ms->indirect_syms[n] = sym;
1865                         }
1866                     }
1867                 }
1868             }
1869         }
1870         break;
1871
1872       default:
1873         break;
1874     }
1875 }
1876
1877 /* The process of relocation could alter what's externally visible, thus we
1878    leave setting the indirect symbols until last.  */
1879
1880 void
1881 obj_mach_o_frob_file_after_relocs (void)
1882 {
1883   bfd_map_over_sections (stdoutput, obj_mach_o_set_indirect_symbols, (char *) 0);
1884 }
1885
1886 /* Reverse relocations order to make ld happy.  */
1887
1888 void
1889 obj_mach_o_reorder_section_relocs (asection *sec, arelent **rels, unsigned int n)
1890 {
1891   unsigned int i;
1892   unsigned int max = n / 2;
1893
1894   for (i = 0; i < max; i++)
1895     {
1896       arelent *r = rels[i];
1897       rels[i] = rels[n - i - 1];
1898       rels[n - i - 1] = r;
1899     }
1900   bfd_set_reloc (stdoutput, sec, rels, n);
1901 }
1902
1903 /* Relocation rules are different in frame sections.  */
1904
1905 static int
1906 obj_mach_o_is_frame_section (segT sec)
1907 {
1908   int l;
1909   l = strlen (segment_name (sec));
1910   if ((l == 9 && strncmp (".eh_frame", segment_name (sec), 9) == 0)
1911        || (l == 12 && strncmp (".debug_frame", segment_name (sec), 12) == 0))
1912     return 1;
1913   return 0;
1914 }
1915
1916 /* Unless we're in a frame section, we need to force relocs to be generated for
1917    local subtractions.  We might eliminate them later (if they are within the
1918    same sub-section) but we don't know that at the point that this decision is
1919    being made.  */
1920
1921 int
1922 obj_mach_o_allow_local_subtract (expressionS * left ATTRIBUTE_UNUSED,
1923                                  expressionS * right ATTRIBUTE_UNUSED,
1924                                  segT seg)
1925 {
1926   /* Don't interfere if it's one of the GAS internal sections.  */
1927   if (! SEG_NORMAL (seg))
1928     return 1;
1929
1930   /* Allow in frame sections, otherwise emit a reloc.  */
1931   return obj_mach_o_is_frame_section (seg);
1932 }
1933
1934 int
1935 obj_mach_o_in_different_subsection (symbolS *a, symbolS *b)
1936 {
1937   fragS *fa;
1938   fragS *fb;
1939
1940   if (S_GET_SEGMENT (a) != S_GET_SEGMENT (b)
1941       || !S_IS_DEFINED (a)
1942       || !S_IS_DEFINED (b))
1943     {
1944       /* Not in the same segment, or undefined symbol.  */
1945       return 1;
1946     }
1947
1948   fa = symbol_get_frag (a);
1949   fb = symbol_get_frag (b);
1950   if (fa == NULL || fb == NULL)
1951     {
1952       /* One of the symbols is not in a subsection.  */
1953       return 1;
1954     }
1955
1956   return fa->obj_frag_data.subsection != fb->obj_frag_data.subsection;
1957 }
1958
1959 int
1960 obj_mach_o_force_reloc_sub_same (fixS *fix, segT seg)
1961 {
1962   if (! SEG_NORMAL (seg))
1963     return 1;
1964   return obj_mach_o_in_different_subsection (fix->fx_addsy, fix->fx_subsy);
1965 }
1966
1967 int
1968 obj_mach_o_force_reloc_sub_local (fixS *fix, segT seg ATTRIBUTE_UNUSED)
1969 {
1970   return obj_mach_o_in_different_subsection (fix->fx_addsy, fix->fx_subsy);
1971 }
1972
1973 int
1974 obj_mach_o_force_reloc (fixS *fix)
1975 {
1976   if (generic_force_reloc (fix))
1977     return 1;
1978
1979   /* Force a reloc if the target is not in the same subsection.
1980      FIXME: handle (a - b) where a and b belongs to the same subsection ?  */
1981   if (fix->fx_addsy != NULL)
1982     {
1983       symbolS *subsec = fix->fx_frag->obj_frag_data.subsection;
1984       symbolS *targ = fix->fx_addsy;
1985
1986       /* There might be no subsections at all.  */
1987       if (subsec == NULL)
1988         return 0;
1989
1990       if (S_GET_SEGMENT (targ) == absolute_section)
1991         return 0;
1992
1993       return obj_mach_o_in_different_subsection (targ, subsec);
1994     }
1995   return 0;
1996 }