add symbol qualifiers for mach-o to bfd/gas
[external/binutils.git] / gas / config / obj-macho.c
1 /* Mach-O object file format
2    Copyright 2009, 2011, 2012 Free Software Foundation, Inc.
3
4    This file is part of GAS, the GNU Assembler.
5
6    GAS is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as
8    published by the Free Software Foundation; either version 3,
9    or (at your option) any later version.
10
11    GAS is distributed in the hope that it will be useful, but
12    WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
14    the GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with GAS; see the file COPYING.  If not, write to the Free
18    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19    02110-1301, USA.  */
20
21 /* Here we handle the mach-o directives that are common to all architectures.
22
23    Most significant are mach-o named sections and a variety of symbol type
24    decorations.  */
25
26 /* Mach-O supports multiple, named segments each of which may contain
27    multiple named sections.  Thus the concept of subsectioning is 
28    handled by (say) having a __TEXT segment with appropriate flags from
29    which subsections are generated like __text, __const etc.  
30    
31    The well-known as short-hand section switch directives like .text, .data
32    etc. are mapped onto predefined segment/section pairs using facilites
33    supplied by the mach-o port of bfd.
34    
35    A number of additional mach-o short-hand section switch directives are
36    also defined.  */
37
38 #define OBJ_HEADER "obj-macho.h"
39
40 #include "as.h"
41 #include "subsegs.h"
42 #include "symbols.h"
43 #include "write.h"
44 #include "mach-o.h"
45 #include "mach-o/loader.h"
46 #include "obj-macho.h"
47
48 /* Forward decls.  */
49 static segT obj_mach_o_segT_from_bfd_name (const char *, int);
50
51 /* TODO: Implement "-dynamic"/"-static" command line options.  */
52
53 static int obj_mach_o_is_static;
54
55 /* TODO: Implement the "-n" command line option to suppress the initial
56    switch to the text segment.  */
57 static int obj_mach_o_start_with_text_section = 1;
58
59 /* Allow for special re-ordering on output.  */
60
61 static int obj_mach_o_seen_objc_section;
62
63 /* Start-up: At present, just create the sections we want.  */
64 void
65 mach_o_begin (void)
66 {
67   /* Mach-O only defines the .text section by default, and even this can
68      be suppressed by a flag.  In the latter event, the first code MUST
69      be a section definition.  */
70   if (obj_mach_o_start_with_text_section)
71     {
72       text_section = obj_mach_o_segT_from_bfd_name (TEXT_SECTION_NAME, 1);
73       subseg_set (text_section, 0);
74       if (obj_mach_o_is_static)
75         {
76           bfd_mach_o_section *mo_sec 
77                         = bfd_mach_o_get_mach_o_section (text_section);
78           mo_sec->flags &= ~BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS;
79         }
80     }
81 }
82
83 /* Remember the subsections_by_symbols state in case we need to reset
84    the file flags.  */
85
86 static int obj_mach_o_subsections_by_symbols;
87
88 /* This will put at most 16 characters (terminated by a ',' or newline) from
89    the input stream into dest.  If there are more than 16 chars before the
90    delimiter, a warning is given and the string is truncated.  On completion of
91    this function, input_line_pointer will point to the char after the ',' or 
92    to the newline.  
93    
94    It trims leading and trailing space.  */
95
96 static int
97 collect_16char_name (char *dest, const char *msg, int require_comma)
98 {
99   char c, *namstart;
100
101   SKIP_WHITESPACE ();
102   namstart = input_line_pointer;
103
104   while ( (c = *input_line_pointer) != ',' 
105          && !is_end_of_line[(unsigned char) c])
106     input_line_pointer++;
107
108   {
109       int len = input_line_pointer - namstart; /* could be zero.  */
110       /* lose any trailing space.  */  
111       while (len > 0 && namstart[len-1] == ' ') 
112         len--;
113       if (len > 16)
114         {
115           *input_line_pointer = '\0'; /* make a temp string.  */
116           as_bad (_("the %s name '%s' is too long (maximum 16 characters)"),
117                      msg, namstart);
118           *input_line_pointer = c; /* restore for printing.  */
119           len = 16;
120         }
121       if (len > 0)
122         memcpy (dest, namstart, len);
123   }
124
125   if (c != ',' && require_comma)
126     {
127       as_bad (_("expected a %s name followed by a `,'"), msg);
128       return 1;
129     }
130
131   return 0;
132 }
133
134 static int
135 obj_mach_o_get_section_names (char *seg, char *sec,
136                               unsigned segl, unsigned secl)
137 {
138   /* Zero-length segment and section names are allowed.  */
139   /* Parse segment name.  */
140   memset (seg, 0, segl);
141   if (collect_16char_name (seg, "segment", 1))
142     {
143       ignore_rest_of_line ();
144       return 0;
145     }
146   input_line_pointer++; /* Skip the terminating ',' */
147
148   /* Parse section name, which can be empty.  */
149   memset (sec, 0, secl);
150   collect_16char_name (sec, "section", 0);
151   return 1;
152 }
153
154 /* Build (or get) a section from the mach-o description - which includes
155    optional definitions for type, attributes, alignment and stub size.
156    
157    BFD supplies default values for sections which have a canonical name.  */
158
159 #define SECT_TYPE_SPECIFIED 0x0001
160 #define SECT_ATTR_SPECIFIED 0x0002
161 #define SECT_ALGN_SPECIFIED 0x0004
162
163 static segT
164 obj_mach_o_make_or_get_sect (char * segname, char * sectname,
165                              unsigned int specified_mask, 
166                              unsigned int usectype, unsigned int usecattr,
167                              unsigned int ualign, offsetT stub_size)
168 {
169   unsigned int sectype, secattr, secalign;
170   flagword oldflags, flags;
171   const char *name;
172   segT sec;
173   bfd_mach_o_section *msect;
174   const mach_o_section_name_xlat *xlat;
175
176   /* This provides default bfd flags and default mach-o section type and
177      attributes along with the canonical name.  */
178   xlat = bfd_mach_o_section_data_for_mach_sect (stdoutput, segname, sectname);
179
180   /* TODO: more checking of whether overides are acually allowed.  */
181
182   if (xlat != NULL)
183     {
184       name = xstrdup (xlat->bfd_name);
185       sectype = xlat->macho_sectype;
186       if (specified_mask & SECT_TYPE_SPECIFIED)
187         {
188           if ((sectype == BFD_MACH_O_S_ZEROFILL
189                || sectype == BFD_MACH_O_S_GB_ZEROFILL)
190               && sectype != usectype)
191             as_bad (_("cannot overide zerofill section type for `%s,%s'"),
192                     segname, sectname);
193           else
194             sectype = usectype;
195         }
196       secattr = xlat->macho_secattr;
197       secalign = xlat->sectalign;
198       flags = xlat->bfd_flags;
199     }
200   else
201     {
202       /* There is no normal BFD section name for this section.  Create one.
203          The name created doesn't really matter as it will never be written
204          on disk.  */
205       size_t seglen = strlen (segname);
206       size_t sectlen = strlen (sectname);
207       char *n;
208
209       n = xmalloc (seglen + 1 + sectlen + 1);
210       memcpy (n, segname, seglen);
211       n[seglen] = '.';
212       memcpy (n + seglen + 1, sectname, sectlen);
213       n[seglen + 1 + sectlen] = 0;
214       name = n;
215       if (specified_mask & SECT_TYPE_SPECIFIED)
216         sectype = usectype;
217       else
218         sectype = BFD_MACH_O_S_REGULAR;
219       secattr = BFD_MACH_O_S_ATTR_NONE;
220       secalign = 0;
221       flags = SEC_NO_FLAGS;
222     }
223
224   /* For now, just use what the user provided.  */
225
226   if (specified_mask & SECT_ATTR_SPECIFIED)
227     secattr = usecattr;
228
229   if (specified_mask & SECT_ALGN_SPECIFIED)
230     secalign = ualign;
231
232   /* Sub-segments don't exists as is on Mach-O.  */
233   sec = subseg_new (name, 0);
234
235   oldflags = bfd_get_section_flags (stdoutput, sec);
236   msect = bfd_mach_o_get_mach_o_section (sec);
237
238   if (oldflags == SEC_NO_FLAGS)
239     {
240       /* New, so just use the defaults or what's specified.  */
241       if (! bfd_set_section_flags (stdoutput, sec, flags))
242         as_warn (_("failed to set flags for \"%s\": %s"),
243                  bfd_section_name (stdoutput, sec),
244                  bfd_errmsg (bfd_get_error ()));
245  
246       strncpy (msect->segname, segname, sizeof (msect->segname));
247       strncpy (msect->sectname, sectname, sizeof (msect->sectname));
248
249       msect->align = secalign;
250       msect->flags = sectype | secattr;
251       msect->reserved2 = stub_size;
252       
253       if (sectype == BFD_MACH_O_S_ZEROFILL
254           || sectype == BFD_MACH_O_S_GB_ZEROFILL)
255         seg_info (sec)->bss = 1;
256     }
257   else if (flags != SEC_NO_FLAGS)
258     {
259       if (flags != oldflags
260           || msect->flags != (secattr | sectype))
261         as_warn (_("Ignoring changed section attributes for %s"), name);
262     }
263
264   return sec;
265 }
266
267 /* .section
268
269    The '.section' specification syntax looks like:
270    .section <segment> , <section> [, type [, attribs [, size]]]
271
272    White space is allowed everywhere between elements.
273
274    <segment> and <section> may be from 0 to 16 chars in length - they may
275    contain spaces but leading and trailing space will be trimmed.  It is 
276    mandatory that they be present (or that zero-length names are indicated
277    by ",,").
278
279    There is only a single section type for any entry.
280
281    There may be multiple attributes, they are delimited by `+'.
282
283    Not all section types and attributes are accepted by the Darwin system
284    assemblers as user-specifiable - although, at present, we do here.  */
285
286 static void
287 obj_mach_o_section (int ignore ATTRIBUTE_UNUSED)
288 {
289   unsigned int sectype = BFD_MACH_O_S_REGULAR;
290   unsigned int specified_mask = 0;
291   unsigned int secattr = 0;
292   offsetT sizeof_stub = 0;
293   segT new_seg;
294   char segname[17];
295   char sectname[17];
296
297 #ifdef md_flush_pending_output
298   md_flush_pending_output ();
299 #endif
300
301   /* Get the User's segment annd section names.  */
302   if (! obj_mach_o_get_section_names (segname, sectname, 17, 17))
303     return;
304
305   /* Parse section type, if present.  */
306   if (*input_line_pointer == ',')
307     {
308       char *p;
309       char c;
310       char tmpc;
311       int len;
312       input_line_pointer++;
313       SKIP_WHITESPACE ();
314       p = input_line_pointer;
315       while ((c = *input_line_pointer) != ','
316               && !is_end_of_line[(unsigned char) c])
317         input_line_pointer++;
318
319       len = input_line_pointer - p;
320       /* strip trailing spaces.  */
321       while (len > 0 && p[len-1] == ' ')
322         len--;
323       tmpc = p[len];
324
325       /* Temporarily make a string from the token.  */
326       p[len] = 0;
327       sectype = bfd_mach_o_get_section_type_from_name (stdoutput, p);
328       if (sectype > 255) /* Max Section ID == 255.  */
329         {
330           as_bad (_("unknown or invalid section type '%s'"), p);
331           p[len] = tmpc;
332           ignore_rest_of_line ();
333           return;
334         }
335       else
336         specified_mask |= SECT_TYPE_SPECIFIED;
337       /* Restore.  */
338       p[len] = tmpc;
339
340       /* Parse attributes.
341          TODO: check validity of attributes for section type.  */
342       if ((specified_mask & SECT_TYPE_SPECIFIED)
343           && c == ',')
344         {
345           do
346             {
347               int attr;
348
349               /* Skip initial `,' and subsequent `+'.  */
350               input_line_pointer++;
351               SKIP_WHITESPACE ();
352               p = input_line_pointer;
353               while ((c = *input_line_pointer) != '+'
354                       && c != ','
355                       && !is_end_of_line[(unsigned char) c])
356                 input_line_pointer++;
357
358               len = input_line_pointer - p;
359               /* strip trailing spaces.  */
360               while (len > 0 && p[len-1] == ' ')
361                 len--;
362               tmpc = p[len];
363
364               /* Temporarily make a string from the token.  */
365               p[len] ='\0';
366               attr = bfd_mach_o_get_section_attribute_from_name (p);
367               if (attr == -1)
368                 {
369                   as_bad (_("unknown or invalid section attribute '%s'"), p);
370                   p[len] = tmpc;
371                   ignore_rest_of_line ();
372                   return;
373                 }
374               else
375                 {
376                   specified_mask |= SECT_ATTR_SPECIFIED;
377                   secattr |= attr;
378                 }
379               /* Restore.  */
380               p[len] = tmpc;
381             }
382           while (*input_line_pointer == '+');
383
384           /* Parse sizeof_stub.  */
385           if ((specified_mask & SECT_ATTR_SPECIFIED) 
386               && *input_line_pointer == ',')
387             {
388               if (sectype != BFD_MACH_O_S_SYMBOL_STUBS)
389                 {
390                   as_bad (_("unexpected section size information"));
391                   ignore_rest_of_line ();
392                   return;
393                 }
394
395               input_line_pointer++;
396               sizeof_stub = get_absolute_expression ();
397             }
398           else if ((specified_mask & SECT_ATTR_SPECIFIED) 
399                    && sectype == BFD_MACH_O_S_SYMBOL_STUBS)
400             {
401               as_bad (_("missing sizeof_stub expression"));
402               ignore_rest_of_line ();
403               return;
404             }
405         }
406     }
407
408   new_seg = obj_mach_o_make_or_get_sect (segname, sectname, specified_mask, 
409                                          sectype, secattr, 0 /*align */,
410                                          sizeof_stub);
411   if (new_seg != NULL)
412     {
413       subseg_set (new_seg, 0);
414       demand_empty_rest_of_line ();
415     }
416 }
417
418 /* .zerofill segname, sectname [, symbolname, size [, align]]
419
420    Zerofill switches, temporarily, to a sect of type 'zerofill'.
421
422    If a variable name is given, it defines that in the section.
423    Otherwise it just creates the section if it doesn't exist.  */
424
425 static void
426 obj_mach_o_zerofill (int ignore ATTRIBUTE_UNUSED)
427 {
428   char segname[17];
429   char sectname[17];
430   segT old_seg = now_seg;
431   segT new_seg;
432   symbolS *sym = NULL;
433   unsigned int align = 0;
434   unsigned int specified_mask = 0;
435   offsetT size;
436
437 #ifdef md_flush_pending_output
438   md_flush_pending_output ();
439 #endif
440
441   /* Get the User's segment annd section names.  */
442   if (! obj_mach_o_get_section_names (segname, sectname, 17, 17))
443     return;
444
445   /* Parse variable definition, if present.  */
446   if (*input_line_pointer == ',')
447     {
448       /* Parse symbol, size [.align] 
449          We follow the method of s_common_internal, with the difference
450          that the symbol cannot be a duplicate-common.  */
451       char *name;
452       char c;
453       char *p;
454       expressionS exp;
455   
456       input_line_pointer++; /* Skip ',' */
457       SKIP_WHITESPACE ();
458       name = input_line_pointer;
459       c = get_symbol_end ();
460       /* Just after name is now '\0'.  */
461       p = input_line_pointer;
462       *p = c;
463
464       if (name == p)
465         {
466           as_bad (_("expected symbol name"));
467           ignore_rest_of_line ();
468           goto done;
469         }
470
471       SKIP_WHITESPACE ();  
472       if (*input_line_pointer == ',')
473         input_line_pointer++;
474
475       expression_and_evaluate (&exp);
476       if (exp.X_op != O_constant
477           && exp.X_op != O_absent)
478         {
479             as_bad (_("bad or irreducible absolute expression"));
480           ignore_rest_of_line ();
481           goto done;
482         }
483       else if (exp.X_op == O_absent)
484         {
485           as_bad (_("missing size expression"));
486           ignore_rest_of_line ();
487           goto done;
488         }
489
490       size = exp.X_add_number;
491       size &= ((offsetT) 2 << (stdoutput->arch_info->bits_per_address - 1)) - 1;
492       if (exp.X_add_number != size || !exp.X_unsigned)
493         {
494           as_warn (_("size (%ld) out of range, ignored"),
495                    (long) exp.X_add_number);
496           ignore_rest_of_line ();
497           goto done;
498         }
499
500      *p = 0; /* Make the name into a c string for err messages.  */
501      sym = symbol_find_or_make (name);
502      if (S_IS_DEFINED (sym) || symbol_equated_p (sym))
503         {
504           as_bad (_("symbol `%s' is already defined"), name);
505           *p = c;
506           ignore_rest_of_line ();
507            goto done;
508         }
509
510       size = S_GET_VALUE (sym);
511       if (size == 0)
512         size = exp.X_add_number;
513       else if (size != exp.X_add_number)
514         as_warn (_("size of \"%s\" is already %ld; not changing to %ld"),
515                    name, (long) size, (long) exp.X_add_number);
516
517       *p = c;  /* Restore the termination char.  */
518       
519       SKIP_WHITESPACE ();  
520       if (*input_line_pointer == ',')
521         {
522           align = (unsigned int) parse_align (0);
523           if (align == (unsigned int) -1)
524             {
525               as_warn (_("align value not recognized, using size"));
526               align = size;
527             }
528           if (align > 15)
529             {
530               as_warn (_("Alignment (%lu) too large: 15 assumed."),
531                         (unsigned long)align);
532               align = 15;
533             }
534           specified_mask |= SECT_ALGN_SPECIFIED;
535         }
536     }
537  /* else just a section definition.  */
538
539   specified_mask |= SECT_TYPE_SPECIFIED;
540   new_seg = obj_mach_o_make_or_get_sect (segname, sectname, specified_mask, 
541                                          BFD_MACH_O_S_ZEROFILL,
542                                          BFD_MACH_O_S_ATTR_NONE,
543                                          align, (offsetT) 0 /*stub size*/);
544   if (new_seg == NULL)
545     return;
546
547   /* In case the user specifies the bss section by mach-o name.
548      Create it on demand */
549   if (strcmp (new_seg->name, BSS_SECTION_NAME) == 0
550       && bss_section == NULL)
551     bss_section = new_seg;
552
553   subseg_set (new_seg, 0);
554
555   if (sym != NULL)
556     {
557       char *pfrag;
558
559       if (align)
560         {
561           record_alignment (new_seg, align);
562           frag_align (align, 0, 0);
563         }
564
565       /* Detach from old frag.  */
566       if (S_GET_SEGMENT (sym) == new_seg)
567         symbol_get_frag (sym)->fr_symbol = NULL;
568
569       symbol_set_frag (sym, frag_now);
570       pfrag = frag_var (rs_org, 1, 1, 0, sym, size, NULL);
571       *pfrag = 0;
572
573       S_SET_SEGMENT (sym, new_seg);
574       if (new_seg == bss_section)
575         S_CLEAR_EXTERNAL (sym);
576     }
577
578 done:
579   /* switch back to the section that was current before the .zerofill.  */
580   subseg_set (old_seg, 0);
581 }
582
583 static segT 
584 obj_mach_o_segT_from_bfd_name (const char *nam, int must_succeed)
585 {
586   const mach_o_section_name_xlat *xlat;
587   const char *segn;
588   segT sec;
589
590   /* BFD has tables of flags and default attributes for all the sections that
591      have a 'canonical' name.  */
592   xlat = bfd_mach_o_section_data_for_bfd_name (stdoutput, nam, &segn);
593   if (xlat == NULL)
594     {
595       if (must_succeed)
596         as_fatal (_("BFD is out of sync with GAS, "
597                      "unhandled well-known section type `%s'"), nam);
598       return NULL;
599     }
600
601   sec = bfd_get_section_by_name (stdoutput, nam);
602   if (sec == NULL)
603     {
604       bfd_mach_o_section *msect;
605
606       sec = subseg_force_new (xlat->bfd_name, 0);
607
608       /* Set default type, attributes and alignment.  */
609       msect = bfd_mach_o_get_mach_o_section (sec);
610       msect->flags = xlat->macho_sectype | xlat->macho_secattr;
611       msect->align = xlat->sectalign;
612
613       if ((msect->flags & BFD_MACH_O_SECTION_TYPE_MASK) 
614           == BFD_MACH_O_S_ZEROFILL)
615         seg_info (sec)->bss = 1;
616     }
617
618   return sec;
619 }
620
621 static const char * const known_sections[] =
622 {
623   /*  0 */ NULL,
624   /* __TEXT */
625   /*  1 */ ".const",
626   /*  2 */ ".static_const",
627   /*  3 */ ".cstring",
628   /*  4 */ ".literal4",
629   /*  5 */ ".literal8",
630   /*  6 */ ".literal16",
631   /*  7 */ ".constructor",
632   /*  8 */ ".destructor",
633   /*  9 */ ".eh_frame",
634   /* __DATA */
635   /* 10 */ ".const_data",
636   /* 11 */ ".static_data",
637   /* 12 */ ".mod_init_func",
638   /* 13 */ ".mod_term_func",
639   /* 14 */ ".dyld",
640   /* 15 */ ".cfstring"
641 };
642
643 /* Interface for a known non-optional section directive.  */
644
645 static void
646 obj_mach_o_known_section (int sect_index)
647 {
648   segT section;
649
650 #ifdef md_flush_pending_output
651   md_flush_pending_output ();
652 #endif
653
654   section = obj_mach_o_segT_from_bfd_name (known_sections[sect_index], 1);
655   if (section != NULL)
656     subseg_set (section, 0);
657
658   /* else, we leave the section as it was; there was a fatal error anyway.  */
659 }
660
661 static const char * const objc_sections[] =
662 {
663   /*  0 */ NULL,
664   /*  1 */ ".objc_class",
665   /*  2 */ ".objc_meta_class",
666   /*  3 */ ".objc_cat_cls_meth",
667   /*  4 */ ".objc_cat_inst_meth",
668   /*  5 */ ".objc_protocol",
669   /*  6 */ ".objc_string_object",
670   /*  7 */ ".objc_cls_meth",
671   /*  8 */ ".objc_inst_meth",
672   /*  9 */ ".objc_cls_refs",
673   /* 10 */ ".objc_message_refs",
674   /* 11 */ ".objc_symbols",
675   /* 12 */ ".objc_category",
676   /* 13 */ ".objc_class_vars",
677   /* 14 */ ".objc_instance_vars",
678   /* 15 */ ".objc_module_info",
679   /* 16 */ ".cstring", /* objc_class_names Alias for .cstring */
680   /* 17 */ ".cstring", /* Alias objc_meth_var_types for .cstring */
681   /* 18 */ ".cstring", /* objc_meth_var_names Alias for .cstring */
682   /* 19 */ ".objc_selector_strs",
683   /* 20 */ ".objc_image_info", /* extension.  */
684   /* 21 */ ".objc_selector_fixup", /* extension.  */
685   /* 22 */ ".objc1_class_ext", /* ObjC-1 extension.  */
686   /* 23 */ ".objc1_property_list", /* ObjC-1 extension.  */
687   /* 24 */ ".objc1_protocol_ext" /* ObjC-1 extension.  */
688 };
689
690 /* This currently does the same as known_sections, but kept separate for
691    ease of maintenance.  */
692
693 static void
694 obj_mach_o_objc_section (int sect_index)
695 {
696   segT section;
697   
698 #ifdef md_flush_pending_output
699   md_flush_pending_output ();
700 #endif
701
702   section = obj_mach_o_segT_from_bfd_name (objc_sections[sect_index], 1);
703   if (section != NULL)
704     {
705       obj_mach_o_seen_objc_section = 1; /* We need to ensure that certain
706                                            sections are present and in the
707                                            right order.  */
708       subseg_set (section, 0);
709     }
710
711   /* else, we leave the section as it was; there was a fatal error anyway.  */
712 }
713
714 /* Debug section directives.  */
715
716 static const char * const debug_sections[] =
717 {
718   /*  0 */ NULL,
719   /* __DWARF */
720   /*  1 */ ".debug_frame",
721   /*  2 */ ".debug_info",
722   /*  3 */ ".debug_abbrev",
723   /*  4 */ ".debug_aranges",
724   /*  5 */ ".debug_macinfo",
725   /*  6 */ ".debug_line",
726   /*  7 */ ".debug_loc",
727   /*  8 */ ".debug_pubnames",
728   /*  9 */ ".debug_pubtypes",
729   /* 10 */ ".debug_str",
730   /* 11 */ ".debug_ranges",
731   /* 12 */ ".debug_macro"
732 };
733
734 /* ??? Maybe these should be conditional on gdwarf-*.
735    It`s also likely that we will need to be able to set them from the cfi
736    code.  */
737
738 static void
739 obj_mach_o_debug_section (int sect_index)
740 {
741   segT section;
742
743 #ifdef md_flush_pending_output
744   md_flush_pending_output ();
745 #endif
746
747   section = obj_mach_o_segT_from_bfd_name (debug_sections[sect_index], 1);
748   if (section != NULL)
749     subseg_set (section, 0);
750
751   /* else, we leave the section as it was; there was a fatal error anyway.  */
752 }
753
754 /* This could be moved to the tc-xx files, but there is so little dependency
755    there, that the code might as well be shared.  */
756
757 struct opt_tgt_sect 
758 {
759  const char *name;
760  unsigned x86_val;
761  unsigned ppc_val;
762 };
763
764 /* The extensions here are for specific sections that are generated by GCC
765    and Darwin system tools, but don't have directives in the `system as'.  */
766
767 static const struct opt_tgt_sect tgt_sections[] =
768 {
769   /*  0 */ { NULL, 0, 0},
770   /*  1 */ { ".lazy_symbol_pointer", 0, 0},
771   /*  2 */ { ".lazy_symbol_pointer2", 0, 0}, /* X86 - extension */
772   /*  3 */ { ".lazy_symbol_pointer3", 0, 0}, /* X86 - extension */
773   /*  4 */ { ".non_lazy_symbol_pointer", 0, 0},
774   /*  5 */ { ".non_lazy_symbol_pointer_x86", 0, 0}, /* X86 - extension */
775   /*  6 */ { ".symbol_stub", 16, 20},
776   /*  7 */ { ".symbol_stub1", 0, 16}, /* PPC - extension */
777   /*  8 */ { ".picsymbol_stub", 26, 36},
778   /*  9 */ { ".picsymbol_stub1", 0, 32}, /* PPC - extension */
779   /* 10 */ { ".picsymbol_stub2", 25, 0}, /* X86 - extension */
780   /* 11 */ { ".picsymbol_stub3", 5, 0}, /* X86 - extension  */
781 };
782
783 /* Interface for an optional section directive.  */
784
785 static void
786 obj_mach_o_opt_tgt_section (int sect_index)
787 {
788   const struct opt_tgt_sect *tgtsct = &tgt_sections[sect_index];
789   segT section;
790
791 #ifdef md_flush_pending_output
792   md_flush_pending_output ();
793 #endif
794
795   section = obj_mach_o_segT_from_bfd_name (tgtsct->name, 0);
796   if (section == NULL)
797     {
798       as_bad (_("%s is not used for the selected target"), tgtsct->name);
799       /* Leave the section as it is.  */
800     }
801   else
802     {
803       bfd_mach_o_section *mo_sec = bfd_mach_o_get_mach_o_section (section);
804       subseg_set (section, 0);
805 #if defined (TC_I386)
806       mo_sec->reserved2 = tgtsct->x86_val;
807 #elif defined (TC_PPC)
808       mo_sec->reserved2 = tgtsct->ppc_val;
809 #else
810       mo_sec->reserved2 = 0;
811 #endif
812     }
813 }
814
815 /* We don't necessarily have the three 'base' sections on mach-o.
816    Normally, we would start up with only the 'text' section defined.
817    However, even that can be suppressed with (TODO) c/l option "-n".
818    Thus, we have to be able to create all three sections on-demand.  */
819
820 static void
821 obj_mach_o_base_section (int sect_index)
822 {
823   segT section;
824
825 #ifdef md_flush_pending_output
826   md_flush_pending_output ();
827 #endif
828
829   /* We don't support numeric (or any other) qualifications on the
830      well-known section shorthands.  */
831   demand_empty_rest_of_line ();
832
833   switch (sect_index)
834     {
835       /* Handle the three sections that are globally known within GAS.
836          For Mach-O, these are created on demand rather than at startup.  */
837       case 1:
838         if (text_section == NULL)
839           text_section = obj_mach_o_segT_from_bfd_name (TEXT_SECTION_NAME, 1);
840         if (obj_mach_o_is_static)
841           {
842             bfd_mach_o_section *mo_sec
843                 = bfd_mach_o_get_mach_o_section (text_section);
844             mo_sec->flags &= ~BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS;
845           }
846         section = text_section;
847         break;
848       case 2:
849         if (data_section == NULL)
850           data_section = obj_mach_o_segT_from_bfd_name (DATA_SECTION_NAME, 1);
851         section = data_section;
852         break;
853       case 3:
854         /* ??? maybe this achieves very little, as an addition.  */
855         if (bss_section == NULL)
856           {
857             bss_section = obj_mach_o_segT_from_bfd_name (BSS_SECTION_NAME, 1);
858             seg_info (bss_section)->bss = 1;
859           }
860         section = bss_section;
861         break;
862       default:
863         as_fatal (_("internal error: base section index out of range"));
864         return;
865         break;
866     }
867   subseg_set (section, 0);
868 }
869
870 /* This finishes off parsing a .comm or .lcomm statement, which both can have
871    an (optional) alignment field.  It also allows us to create the bss section
872    on demand.  */
873
874 static symbolS *
875 obj_mach_o_common_parse (int is_local, symbolS *symbolP,
876                          addressT size)
877 {
878   addressT align = 0;
879   bfd_mach_o_asymbol *s;
880
881   SKIP_WHITESPACE ();  
882
883   /* Both comm and lcomm take an optional alignment, as a power
884      of two between 1 and 15.  */
885   if (*input_line_pointer == ',')
886     {
887       /* We expect a power of 2.  */
888       align = parse_align (0);
889       if (align == (addressT) -1)
890         return NULL;
891       if (align > 15)
892         {
893           as_warn (_("Alignment (%lu) too large: 15 assumed."),
894                   (unsigned long)align);
895           align = 15;
896         }
897     }
898
899   s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (symbolP);
900   if (is_local)
901     {
902       /* Create the BSS section on demand.  */
903       if (bss_section == NULL)
904         {
905           bss_section = obj_mach_o_segT_from_bfd_name (BSS_SECTION_NAME, 1);
906           seg_info (bss_section)->bss = 1;        
907         }
908       bss_alloc (symbolP, size, align);
909       s->n_type = BFD_MACH_O_N_SECT;
910       S_CLEAR_EXTERNAL (symbolP);
911     }
912   else
913     {
914       S_SET_VALUE (symbolP, size);
915       S_SET_ALIGN (symbolP, align);
916       S_SET_EXTERNAL (symbolP);
917       S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
918       s->n_type = BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT;
919     }
920
921   /* This is a data object (whatever we choose that to mean).  */
922   s->symbol.flags |= BSF_OBJECT;
923
924   /* We've set symbol qualifiers, so validate if you can.  */
925   s->symbol.udata.i = SYM_MACHO_FIELDS_NOT_VALIDATED;
926
927   return symbolP;
928 }
929
930 static void
931 obj_mach_o_comm (int is_local)
932 {
933   s_comm_internal (is_local, obj_mach_o_common_parse);
934 }
935
936 /* Set properties that apply to the whole file.  At present, the only
937    one defined, is subsections_via_symbols.  */
938
939 typedef enum obj_mach_o_file_properties {
940   OBJ_MACH_O_FILE_PROP_NONE = 0,
941   OBJ_MACH_O_FILE_PROP_SUBSECTS_VIA_SYMS,
942   OBJ_MACH_O_FILE_PROP_MAX
943 } obj_mach_o_file_properties;
944
945 static void 
946 obj_mach_o_fileprop (int prop)
947 {
948   if (prop < 0 || prop >= OBJ_MACH_O_FILE_PROP_MAX)
949     as_fatal (_("internal error: bad file property ID %d"), prop);
950     
951   switch ((obj_mach_o_file_properties) prop)
952     {
953       case OBJ_MACH_O_FILE_PROP_SUBSECTS_VIA_SYMS:
954         obj_mach_o_subsections_by_symbols = 1;
955         if (!bfd_set_private_flags (stdoutput, 
956                                     BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS))
957           as_bad (_("failed to set subsections by symbols"));
958         demand_empty_rest_of_line ();
959         break;
960       default:
961         break;
962     }
963 }
964
965 /* Temporary markers for symbol reference data.  
966    Lazy will remain in place.  */
967 #define LAZY 0x01
968 #define REFE 0x02
969
970 /* We have a bunch of qualifiers that may be applied to symbols.
971    .globl is handled here so that we might make sure that conflicting qualifiers
972    are caught where possible.  */
973
974 typedef enum obj_mach_o_symbol_type {
975   OBJ_MACH_O_SYM_UNK = 0,
976   OBJ_MACH_O_SYM_LOCAL = 1,
977   OBJ_MACH_O_SYM_GLOBL = 2,
978   OBJ_MACH_O_SYM_REFERENCE = 3,
979   OBJ_MACH_O_SYM_WEAK_REF = 4,
980   OBJ_MACH_O_SYM_LAZY_REF = 5,
981   OBJ_MACH_O_SYM_WEAK_DEF = 6,
982   OBJ_MACH_O_SYM_PRIV_EXT = 7,
983   OBJ_MACH_O_SYM_NO_DEAD_STRIP = 8,
984   OBJ_MACH_O_SYM_WEAK = 9
985 } obj_mach_o_symbol_type;
986
987 /* Set Mach-O-specific symbol qualifiers. */
988
989 static int
990 obj_mach_o_set_symbol_qualifier (symbolS *sym, int type)
991 {
992   int is_defined;
993   bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (sym);
994   bfd_mach_o_section *sec;
995   int sectype = -1;
996   int err = 0;
997
998   /* If the symbol is defined, then we can do more rigorous checking on
999      the validity of the qualifiers.  Otherwise, we are stuck with waiting 
1000      until it's defined - or until write the file.
1001      
1002      In certain cases (e.g. when a symbol qualifier is intended to introduce
1003      an undefined symbol in a stubs section) we should check that the current
1004      section is appropriate to the qualifier.  */
1005
1006   is_defined = s->symbol.section != bfd_und_section_ptr;
1007   if (is_defined)
1008     sec = bfd_mach_o_get_mach_o_section (s->symbol.section) ;
1009   else
1010     sec = bfd_mach_o_get_mach_o_section (now_seg) ;
1011
1012   if (sec != NULL)
1013     sectype = sec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
1014
1015   switch ((obj_mach_o_symbol_type) type)
1016     {
1017       case OBJ_MACH_O_SYM_LOCAL:
1018         /* This is an extension over the system tools.  */
1019         if (s->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT))
1020           {
1021             as_bad (_("'%s' previously declared as '%s'."), s->symbol.name,
1022                       (s->n_type & BFD_MACH_O_N_PEXT) ? "private extern"
1023                                                       : "global" );
1024             err = 1;
1025           }
1026         else
1027           {
1028             s->n_type &= ~BFD_MACH_O_N_EXT;
1029             S_CLEAR_EXTERNAL (sym);
1030           }
1031         break;
1032
1033       case OBJ_MACH_O_SYM_PRIV_EXT:
1034         s->n_type |= BFD_MACH_O_N_PEXT ;
1035         /* We follow the system tools in marking PEXT as also global.  */
1036         /* Fall through.  */
1037
1038       case OBJ_MACH_O_SYM_GLOBL:
1039         /* It's not an error to define a symbol and then make it global.  */
1040         s->n_type |= BFD_MACH_O_N_EXT;
1041         S_SET_EXTERNAL (sym);
1042         break;
1043
1044       case OBJ_MACH_O_SYM_REFERENCE:
1045         if (is_defined)
1046           s->n_desc |= BFD_MACH_O_N_NO_DEAD_STRIP;
1047         else
1048           s->n_desc |= (REFE | BFD_MACH_O_N_NO_DEAD_STRIP);
1049         break;
1050
1051       case OBJ_MACH_O_SYM_LAZY_REF:
1052         if (is_defined)
1053           s->n_desc |= BFD_MACH_O_N_NO_DEAD_STRIP;
1054         else
1055           s->n_desc |= (REFE | LAZY | BFD_MACH_O_N_NO_DEAD_STRIP);
1056         break;
1057
1058       /* Force ld to retain the symbol - even if it appears unused.  */
1059       case OBJ_MACH_O_SYM_NO_DEAD_STRIP:
1060         s->n_desc |= BFD_MACH_O_N_NO_DEAD_STRIP ;
1061         break;
1062
1063       /* Mach-O's idea of weak ...  */
1064       case OBJ_MACH_O_SYM_WEAK_REF:
1065         s->n_desc |= BFD_MACH_O_N_WEAK_REF ;
1066         break;
1067
1068       case OBJ_MACH_O_SYM_WEAK_DEF:
1069         if (is_defined && sectype != BFD_MACH_O_S_COALESCED)
1070           {
1071             as_bad (_("'%s' can't be a weak_definition (currently only"
1072                       " supported in sections of type coalesced)"),
1073                       s->symbol.name);
1074             err = 1;
1075           }
1076         else
1077           s->n_desc |= BFD_MACH_O_N_WEAK_DEF;
1078         break;
1079
1080       case OBJ_MACH_O_SYM_WEAK:
1081         /* A generic 'weak' - we try to figure out what it means at
1082            symbol frob time.  */
1083         S_SET_WEAK (sym);
1084         break;
1085
1086       default:
1087         break;
1088     }
1089
1090     /* We've seen some kind of qualifier - check validity if or when the entity
1091      is defined.  */
1092   s->symbol.udata.i = SYM_MACHO_FIELDS_NOT_VALIDATED;
1093   return err;
1094 }
1095
1096 /* Respond to symbol qualifiers.
1097    All of the form:
1098    .<qualifier> symbol [, symbol]*
1099    a list of symbols is an extension over the Darwin system as.  */
1100
1101 static void
1102 obj_mach_o_sym_qual (int ntype)
1103 {
1104   char *name;
1105   char c;
1106   symbolS *symbolP;
1107
1108 #ifdef md_flush_pending_output
1109   md_flush_pending_output ();
1110 #endif
1111
1112   do
1113     {
1114       name = input_line_pointer;
1115       c = get_symbol_end ();
1116       symbolP = symbol_find_or_make (name);
1117       obj_mach_o_set_symbol_qualifier (symbolP, ntype);
1118       *input_line_pointer = c;
1119       SKIP_WHITESPACE ();
1120       c = *input_line_pointer;
1121       if (c == ',')
1122         {
1123           input_line_pointer++;
1124           SKIP_WHITESPACE ();
1125           if (is_end_of_line[(unsigned char) *input_line_pointer])
1126             c = '\n';
1127         }
1128     }
1129   while (c == ',');
1130
1131   demand_empty_rest_of_line ();
1132 }
1133
1134 /* Dummy function to allow test-code to work while we are working
1135    on things.  */
1136
1137 static void
1138 obj_mach_o_placeholder (int arg ATTRIBUTE_UNUSED)
1139 {
1140   ignore_rest_of_line ();
1141 }
1142
1143 const pseudo_typeS mach_o_pseudo_table[] =
1144 {
1145   /* Section directives.  */
1146   { "comm", obj_mach_o_comm, 0 },
1147   { "lcomm", obj_mach_o_comm, 1 },
1148
1149   { "text", obj_mach_o_base_section, 1},
1150   { "data", obj_mach_o_base_section, 2},
1151   { "bss", obj_mach_o_base_section, 3},   /* extension */
1152
1153   { "const", obj_mach_o_known_section, 1},
1154   { "static_const", obj_mach_o_known_section, 2},
1155   { "cstring", obj_mach_o_known_section, 3},
1156   { "literal4", obj_mach_o_known_section, 4},
1157   { "literal8", obj_mach_o_known_section, 5},
1158   { "literal16", obj_mach_o_known_section, 6},
1159   { "constructor", obj_mach_o_known_section, 7},
1160   { "destructor", obj_mach_o_known_section, 8},
1161   { "eh_frame", obj_mach_o_known_section, 9},
1162
1163   { "const_data", obj_mach_o_known_section, 10},
1164   { "static_data", obj_mach_o_known_section, 11},
1165   { "mod_init_func", obj_mach_o_known_section, 12},
1166   { "mod_term_func", obj_mach_o_known_section, 13},
1167   { "dyld", obj_mach_o_known_section, 14},
1168   { "cfstring", obj_mach_o_known_section, 15},
1169
1170   { "objc_class", obj_mach_o_objc_section, 1},
1171   { "objc_meta_class", obj_mach_o_objc_section, 2},
1172   { "objc_cat_cls_meth", obj_mach_o_objc_section, 3},
1173   { "objc_cat_inst_meth", obj_mach_o_objc_section, 4},
1174   { "objc_protocol", obj_mach_o_objc_section, 5},
1175   { "objc_string_object", obj_mach_o_objc_section, 6},
1176   { "objc_cls_meth", obj_mach_o_objc_section, 7},
1177   { "objc_inst_meth", obj_mach_o_objc_section, 8},
1178   { "objc_cls_refs", obj_mach_o_objc_section, 9},
1179   { "objc_message_refs", obj_mach_o_objc_section, 10},
1180   { "objc_symbols", obj_mach_o_objc_section, 11},
1181   { "objc_category", obj_mach_o_objc_section, 12},
1182   { "objc_class_vars", obj_mach_o_objc_section, 13},
1183   { "objc_instance_vars", obj_mach_o_objc_section, 14},
1184   { "objc_module_info", obj_mach_o_objc_section, 15},
1185   { "objc_class_names", obj_mach_o_objc_section, 16}, /* Alias for .cstring */
1186   { "objc_meth_var_types", obj_mach_o_objc_section, 17}, /* Alias for .cstring */
1187   { "objc_meth_var_names", obj_mach_o_objc_section, 18}, /* Alias for .cstring */
1188   { "objc_selector_strs", obj_mach_o_objc_section, 19},
1189   { "objc_image_info", obj_mach_o_objc_section, 20}, /* extension.  */
1190   { "objc_selector_fixup", obj_mach_o_objc_section, 21}, /* extension.  */
1191   { "objc1_class_ext", obj_mach_o_objc_section, 22}, /* ObjC-1 extension.  */
1192   { "objc1_property_list", obj_mach_o_objc_section, 23}, /* ObjC-1 extension.  */
1193   { "objc1_protocol_ext", obj_mach_o_objc_section, 24}, /* ObjC-1 extension.  */
1194
1195   { "debug_frame", obj_mach_o_debug_section, 1}, /* extension.  */
1196   { "debug_info", obj_mach_o_debug_section, 2}, /* extension.  */
1197   { "debug_abbrev", obj_mach_o_debug_section, 3}, /* extension.  */
1198   { "debug_aranges", obj_mach_o_debug_section, 4}, /* extension.  */
1199   { "debug_macinfo", obj_mach_o_debug_section, 5}, /* extension.  */
1200   { "debug_line", obj_mach_o_debug_section, 6}, /* extension.  */
1201   { "debug_loc", obj_mach_o_debug_section, 7}, /* extension.  */
1202   { "debug_pubnames", obj_mach_o_debug_section, 8}, /* extension.  */
1203   { "debug_pubtypes", obj_mach_o_debug_section, 9}, /* extension.  */
1204   { "debug_str", obj_mach_o_debug_section, 10}, /* extension.  */
1205   { "debug_ranges", obj_mach_o_debug_section, 11}, /* extension.  */
1206   { "debug_macro", obj_mach_o_debug_section, 12}, /* extension.  */
1207   
1208   { "lazy_symbol_pointer", obj_mach_o_opt_tgt_section, 1},
1209   { "lazy_symbol_pointer2", obj_mach_o_opt_tgt_section, 2}, /* extension.  */
1210   { "lazy_symbol_pointer3", obj_mach_o_opt_tgt_section, 3}, /* extension.  */
1211   { "non_lazy_symbol_pointer", obj_mach_o_opt_tgt_section, 4},
1212   { "non_lazy_symbol_pointer_x86", obj_mach_o_opt_tgt_section, 5}, /* extension.  */
1213   { "symbol_stub", obj_mach_o_opt_tgt_section, 6},
1214   { "symbol_stub1", obj_mach_o_opt_tgt_section, 7}, /* extension.  */
1215   { "picsymbol_stub", obj_mach_o_opt_tgt_section, 8}, /* extension.  */
1216   { "picsymbol_stub1", obj_mach_o_opt_tgt_section, 9}, /* extension.  */
1217   { "picsymbol_stub2", obj_mach_o_opt_tgt_section, 4}, /* extension.  */
1218   { "picsymbol_stub3", obj_mach_o_opt_tgt_section, 4}, /* extension.  */
1219
1220   { "section", obj_mach_o_section, 0},
1221   { "zerofill", obj_mach_o_zerofill, 0},
1222
1223   /* Symbol qualifiers.  */
1224   {"local",             obj_mach_o_sym_qual, OBJ_MACH_O_SYM_LOCAL},
1225   {"globl",             obj_mach_o_sym_qual, OBJ_MACH_O_SYM_GLOBL},
1226   {"reference",         obj_mach_o_sym_qual, OBJ_MACH_O_SYM_REFERENCE},
1227   {"weak_reference",    obj_mach_o_sym_qual, OBJ_MACH_O_SYM_WEAK_REF},
1228   {"lazy_reference",    obj_mach_o_sym_qual, OBJ_MACH_O_SYM_LAZY_REF},
1229   {"weak_definition",   obj_mach_o_sym_qual, OBJ_MACH_O_SYM_WEAK_DEF},
1230   {"private_extern",    obj_mach_o_sym_qual, OBJ_MACH_O_SYM_PRIV_EXT},
1231   {"no_dead_strip",     obj_mach_o_sym_qual, OBJ_MACH_O_SYM_NO_DEAD_STRIP},
1232   {"weak",              obj_mach_o_sym_qual, OBJ_MACH_O_SYM_WEAK}, /* ext */
1233
1234   {"indirect_symbol",   obj_mach_o_placeholder, 0},
1235
1236   /* File flags.  */
1237   { "subsections_via_symbols", obj_mach_o_fileprop, 
1238                                OBJ_MACH_O_FILE_PROP_SUBSECTS_VIA_SYMS},
1239
1240   {NULL, NULL, 0}
1241 };
1242
1243 /* Determine the default n_type value for a symbol from its section.  */
1244
1245 static unsigned
1246 obj_mach_o_type_for_symbol (bfd_mach_o_asymbol *s)
1247 {
1248   if (s->symbol.section == bfd_abs_section_ptr)
1249     return BFD_MACH_O_N_ABS;
1250   else if (s->symbol.section == bfd_com_section_ptr
1251            || s->symbol.section == bfd_und_section_ptr)
1252     return BFD_MACH_O_N_UNDF;
1253   else
1254     return BFD_MACH_O_N_SECT;
1255 }
1256
1257 /* We need to check the correspondence between some kinds of symbols and their
1258    sections.  Common and BSS vars will seen via the obj_macho_comm() function.
1259    
1260    The earlier we can pick up a problem, the better the diagnostics will be.
1261    
1262    However, when symbol type information is attached, the symbol section will
1263    quite possibly be unknown.  So we are stuck with checking (most of the)
1264    validity at the time the file is written (unfortunately, then one doesn't
1265    get line number information in the diagnostic).  */
1266
1267 /* Here we pick up the case where symbol qualifiers have been applied that
1268    are possibly incompatible with the section etc. that the symbol is defined
1269    in.  */
1270
1271 void obj_macho_frob_label (struct symbol *sp)
1272 {
1273   bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (sp);
1274   /* This is the base symbol type, that we mask in.  */
1275   unsigned base_type = obj_mach_o_type_for_symbol (s);
1276   bfd_mach_o_section *sec = bfd_mach_o_get_mach_o_section (s->symbol.section);
1277   int sectype = -1;
1278
1279   if ((s->n_type & BFD_MACH_O_N_STAB) != 0)
1280     return; /* Leave alone.  */
1281   
1282   if (sec != NULL)
1283     sectype = sec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
1284
1285   /* If there is a pre-existing qualifier, we can make some checks about
1286      validity now.  */
1287
1288   if(s->symbol.udata.i == SYM_MACHO_FIELDS_NOT_VALIDATED)
1289     {
1290       if ((s->n_desc & BFD_MACH_O_N_WEAK_DEF)
1291           && sectype != BFD_MACH_O_S_COALESCED)
1292         as_bad (_("'%s' can't be a weak_definition (currently only supported"
1293                   " in sections of type coalesced)"), s->symbol.name);
1294
1295       /* Have we changed from an undefined to defined ref? */
1296       s->n_desc &= ~(REFE | LAZY);
1297     }
1298
1299   s->n_type &= ~BFD_MACH_O_N_TYPE;
1300   s->n_type |= base_type;
1301 }
1302
1303 /* This is the fall-back, we come here when we get to the end of the file and
1304    the symbol is not defined - or there are combinations of qualifiers required
1305    (e.g. global + weak_def).  */
1306
1307 int
1308 obj_macho_frob_symbol (struct symbol *sp)
1309 {
1310   bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (sp);
1311   unsigned base_type = obj_mach_o_type_for_symbol (s);
1312   bfd_mach_o_section *sec = bfd_mach_o_get_mach_o_section (s->symbol.section);
1313   int sectype = -1;
1314   
1315   if (sec != NULL)
1316     sectype = sec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
1317
1318   if ((s->n_type & BFD_MACH_O_N_STAB) != 0)
1319     return 0; /* Leave alone.  */
1320   else if (s->symbol.section == bfd_und_section_ptr)
1321     {
1322       /* ??? Do we really gain much from implementing this as well as the
1323          mach-o specific ones?  */
1324       if (s->symbol.flags & BSF_WEAK)
1325         s->n_desc |= BFD_MACH_O_N_WEAK_REF;
1326
1327       /* Undefined references, become extern.  */
1328       if (s->n_desc & REFE)
1329         {
1330           s->n_desc &= ~REFE;
1331           s->n_type |= BFD_MACH_O_N_EXT;
1332         }
1333
1334       /* So do undefined 'no_dead_strip's.  */
1335       if (s->n_desc & BFD_MACH_O_N_NO_DEAD_STRIP)
1336         s->n_type |= BFD_MACH_O_N_EXT;
1337
1338     }
1339   else
1340     {
1341       if ((s->symbol.flags & BSF_WEAK)
1342            && (sectype == BFD_MACH_O_S_COALESCED)
1343            && (s->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT)))
1344         s->n_desc |= BFD_MACH_O_N_WEAK_DEF;
1345 /* ??? we should do this - but then that reveals that the semantics of weak
1346        are different from what's supported in mach-o object files.
1347       else
1348         as_bad (_("'%s' can't be a weak_definition."),
1349                 s->symbol.name); */
1350     }
1351
1352   if (s->symbol.udata.i == SYM_MACHO_FIELDS_UNSET)
1353     {
1354       /* Anything here that should be added that is non-standard.  */
1355       s->n_desc &= ~BFD_MACH_O_REFERENCE_MASK;
1356     }    
1357   else if (s->symbol.udata.i == SYM_MACHO_FIELDS_NOT_VALIDATED)
1358     {
1359       /* Try to validate any combinations.  */
1360       if (s->n_desc & BFD_MACH_O_N_WEAK_DEF)
1361         {
1362           if (s->symbol.section == bfd_und_section_ptr)
1363             as_bad (_("'%s' can't be a weak_definition (since it is"
1364                       " undefined)"), s->symbol.name);
1365           else if (sectype != BFD_MACH_O_S_COALESCED)
1366             as_bad (_("'%s' can't be a weak_definition (currently only supported"
1367                       " in sections of type coalesced)"), s->symbol.name);
1368           else if (! (s->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT)))
1369             as_bad (_("Non-global symbol: '%s' can't be a weak_definition."),
1370                     s->symbol.name);
1371         }
1372
1373     }
1374   else
1375     as_bad (_("internal error: [%s] unexpected code [%lx] in frob symbol"),
1376             s->symbol.name, (unsigned long)s->symbol.udata.i);
1377
1378   s->n_type &= ~BFD_MACH_O_N_TYPE;
1379   s->n_type |= base_type;
1380
1381   if (s->symbol.flags & BSF_GLOBAL)
1382     s->n_type |= BFD_MACH_O_N_EXT;
1383
1384   /* This cuts both ways - we promote some things to external above.  */
1385   if (s->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT))
1386     S_SET_EXTERNAL (sp);
1387
1388   return 0;
1389 }
1390
1391 /* Support stabs for mach-o.  */
1392
1393 void
1394 obj_mach_o_process_stab (int what, const char *string,
1395                          int type, int other, int desc)
1396 {
1397   symbolS *symbolP;
1398   bfd_mach_o_asymbol *s;
1399
1400   switch (what)
1401     {
1402       case 'd':
1403         symbolP = symbol_new ("", now_seg, frag_now_fix (), frag_now);
1404         /* Special stabd NULL name indicator.  */
1405         S_SET_NAME (symbolP, NULL);
1406         break;
1407
1408       case 'n':
1409       case 's':
1410         symbolP = symbol_new (string, undefined_section, (valueT) 0,
1411                               &zero_address_frag);
1412         pseudo_set (symbolP);
1413         break;
1414
1415       default:
1416         as_bad(_("unrecognized stab type '%c'"), (char)what);
1417         abort ();
1418         break;
1419     }
1420
1421   s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (symbolP);
1422   s->n_type = type;
1423   s->n_desc = desc;
1424   /* For stabd, this will eventually get overwritten by the section number.  */
1425   s->n_sect = other;
1426
1427   /* It's a debug symbol.  */
1428   s->symbol.flags |= BSF_DEBUGGING;
1429 }