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