1 /* Mach-O object file format
2 Copyright (C) 2009-2019 Free Software Foundation, Inc.
4 This file is part of GAS, the GNU Assembler.
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.
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.
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
21 /* Here we handle the mach-o directives that are common to all architectures.
23 Most significant are mach-o named sections and a variety of symbol type
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.
31 The well-known as short-hand section switch directives like .text, .data
32 etc. are mapped onto predefined segment/section pairs using facilities
33 supplied by the mach-o port of bfd.
35 A number of additional mach-o short-hand section switch directives are
38 #define OBJ_HEADER "obj-macho.h"
45 #include "mach-o/loader.h"
46 #include "obj-macho.h"
51 static segT
obj_mach_o_segT_from_bfd_name (const char *, int);
53 /* TODO: Implement "-dynamic"/"-static" command line options. */
55 static int obj_mach_o_is_static
;
57 /* TODO: Implement the "-n" command line option to suppress the initial
58 switch to the text segment. */
60 static int obj_mach_o_start_with_text_section
= 1;
62 /* Allow for special re-ordering on output. */
64 static int obj_mach_o_seen_objc_section
;
66 /* Start-up: At present, just create the sections we want. */
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
)
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
)
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
;
86 /* Remember the subsections_by_symbols state in case we need to reset
89 static int obj_mach_o_subsections_by_symbols
;
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
97 It trims leading and trailing space. */
100 collect_16char_name (char *dest
, const char *msg
, int require_comma
)
105 namstart
= input_line_pointer
;
107 while ( (c
= *input_line_pointer
) != ','
108 && !is_end_of_line
[(unsigned char) c
])
109 input_line_pointer
++;
112 int len
= input_line_pointer
- namstart
; /* could be zero. */
113 /* lose any trailing space. */
114 while (len
> 0 && namstart
[len
-1] == ' ')
118 *input_line_pointer
= '\0'; /* make a temp string. */
119 as_bad (_("the %s name '%s' is too long (maximum 16 characters)"),
121 *input_line_pointer
= c
; /* restore for printing. */
125 memcpy (dest
, namstart
, len
);
128 if (c
!= ',' && require_comma
)
130 as_bad (_("expected a %s name followed by a `,'"), msg
);
138 obj_mach_o_get_section_names (char *seg
, char *sec
,
139 unsigned segl
, unsigned secl
)
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))
146 ignore_rest_of_line ();
149 input_line_pointer
++; /* Skip the terminating ',' */
151 /* Parse section name, which can be empty. */
152 memset (sec
, 0, secl
);
153 collect_16char_name (sec
, "section", 0);
157 /* Build (or get) a section from the mach-o description - which includes
158 optional definitions for type, attributes, alignment and stub size.
160 BFD supplies default values for sections which have a canonical name. */
162 #define SECT_TYPE_SPECIFIED 0x0001
163 #define SECT_ATTR_SPECIFIED 0x0002
164 #define SECT_ALGN_SPECIFIED 0x0004
165 #define SECT_STUB_SPECIFIED 0x0008
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
)
173 unsigned int sectype
, secattr
, secalign
;
174 flagword oldflags
, flags
;
177 bfd_mach_o_section
*msect
;
178 const mach_o_section_name_xlat
*xlat
;
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
);
184 /* TODO: more checking of whether overrides are actually allowed. */
188 name
= xstrdup (xlat
->bfd_name
);
189 sectype
= xlat
->macho_sectype
;
190 if (specified_mask
& SECT_TYPE_SPECIFIED
)
192 if ((sectype
== BFD_MACH_O_S_ZEROFILL
193 || sectype
== BFD_MACH_O_S_GB_ZEROFILL
)
194 && sectype
!= usectype
)
195 as_bad (_("cannot override zerofill section type for `%s,%s'"),
200 secattr
= xlat
->macho_secattr
;
201 secalign
= xlat
->sectalign
;
202 flags
= xlat
->bfd_flags
;
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
209 name
= concat (segname
, ".", sectname
, (char *) NULL
);
210 if (specified_mask
& SECT_TYPE_SPECIFIED
)
213 sectype
= BFD_MACH_O_S_REGULAR
;
214 secattr
= BFD_MACH_O_S_ATTR_NONE
;
216 flags
= SEC_NO_FLAGS
;
219 /* For now, just use what the user provided. */
221 if (specified_mask
& SECT_ATTR_SPECIFIED
)
224 if (specified_mask
& SECT_ALGN_SPECIFIED
)
227 /* Sub-segments don't exists as is on Mach-O. */
228 sec
= subseg_new (name
, 0);
230 oldflags
= bfd_get_section_flags (stdoutput
, sec
);
231 msect
= bfd_mach_o_get_mach_o_section (sec
);
233 if (oldflags
== SEC_NO_FLAGS
)
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
))
242 if (flags
== SEC_NO_FLAGS
243 && (specified_mask
& SECT_ATTR_SPECIFIED
)
244 && (secattr
& BFD_MACH_O_S_ATTR_DEBUG
))
245 flags
|= SEC_DEBUGGING
;
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 ()));
253 strncpy (msect
->segname
, segname
, BFD_MACH_O_SEGNAME_SIZE
);
254 msect
->segname
[BFD_MACH_O_SEGNAME_SIZE
] = 0;
255 strncpy (msect
->sectname
, sectname
, BFD_MACH_O_SECTNAME_SIZE
);
256 msect
->sectname
[BFD_MACH_O_SECTNAME_SIZE
] = 0;
258 msect
->align
= secalign
;
259 msect
->flags
= sectype
| secattr
;
261 if (sectype
== BFD_MACH_O_S_ZEROFILL
262 || sectype
== BFD_MACH_O_S_GB_ZEROFILL
)
263 seg_info (sec
)->bss
= 1;
265 else if (flags
!= SEC_NO_FLAGS
)
267 if (flags
!= oldflags
268 || msect
->flags
!= (secattr
| sectype
))
269 as_warn (_("Ignoring changed section attributes for %s"), name
);
272 if (specified_mask
& SECT_STUB_SPECIFIED
)
273 /* At present, the stub size is not supplied from the BFD tables. */
274 msect
->reserved2
= stub_size
;
281 The '.section' specification syntax looks like:
282 .section <segment> , <section> [, type [, attribs [, size]]]
284 White space is allowed everywhere between elements.
286 <segment> and <section> may be from 0 to 16 chars in length - they may
287 contain spaces but leading and trailing space will be trimmed. It is
288 mandatory that they be present (or that zero-length names are indicated
291 There is only a single section type for any entry.
293 There may be multiple attributes, they are delimited by `+'.
295 Not all section types and attributes are accepted by the Darwin system
296 assemblers as user-specifiable - although, at present, we do here. */
299 obj_mach_o_section (int ignore ATTRIBUTE_UNUSED
)
301 unsigned int sectype
= BFD_MACH_O_S_REGULAR
;
302 unsigned int specified_mask
= 0;
303 unsigned int secattr
= 0;
304 offsetT sizeof_stub
= 0;
309 #ifdef md_flush_pending_output
310 md_flush_pending_output ();
313 /* Get the User's segment and section names. */
314 if (! obj_mach_o_get_section_names (segname
, sectname
, 17, 17))
317 /* Parse section type, if present. */
318 if (*input_line_pointer
== ',')
324 input_line_pointer
++;
326 p
= input_line_pointer
;
327 while ((c
= *input_line_pointer
) != ','
328 && !is_end_of_line
[(unsigned char) c
])
329 input_line_pointer
++;
331 len
= input_line_pointer
- p
;
332 /* strip trailing spaces. */
333 while (len
> 0 && p
[len
-1] == ' ')
337 /* Temporarily make a string from the token. */
339 sectype
= bfd_mach_o_get_section_type_from_name (stdoutput
, p
);
340 if (sectype
> 255) /* Max Section ID == 255. */
342 as_bad (_("unknown or invalid section type '%s'"), p
);
344 ignore_rest_of_line ();
348 specified_mask
|= SECT_TYPE_SPECIFIED
;
353 TODO: check validity of attributes for section type. */
354 if ((specified_mask
& SECT_TYPE_SPECIFIED
)
361 /* Skip initial `,' and subsequent `+'. */
362 input_line_pointer
++;
364 p
= input_line_pointer
;
365 while ((c
= *input_line_pointer
) != '+'
367 && !is_end_of_line
[(unsigned char) c
])
368 input_line_pointer
++;
370 len
= input_line_pointer
- p
;
371 /* strip trailing spaces. */
372 while (len
> 0 && p
[len
-1] == ' ')
376 /* Temporarily make a string from the token. */
378 attr
= bfd_mach_o_get_section_attribute_from_name (p
);
381 as_bad (_("unknown or invalid section attribute '%s'"), p
);
383 ignore_rest_of_line ();
388 specified_mask
|= SECT_ATTR_SPECIFIED
;
394 while (*input_line_pointer
== '+');
396 /* Parse sizeof_stub. */
397 if ((specified_mask
& SECT_ATTR_SPECIFIED
)
398 && *input_line_pointer
== ',')
400 if (sectype
!= BFD_MACH_O_S_SYMBOL_STUBS
)
402 as_bad (_("unexpected section size information"));
403 ignore_rest_of_line ();
407 input_line_pointer
++;
408 sizeof_stub
= get_absolute_expression ();
409 specified_mask
|= SECT_STUB_SPECIFIED
;
411 else if ((specified_mask
& SECT_ATTR_SPECIFIED
)
412 && sectype
== BFD_MACH_O_S_SYMBOL_STUBS
)
414 as_bad (_("missing sizeof_stub expression"));
415 ignore_rest_of_line ();
421 new_seg
= obj_mach_o_make_or_get_sect (segname
, sectname
, specified_mask
,
422 sectype
, secattr
, 0 /*align */,
426 subseg_set (new_seg
, 0);
427 demand_empty_rest_of_line ();
431 /* .zerofill segname, sectname [, symbolname, size [, align]]
433 Zerofill switches, temporarily, to a sect of type 'zerofill'.
435 If a variable name is given, it defines that in the section.
436 Otherwise it just creates the section if it doesn't exist. */
439 obj_mach_o_zerofill (int ignore ATTRIBUTE_UNUSED
)
443 segT old_seg
= now_seg
;
446 unsigned int align
= 0;
447 unsigned int specified_mask
= 0;
450 #ifdef md_flush_pending_output
451 md_flush_pending_output ();
454 /* Get the User's segment and section names. */
455 if (! obj_mach_o_get_section_names (segname
, sectname
, 17, 17))
458 /* Parse variable definition, if present. */
459 if (*input_line_pointer
== ',')
461 /* Parse symbol, size [.align]
462 We follow the method of s_common_internal, with the difference
463 that the symbol cannot be a duplicate-common. */
469 input_line_pointer
++; /* Skip ',' */
471 c
= get_symbol_name (&name
);
472 /* Just after name is now '\0'. */
473 p
= input_line_pointer
;
478 as_bad (_("expected symbol name"));
479 ignore_rest_of_line ();
483 SKIP_WHITESPACE_AFTER_NAME ();
484 if (*input_line_pointer
== ',')
485 input_line_pointer
++;
487 expression_and_evaluate (&exp
);
488 if (exp
.X_op
!= O_constant
489 && exp
.X_op
!= O_absent
)
491 as_bad (_("bad or irreducible absolute expression"));
492 ignore_rest_of_line ();
495 else if (exp
.X_op
== O_absent
)
497 as_bad (_("missing size expression"));
498 ignore_rest_of_line ();
502 size
= exp
.X_add_number
;
503 size
&= ((offsetT
) 2 << (stdoutput
->arch_info
->bits_per_address
- 1)) - 1;
504 if (exp
.X_add_number
!= size
|| !exp
.X_unsigned
)
506 as_warn (_("size (%ld) out of range, ignored"),
507 (long) exp
.X_add_number
);
508 ignore_rest_of_line ();
512 *p
= 0; /* Make the name into a c string for err messages. */
513 sym
= symbol_find_or_make (name
);
514 if (S_IS_DEFINED (sym
) || symbol_equated_p (sym
))
516 as_bad (_("symbol `%s' is already defined"), name
);
518 ignore_rest_of_line ();
522 size
= S_GET_VALUE (sym
);
524 size
= exp
.X_add_number
;
525 else if (size
!= exp
.X_add_number
)
526 as_warn (_("size of \"%s\" is already %ld; not changing to %ld"),
527 name
, (long) size
, (long) exp
.X_add_number
);
529 *p
= c
; /* Restore the termination char. */
532 if (*input_line_pointer
== ',')
534 align
= (unsigned int) parse_align (0);
535 if (align
== (unsigned int) -1)
537 as_warn (_("align value not recognized, using size"));
542 as_warn (_("Alignment (%lu) too large: 15 assumed."),
543 (unsigned long)align
);
546 specified_mask
|= SECT_ALGN_SPECIFIED
;
549 /* else just a section definition. */
551 specified_mask
|= SECT_TYPE_SPECIFIED
;
552 new_seg
= obj_mach_o_make_or_get_sect (segname
, sectname
, specified_mask
,
553 BFD_MACH_O_S_ZEROFILL
,
554 BFD_MACH_O_S_ATTR_NONE
,
555 align
, (offsetT
) 0 /*stub size*/);
559 /* In case the user specifies the bss section by mach-o name.
560 Create it on demand */
561 if (strcmp (new_seg
->name
, BSS_SECTION_NAME
) == 0
562 && bss_section
== NULL
)
563 bss_section
= new_seg
;
565 subseg_set (new_seg
, 0);
573 record_alignment (new_seg
, align
);
574 frag_align (align
, 0, 0);
577 /* Detach from old frag. */
578 if (S_GET_SEGMENT (sym
) == new_seg
)
579 symbol_get_frag (sym
)->fr_symbol
= NULL
;
581 symbol_set_frag (sym
, frag_now
);
582 pfrag
= frag_var (rs_org
, 1, 1, 0, sym
, size
, NULL
);
585 S_SET_SEGMENT (sym
, new_seg
);
586 if (new_seg
== bss_section
)
587 S_CLEAR_EXTERNAL (sym
);
591 /* switch back to the section that was current before the .zerofill. */
592 subseg_set (old_seg
, 0);
596 obj_mach_o_segT_from_bfd_name (const char *nam
, int must_succeed
)
598 const mach_o_section_name_xlat
*xlat
;
602 /* BFD has tables of flags and default attributes for all the sections that
603 have a 'canonical' name. */
604 xlat
= bfd_mach_o_section_data_for_bfd_name (stdoutput
, nam
, &segn
);
608 as_fatal (_("BFD is out of sync with GAS, "
609 "unhandled well-known section type `%s'"), nam
);
613 sec
= bfd_get_section_by_name (stdoutput
, nam
);
616 bfd_mach_o_section
*msect
;
618 sec
= subseg_force_new (xlat
->bfd_name
, 0);
620 /* Set default type, attributes and alignment. */
621 msect
= bfd_mach_o_get_mach_o_section (sec
);
622 msect
->flags
= xlat
->macho_sectype
| xlat
->macho_secattr
;
623 msect
->align
= xlat
->sectalign
;
625 if ((msect
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
)
626 == BFD_MACH_O_S_ZEROFILL
)
627 seg_info (sec
)->bss
= 1;
633 static const char * const known_sections
[] =
638 /* 2 */ ".static_const",
642 /* 6 */ ".literal16",
643 /* 7 */ ".constructor",
644 /* 8 */ ".destructor",
647 /* 10 */ ".const_data",
648 /* 11 */ ".static_data",
649 /* 12 */ ".mod_init_func",
650 /* 13 */ ".mod_term_func",
655 /* Interface for a known non-optional section directive. */
658 obj_mach_o_known_section (int sect_index
)
662 #ifdef md_flush_pending_output
663 md_flush_pending_output ();
666 section
= obj_mach_o_segT_from_bfd_name (known_sections
[sect_index
], 1);
668 subseg_set (section
, 0);
670 /* else, we leave the section as it was; there was a fatal error anyway. */
673 static const char * const objc_sections
[] =
676 /* 1 */ ".objc_class",
677 /* 2 */ ".objc_meta_class",
678 /* 3 */ ".objc_cat_cls_meth",
679 /* 4 */ ".objc_cat_inst_meth",
680 /* 5 */ ".objc_protocol",
681 /* 6 */ ".objc_string_object",
682 /* 7 */ ".objc_cls_meth",
683 /* 8 */ ".objc_inst_meth",
684 /* 9 */ ".objc_cls_refs",
685 /* 10 */ ".objc_message_refs",
686 /* 11 */ ".objc_symbols",
687 /* 12 */ ".objc_category",
688 /* 13 */ ".objc_class_vars",
689 /* 14 */ ".objc_instance_vars",
690 /* 15 */ ".objc_module_info",
691 /* 16 */ ".cstring", /* objc_class_names Alias for .cstring */
692 /* 17 */ ".cstring", /* Alias objc_meth_var_types for .cstring */
693 /* 18 */ ".cstring", /* objc_meth_var_names Alias for .cstring */
694 /* 19 */ ".objc_selector_strs",
695 /* 20 */ ".objc_image_info", /* extension. */
696 /* 21 */ ".objc_selector_fixup", /* extension. */
697 /* 22 */ ".objc1_class_ext", /* ObjC-1 extension. */
698 /* 23 */ ".objc1_property_list", /* ObjC-1 extension. */
699 /* 24 */ ".objc1_protocol_ext" /* ObjC-1 extension. */
702 /* This currently does the same as known_sections, but kept separate for
703 ease of maintenance. */
706 obj_mach_o_objc_section (int sect_index
)
710 #ifdef md_flush_pending_output
711 md_flush_pending_output ();
714 section
= obj_mach_o_segT_from_bfd_name (objc_sections
[sect_index
], 1);
717 obj_mach_o_seen_objc_section
= 1; /* We need to ensure that certain
718 sections are present and in the
720 subseg_set (section
, 0);
723 /* else, we leave the section as it was; there was a fatal error anyway. */
726 /* Debug section directives. */
728 static const char * const debug_sections
[] =
732 /* 1 */ ".debug_frame",
733 /* 2 */ ".debug_info",
734 /* 3 */ ".debug_abbrev",
735 /* 4 */ ".debug_aranges",
736 /* 5 */ ".debug_macinfo",
737 /* 6 */ ".debug_line",
738 /* 7 */ ".debug_loc",
739 /* 8 */ ".debug_pubnames",
740 /* 9 */ ".debug_pubtypes",
741 /* 10 */ ".debug_str",
742 /* 11 */ ".debug_ranges",
743 /* 12 */ ".debug_macro"
746 /* ??? Maybe these should be conditional on gdwarf-*.
747 It`s also likely that we will need to be able to set them from the cfi
751 obj_mach_o_debug_section (int sect_index
)
755 #ifdef md_flush_pending_output
756 md_flush_pending_output ();
759 section
= obj_mach_o_segT_from_bfd_name (debug_sections
[sect_index
], 1);
761 subseg_set (section
, 0);
763 /* else, we leave the section as it was; there was a fatal error anyway. */
766 /* This could be moved to the tc-xx files, but there is so little dependency
767 there, that the code might as well be shared. */
776 /* The extensions here are for specific sections that are generated by GCC
777 and Darwin system tools, but don't have directives in the `system as'. */
779 static const struct opt_tgt_sect tgt_sections
[] =
781 /* 0 */ { NULL
, 0, 0},
782 /* 1 */ { ".lazy_symbol_pointer", 0, 0},
783 /* 2 */ { ".lazy_symbol_pointer2", 0, 0}, /* X86 - extension */
784 /* 3 */ { ".lazy_symbol_pointer3", 0, 0}, /* X86 - extension */
785 /* 4 */ { ".non_lazy_symbol_pointer", 0, 0},
786 /* 5 */ { ".non_lazy_symbol_pointer_x86", 0, 0}, /* X86 - extension */
787 /* 6 */ { ".symbol_stub", 16, 20},
788 /* 7 */ { ".symbol_stub1", 0, 16}, /* PPC - extension */
789 /* 8 */ { ".picsymbol_stub", 26, 36},
790 /* 9 */ { ".picsymbol_stub1", 0, 32}, /* PPC - extension */
791 /* 10 */ { ".picsymbol_stub2", 25, 0}, /* X86 - extension */
792 /* 11 */ { ".picsymbol_stub3", 5, 0}, /* X86 - extension */
795 /* Interface for an optional section directive. */
798 obj_mach_o_opt_tgt_section (int sect_index
)
800 const struct opt_tgt_sect
*tgtsct
= &tgt_sections
[sect_index
];
803 #ifdef md_flush_pending_output
804 md_flush_pending_output ();
807 section
= obj_mach_o_segT_from_bfd_name (tgtsct
->name
, 0);
810 as_bad (_("%s is not used for the selected target"), tgtsct
->name
);
811 /* Leave the section as it is. */
815 bfd_mach_o_section
*mo_sec
= bfd_mach_o_get_mach_o_section (section
);
816 subseg_set (section
, 0);
817 #if defined (TC_I386)
818 mo_sec
->reserved2
= tgtsct
->x86_val
;
819 #elif defined (TC_PPC)
820 mo_sec
->reserved2
= tgtsct
->ppc_val
;
822 mo_sec
->reserved2
= 0;
827 /* We don't necessarily have the three 'base' sections on mach-o.
828 Normally, we would start up with only the 'text' section defined.
829 However, even that can be suppressed with (TODO) c/l option "-n".
830 Thus, we have to be able to create all three sections on-demand. */
833 obj_mach_o_base_section (int sect_index
)
837 #ifdef md_flush_pending_output
838 md_flush_pending_output ();
841 /* We don't support numeric (or any other) qualifications on the
842 well-known section shorthands. */
843 demand_empty_rest_of_line ();
847 /* Handle the three sections that are globally known within GAS.
848 For Mach-O, these are created on demand rather than at startup. */
850 if (text_section
== NULL
)
851 text_section
= obj_mach_o_segT_from_bfd_name (TEXT_SECTION_NAME
, 1);
852 if (obj_mach_o_is_static
)
854 bfd_mach_o_section
*mo_sec
855 = bfd_mach_o_get_mach_o_section (text_section
);
856 mo_sec
->flags
&= ~BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS
;
858 section
= text_section
;
861 if (data_section
== NULL
)
862 data_section
= obj_mach_o_segT_from_bfd_name (DATA_SECTION_NAME
, 1);
863 section
= data_section
;
866 /* ??? maybe this achieves very little, as an addition. */
867 if (bss_section
== NULL
)
869 bss_section
= obj_mach_o_segT_from_bfd_name (BSS_SECTION_NAME
, 1);
870 seg_info (bss_section
)->bss
= 1;
872 section
= bss_section
;
875 as_fatal (_("internal error: base section index out of range"));
879 subseg_set (section
, 0);
882 /* This finishes off parsing a .comm or .lcomm statement, which both can have
883 an (optional) alignment field. It also allows us to create the bss section
887 obj_mach_o_common_parse (int is_local
, symbolS
*symbolP
,
891 bfd_mach_o_asymbol
*s
;
895 /* Both comm and lcomm take an optional alignment, as a power
896 of two between 1 and 15. */
897 if (*input_line_pointer
== ',')
899 /* We expect a power of 2. */
900 align
= parse_align (0);
901 if (align
== (addressT
) -1)
905 as_warn (_("Alignment (%lu) too large: 15 assumed."),
906 (unsigned long)align
);
911 s
= (bfd_mach_o_asymbol
*) symbol_get_bfdsym (symbolP
);
914 /* Create the BSS section on demand. */
915 if (bss_section
== NULL
)
917 bss_section
= obj_mach_o_segT_from_bfd_name (BSS_SECTION_NAME
, 1);
918 seg_info (bss_section
)->bss
= 1;
920 bss_alloc (symbolP
, size
, align
);
921 s
->n_type
= BFD_MACH_O_N_SECT
;
922 S_CLEAR_EXTERNAL (symbolP
);
926 S_SET_VALUE (symbolP
, size
);
927 S_SET_ALIGN (symbolP
, align
);
928 S_SET_EXTERNAL (symbolP
);
929 S_SET_SEGMENT (symbolP
, bfd_com_section_ptr
);
930 s
->n_type
= BFD_MACH_O_N_UNDF
| BFD_MACH_O_N_EXT
;
933 /* This is a data object (whatever we choose that to mean). */
934 s
->symbol
.flags
|= BSF_OBJECT
;
936 /* We've set symbol qualifiers, so validate if you can. */
937 s
->symbol
.udata
.i
= SYM_MACHO_FIELDS_NOT_VALIDATED
;
943 obj_mach_o_comm (int is_local
)
945 s_comm_internal (is_local
, obj_mach_o_common_parse
);
948 /* Set properties that apply to the whole file. At present, the only
949 one defined, is subsections_via_symbols. */
951 typedef enum obj_mach_o_file_properties
{
952 OBJ_MACH_O_FILE_PROP_NONE
= 0,
953 OBJ_MACH_O_FILE_PROP_SUBSECTS_VIA_SYMS
,
954 OBJ_MACH_O_FILE_PROP_MAX
955 } obj_mach_o_file_properties
;
958 obj_mach_o_fileprop (int prop
)
960 if (prop
< 0 || prop
>= OBJ_MACH_O_FILE_PROP_MAX
)
961 as_fatal (_("internal error: bad file property ID %d"), prop
);
963 switch ((obj_mach_o_file_properties
) prop
)
965 case OBJ_MACH_O_FILE_PROP_SUBSECTS_VIA_SYMS
:
966 obj_mach_o_subsections_by_symbols
= 1;
967 if (!bfd_set_private_flags (stdoutput
,
968 BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS
))
969 as_bad (_("failed to set subsections by symbols"));
970 demand_empty_rest_of_line ();
977 /* Temporary markers for symbol reference data.
978 Lazy will remain in place. */
982 /* We have a bunch of qualifiers that may be applied to symbols.
983 .globl is handled here so that we might make sure that conflicting qualifiers
984 are caught where possible. */
986 typedef enum obj_mach_o_symbol_type
{
987 OBJ_MACH_O_SYM_UNK
= 0,
988 OBJ_MACH_O_SYM_LOCAL
= 1,
989 OBJ_MACH_O_SYM_GLOBL
= 2,
990 OBJ_MACH_O_SYM_REFERENCE
= 3,
991 OBJ_MACH_O_SYM_WEAK_REF
= 4,
992 OBJ_MACH_O_SYM_LAZY_REF
= 5,
993 OBJ_MACH_O_SYM_WEAK_DEF
= 6,
994 OBJ_MACH_O_SYM_PRIV_EXT
= 7,
995 OBJ_MACH_O_SYM_NO_DEAD_STRIP
= 8,
996 OBJ_MACH_O_SYM_WEAK
= 9
997 } obj_mach_o_symbol_type
;
999 /* Set Mach-O-specific symbol qualifiers. */
1002 obj_mach_o_set_symbol_qualifier (symbolS
*sym
, int type
)
1005 bfd_mach_o_asymbol
*s
= (bfd_mach_o_asymbol
*) symbol_get_bfdsym (sym
);
1006 bfd_mach_o_section
*sec
;
1009 /* If the symbol is defined, then we can do more rigorous checking on
1010 the validity of the qualifiers. Otherwise, we are stuck with waiting
1011 until it's defined - or until write the file.
1013 In certain cases (e.g. when a symbol qualifier is intended to introduce
1014 an undefined symbol in a stubs section) we should check that the current
1015 section is appropriate to the qualifier. */
1017 is_defined
= s
->symbol
.section
!= bfd_und_section_ptr
;
1019 sec
= bfd_mach_o_get_mach_o_section (s
->symbol
.section
) ;
1021 sec
= bfd_mach_o_get_mach_o_section (now_seg
) ;
1024 sectype
= sec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
;
1026 switch ((obj_mach_o_symbol_type
) type
)
1028 case OBJ_MACH_O_SYM_LOCAL
:
1029 /* This is an extension over the system tools. */
1030 if (s
->n_type
& (BFD_MACH_O_N_PEXT
| BFD_MACH_O_N_EXT
))
1032 as_bad (_("'%s' previously declared as '%s'."), s
->symbol
.name
,
1033 (s
->n_type
& BFD_MACH_O_N_PEXT
) ? "private extern"
1035 s
->symbol
.udata
.i
= SYM_MACHO_FIELDS_UNSET
;
1040 s
->n_type
&= ~BFD_MACH_O_N_EXT
;
1041 S_CLEAR_EXTERNAL (sym
);
1045 case OBJ_MACH_O_SYM_PRIV_EXT
:
1046 s
->n_type
|= BFD_MACH_O_N_PEXT
;
1047 s
->n_desc
&= ~LAZY
; /* The native tool switches this off too. */
1048 /* We follow the system tools in marking PEXT as also global. */
1051 case OBJ_MACH_O_SYM_GLOBL
:
1052 /* It's not an error to define a symbol and then make it global. */
1053 s
->n_type
|= BFD_MACH_O_N_EXT
;
1054 S_SET_EXTERNAL (sym
);
1057 case OBJ_MACH_O_SYM_REFERENCE
:
1059 s
->n_desc
|= BFD_MACH_O_N_NO_DEAD_STRIP
;
1061 s
->n_desc
|= (REFE
| BFD_MACH_O_N_NO_DEAD_STRIP
);
1064 case OBJ_MACH_O_SYM_LAZY_REF
:
1066 s
->n_desc
|= BFD_MACH_O_N_NO_DEAD_STRIP
;
1068 s
->n_desc
|= (REFE
| LAZY
| BFD_MACH_O_N_NO_DEAD_STRIP
);
1071 /* Force ld to retain the symbol - even if it appears unused. */
1072 case OBJ_MACH_O_SYM_NO_DEAD_STRIP
:
1073 s
->n_desc
|= BFD_MACH_O_N_NO_DEAD_STRIP
;
1076 /* Mach-O's idea of weak ... */
1077 case OBJ_MACH_O_SYM_WEAK_REF
:
1078 s
->n_desc
|= BFD_MACH_O_N_WEAK_REF
;
1081 case OBJ_MACH_O_SYM_WEAK_DEF
:
1082 if (is_defined
&& sectype
!= BFD_MACH_O_S_COALESCED
)
1084 as_bad (_("'%s' can't be a weak_definition (currently only"
1085 " supported in sections of type coalesced)"),
1087 s
->symbol
.udata
.i
= SYM_MACHO_FIELDS_UNSET
;
1091 s
->n_desc
|= BFD_MACH_O_N_WEAK_DEF
;
1094 case OBJ_MACH_O_SYM_WEAK
:
1095 /* A generic 'weak' - we try to figure out what it means at
1096 symbol frob time. */
1104 /* We've seen some kind of qualifier - check validity if or when the entity
1106 s
->symbol
.udata
.i
= SYM_MACHO_FIELDS_NOT_VALIDATED
;
1110 /* Respond to symbol qualifiers.
1112 .<qualifier> symbol [, symbol]*
1113 a list of symbols is an extension over the Darwin system as. */
1116 obj_mach_o_sym_qual (int ntype
)
1122 #ifdef md_flush_pending_output
1123 md_flush_pending_output ();
1128 c
= get_symbol_name (&name
);
1129 symbolP
= symbol_find_or_make (name
);
1130 obj_mach_o_set_symbol_qualifier (symbolP
, ntype
);
1131 *input_line_pointer
= c
;
1132 SKIP_WHITESPACE_AFTER_NAME ();
1133 c
= *input_line_pointer
;
1136 input_line_pointer
++;
1138 if (is_end_of_line
[(unsigned char) *input_line_pointer
])
1144 demand_empty_rest_of_line ();
1147 typedef struct obj_mach_o_indirect_sym
1151 struct obj_mach_o_indirect_sym
*next
;
1152 } obj_mach_o_indirect_sym
;
1154 /* We store in order an maintain a pointer to the last one - to save reversing
1156 obj_mach_o_indirect_sym
*indirect_syms
;
1157 obj_mach_o_indirect_sym
*indirect_syms_tail
;
1160 obj_mach_o_indirect_symbol (int arg ATTRIBUTE_UNUSED
)
1162 bfd_mach_o_section
*sec
= bfd_mach_o_get_mach_o_section (now_seg
);
1164 #ifdef md_flush_pending_output
1165 md_flush_pending_output ();
1168 if (obj_mach_o_is_static
)
1169 as_bad (_("use of .indirect_symbols requires `-dynamic'"));
1171 switch (sec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
)
1173 case BFD_MACH_O_S_SYMBOL_STUBS
:
1174 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS
:
1175 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS
:
1177 obj_mach_o_indirect_sym
*isym
;
1179 char c
= get_symbol_name (&name
);
1180 symbolS
*sym
= symbol_find_or_make (name
);
1181 unsigned int elsize
=
1182 bfd_mach_o_section_get_entry_size (stdoutput
, sec
);
1186 as_bad (_("attempt to add an indirect_symbol to a stub or"
1187 " reference section with a zero-sized element at %s"),
1189 (void) restore_line_pointer (c
);
1190 ignore_rest_of_line ();
1193 (void) restore_line_pointer (c
);
1195 /* The indirect symbols are validated after the symbol table is
1196 frozen, we must make sure that if a local symbol is used as an
1197 indirect, it is promoted to a 'real' one. Fetching the bfd sym
1199 symbol_get_bfdsym (sym
);
1200 isym
= XNEW (obj_mach_o_indirect_sym
);
1202 /* Just record the data for now, we will validate it when we
1203 compute the output in obj_mach_o_set_indirect_symbols. */
1205 isym
->sect
= now_seg
;
1207 if (indirect_syms
== NULL
)
1208 indirect_syms
= isym
;
1210 indirect_syms_tail
->next
= isym
;
1211 indirect_syms_tail
= isym
;
1216 as_bad (_("an .indirect_symbol must be in a symbol pointer"
1217 " or stub section."));
1218 ignore_rest_of_line ();
1221 demand_empty_rest_of_line ();
1224 const pseudo_typeS mach_o_pseudo_table
[] =
1226 /* Section directives. */
1227 { "comm", obj_mach_o_comm
, 0 },
1228 { "lcomm", obj_mach_o_comm
, 1 },
1230 { "text", obj_mach_o_base_section
, 1},
1231 { "data", obj_mach_o_base_section
, 2},
1232 { "bss", obj_mach_o_base_section
, 3}, /* extension */
1234 { "const", obj_mach_o_known_section
, 1},
1235 { "static_const", obj_mach_o_known_section
, 2},
1236 { "cstring", obj_mach_o_known_section
, 3},
1237 { "literal4", obj_mach_o_known_section
, 4},
1238 { "literal8", obj_mach_o_known_section
, 5},
1239 { "literal16", obj_mach_o_known_section
, 6},
1240 { "constructor", obj_mach_o_known_section
, 7},
1241 { "destructor", obj_mach_o_known_section
, 8},
1242 { "eh_frame", obj_mach_o_known_section
, 9},
1244 { "const_data", obj_mach_o_known_section
, 10},
1245 { "static_data", obj_mach_o_known_section
, 11},
1246 { "mod_init_func", obj_mach_o_known_section
, 12},
1247 { "mod_term_func", obj_mach_o_known_section
, 13},
1248 { "dyld", obj_mach_o_known_section
, 14},
1249 { "cfstring", obj_mach_o_known_section
, 15},
1251 { "objc_class", obj_mach_o_objc_section
, 1},
1252 { "objc_meta_class", obj_mach_o_objc_section
, 2},
1253 { "objc_cat_cls_meth", obj_mach_o_objc_section
, 3},
1254 { "objc_cat_inst_meth", obj_mach_o_objc_section
, 4},
1255 { "objc_protocol", obj_mach_o_objc_section
, 5},
1256 { "objc_string_object", obj_mach_o_objc_section
, 6},
1257 { "objc_cls_meth", obj_mach_o_objc_section
, 7},
1258 { "objc_inst_meth", obj_mach_o_objc_section
, 8},
1259 { "objc_cls_refs", obj_mach_o_objc_section
, 9},
1260 { "objc_message_refs", obj_mach_o_objc_section
, 10},
1261 { "objc_symbols", obj_mach_o_objc_section
, 11},
1262 { "objc_category", obj_mach_o_objc_section
, 12},
1263 { "objc_class_vars", obj_mach_o_objc_section
, 13},
1264 { "objc_instance_vars", obj_mach_o_objc_section
, 14},
1265 { "objc_module_info", obj_mach_o_objc_section
, 15},
1266 { "objc_class_names", obj_mach_o_objc_section
, 16}, /* Alias for .cstring */
1267 { "objc_meth_var_types", obj_mach_o_objc_section
, 17}, /* Alias for .cstring */
1268 { "objc_meth_var_names", obj_mach_o_objc_section
, 18}, /* Alias for .cstring */
1269 { "objc_selector_strs", obj_mach_o_objc_section
, 19},
1270 { "objc_image_info", obj_mach_o_objc_section
, 20}, /* extension. */
1271 { "objc_selector_fixup", obj_mach_o_objc_section
, 21}, /* extension. */
1272 { "objc1_class_ext", obj_mach_o_objc_section
, 22}, /* ObjC-1 extension. */
1273 { "objc1_property_list", obj_mach_o_objc_section
, 23}, /* ObjC-1 extension. */
1274 { "objc1_protocol_ext", obj_mach_o_objc_section
, 24}, /* ObjC-1 extension. */
1276 { "debug_frame", obj_mach_o_debug_section
, 1}, /* extension. */
1277 { "debug_info", obj_mach_o_debug_section
, 2}, /* extension. */
1278 { "debug_abbrev", obj_mach_o_debug_section
, 3}, /* extension. */
1279 { "debug_aranges", obj_mach_o_debug_section
, 4}, /* extension. */
1280 { "debug_macinfo", obj_mach_o_debug_section
, 5}, /* extension. */
1281 { "debug_line", obj_mach_o_debug_section
, 6}, /* extension. */
1282 { "debug_loc", obj_mach_o_debug_section
, 7}, /* extension. */
1283 { "debug_pubnames", obj_mach_o_debug_section
, 8}, /* extension. */
1284 { "debug_pubtypes", obj_mach_o_debug_section
, 9}, /* extension. */
1285 { "debug_str", obj_mach_o_debug_section
, 10}, /* extension. */
1286 { "debug_ranges", obj_mach_o_debug_section
, 11}, /* extension. */
1287 { "debug_macro", obj_mach_o_debug_section
, 12}, /* extension. */
1289 { "lazy_symbol_pointer", obj_mach_o_opt_tgt_section
, 1},
1290 { "lazy_symbol_pointer2", obj_mach_o_opt_tgt_section
, 2}, /* extension. */
1291 { "lazy_symbol_pointer3", obj_mach_o_opt_tgt_section
, 3}, /* extension. */
1292 { "non_lazy_symbol_pointer", obj_mach_o_opt_tgt_section
, 4},
1293 { "non_lazy_symbol_pointer_x86", obj_mach_o_opt_tgt_section
, 5}, /* extension. */
1294 { "symbol_stub", obj_mach_o_opt_tgt_section
, 6},
1295 { "symbol_stub1", obj_mach_o_opt_tgt_section
, 7}, /* extension. */
1296 { "picsymbol_stub", obj_mach_o_opt_tgt_section
, 8}, /* extension. */
1297 { "picsymbol_stub1", obj_mach_o_opt_tgt_section
, 9}, /* extension. */
1298 { "picsymbol_stub2", obj_mach_o_opt_tgt_section
, 4}, /* extension. */
1299 { "picsymbol_stub3", obj_mach_o_opt_tgt_section
, 4}, /* extension. */
1301 { "section", obj_mach_o_section
, 0},
1302 { "zerofill", obj_mach_o_zerofill
, 0},
1304 /* Symbol qualifiers. */
1305 {"local", obj_mach_o_sym_qual
, OBJ_MACH_O_SYM_LOCAL
},
1306 {"globl", obj_mach_o_sym_qual
, OBJ_MACH_O_SYM_GLOBL
},
1307 {"reference", obj_mach_o_sym_qual
, OBJ_MACH_O_SYM_REFERENCE
},
1308 {"weak_reference", obj_mach_o_sym_qual
, OBJ_MACH_O_SYM_WEAK_REF
},
1309 {"lazy_reference", obj_mach_o_sym_qual
, OBJ_MACH_O_SYM_LAZY_REF
},
1310 {"weak_definition", obj_mach_o_sym_qual
, OBJ_MACH_O_SYM_WEAK_DEF
},
1311 {"private_extern", obj_mach_o_sym_qual
, OBJ_MACH_O_SYM_PRIV_EXT
},
1312 {"no_dead_strip", obj_mach_o_sym_qual
, OBJ_MACH_O_SYM_NO_DEAD_STRIP
},
1313 {"weak", obj_mach_o_sym_qual
, OBJ_MACH_O_SYM_WEAK
}, /* ext */
1315 { "indirect_symbol", obj_mach_o_indirect_symbol
, 0},
1318 { "subsections_via_symbols", obj_mach_o_fileprop
,
1319 OBJ_MACH_O_FILE_PROP_SUBSECTS_VIA_SYMS
},
1324 /* Determine the default n_type value for a symbol from its section. */
1327 obj_mach_o_type_for_symbol (bfd_mach_o_asymbol
*s
)
1329 if (s
->symbol
.section
== bfd_abs_section_ptr
)
1330 return BFD_MACH_O_N_ABS
;
1331 else if (s
->symbol
.section
== bfd_com_section_ptr
1332 || s
->symbol
.section
== bfd_und_section_ptr
)
1333 return BFD_MACH_O_N_UNDF
;
1335 return BFD_MACH_O_N_SECT
;
1339 obj_mach_o_frob_colon (const char *name
)
1341 if (!bfd_is_local_label_name (stdoutput
, name
))
1343 /* A non-local label will create a new subsection, so start a new
1345 frag_wane (frag_now
);
1350 /* We need to check the correspondence between some kinds of symbols and their
1351 sections. Common and BSS vars will seen via the obj_macho_comm() function.
1353 The earlier we can pick up a problem, the better the diagnostics will be.
1355 However, when symbol type information is attached, the symbol section will
1356 quite possibly be unknown. So we are stuck with checking (most of the)
1357 validity at the time the file is written (unfortunately, then one doesn't
1358 get line number information in the diagnostic). */
1360 /* Here we pick up the case where symbol qualifiers have been applied that
1361 are possibly incompatible with the section etc. that the symbol is defined
1364 void obj_mach_o_frob_label (struct symbol
*sp
)
1366 bfd_mach_o_asymbol
*s
;
1368 bfd_mach_o_section
*sec
;
1371 if (!bfd_is_local_label_name (stdoutput
, S_GET_NAME (sp
)))
1373 /* If this is a non-local label, it should have started a new sub-
1375 gas_assert (frag_now
->obj_frag_data
.subsection
== NULL
);
1376 frag_now
->obj_frag_data
.subsection
= sp
;
1379 /* Leave local symbols alone. */
1381 if (S_IS_LOCAL (sp
))
1384 s
= (bfd_mach_o_asymbol
*) symbol_get_bfdsym (sp
);
1385 /* Leave debug symbols alone. */
1386 if ((s
->n_type
& BFD_MACH_O_N_STAB
) != 0)
1389 /* This is the base symbol type, that we mask in. */
1390 base_type
= obj_mach_o_type_for_symbol (s
);
1392 sec
= bfd_mach_o_get_mach_o_section (s
->symbol
.section
);
1394 sectype
= sec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
;
1396 /* If there is a pre-existing qualifier, we can make some checks about
1399 if(s
->symbol
.udata
.i
== SYM_MACHO_FIELDS_NOT_VALIDATED
)
1401 if ((s
->n_desc
& BFD_MACH_O_N_WEAK_DEF
)
1402 && sectype
!= BFD_MACH_O_S_COALESCED
)
1404 as_bad (_("'%s' can't be a weak_definition (currently only supported"
1405 " in sections of type coalesced)"), s
->symbol
.name
);
1406 /* Don't cascade errors. */
1407 s
->symbol
.udata
.i
= SYM_MACHO_FIELDS_UNSET
;
1410 /* Have we changed from an undefined to defined ref? */
1411 s
->n_desc
&= ~(REFE
| LAZY
);
1414 s
->n_type
&= ~BFD_MACH_O_N_TYPE
;
1415 s
->n_type
|= base_type
;
1418 /* This is the fall-back, we come here when we get to the end of the file and
1419 the symbol is not defined - or there are combinations of qualifiers required
1420 (e.g. global + weak_def). */
1423 obj_mach_o_frob_symbol (struct symbol
*sp
)
1425 bfd_mach_o_asymbol
*s
;
1427 bfd_mach_o_section
*sec
;
1430 /* Leave local symbols alone. */
1431 if (S_IS_LOCAL (sp
))
1434 s
= (bfd_mach_o_asymbol
*) symbol_get_bfdsym (sp
);
1435 /* Leave debug symbols alone. */
1436 if ((s
->n_type
& BFD_MACH_O_N_STAB
) != 0)
1439 base_type
= obj_mach_o_type_for_symbol (s
);
1440 sec
= bfd_mach_o_get_mach_o_section (s
->symbol
.section
);
1442 sectype
= sec
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
;
1444 if (s
->symbol
.section
== bfd_und_section_ptr
)
1446 /* ??? Do we really gain much from implementing this as well as the
1447 mach-o specific ones? */
1448 if (s
->symbol
.flags
& BSF_WEAK
)
1449 s
->n_desc
|= BFD_MACH_O_N_WEAK_REF
;
1451 /* Undefined syms, become extern. */
1452 s
->n_type
|= BFD_MACH_O_N_EXT
;
1453 S_SET_EXTERNAL (sp
);
1455 else if (s
->symbol
.section
== bfd_com_section_ptr
)
1457 /* ... so do comm. */
1458 s
->n_type
|= BFD_MACH_O_N_EXT
;
1459 S_SET_EXTERNAL (sp
);
1463 if ((s
->symbol
.flags
& BSF_WEAK
)
1464 && (sectype
== BFD_MACH_O_S_COALESCED
)
1465 && (s
->n_type
& (BFD_MACH_O_N_PEXT
| BFD_MACH_O_N_EXT
)))
1466 s
->n_desc
|= BFD_MACH_O_N_WEAK_DEF
;
1467 /* ??? we should do this - but then that reveals that the semantics of weak
1468 are different from what's supported in mach-o object files.
1470 as_bad (_("'%s' can't be a weak_definition."),
1474 if (s
->symbol
.udata
.i
== SYM_MACHO_FIELDS_UNSET
)
1476 /* Anything here that should be added that is non-standard. */
1477 s
->n_desc
&= ~BFD_MACH_O_REFERENCE_MASK
;
1479 else if (s
->symbol
.udata
.i
== SYM_MACHO_FIELDS_NOT_VALIDATED
)
1481 /* Try to validate any combinations. */
1482 if (s
->n_desc
& BFD_MACH_O_N_WEAK_DEF
)
1484 if (s
->symbol
.section
== bfd_und_section_ptr
)
1485 as_bad (_("'%s' can't be a weak_definition (since it is"
1486 " undefined)"), s
->symbol
.name
);
1487 else if (sectype
!= BFD_MACH_O_S_COALESCED
)
1488 as_bad (_("'%s' can't be a weak_definition (currently only supported"
1489 " in sections of type coalesced)"), s
->symbol
.name
);
1490 else if (! (s
->n_type
& (BFD_MACH_O_N_PEXT
| BFD_MACH_O_N_EXT
)))
1491 as_bad (_("Non-global symbol: '%s' can't be a weak_definition."),
1497 as_bad (_("internal error: [%s] unexpected code [%lx] in frob symbol"),
1498 s
->symbol
.name
, (unsigned long)s
->symbol
.udata
.i
);
1500 s
->n_type
&= ~BFD_MACH_O_N_TYPE
;
1501 s
->n_type
|= base_type
;
1503 if (s
->symbol
.flags
& BSF_GLOBAL
)
1504 s
->n_type
|= BFD_MACH_O_N_EXT
;
1506 /* This cuts both ways - we promote some things to external above. */
1507 if (s
->n_type
& (BFD_MACH_O_N_PEXT
| BFD_MACH_O_N_EXT
))
1508 S_SET_EXTERNAL (sp
);
1513 /* Support stabs for mach-o. */
1516 obj_mach_o_process_stab (int what
, const char *string
,
1517 int type
, int other
, int desc
)
1520 bfd_mach_o_asymbol
*s
;
1525 symbolP
= symbol_new ("", now_seg
, frag_now_fix (), frag_now
);
1526 /* Special stabd NULL name indicator. */
1527 S_SET_NAME (symbolP
, NULL
);
1532 symbolP
= symbol_new (string
, undefined_section
, (valueT
) 0,
1533 &zero_address_frag
);
1534 pseudo_set (symbolP
);
1538 as_bad(_("unrecognized stab type '%c'"), (char)what
);
1543 s
= (bfd_mach_o_asymbol
*) symbol_get_bfdsym (symbolP
);
1546 /* For stabd, this will eventually get overwritten by the section number. */
1549 /* It's a debug symbol. */
1550 s
->symbol
.flags
|= BSF_DEBUGGING
;
1552 /* We've set it - so check it, if you can, but don't try to create the
1554 s
->symbol
.udata
.i
= SYM_MACHO_FIELDS_NOT_VALIDATED
;
1557 /* This is a place to check for any errors that we can't detect until we know
1558 what remains undefined at the end of assembly. */
1561 obj_mach_o_check_before_writing (bfd
*abfd ATTRIBUTE_UNUSED
,
1563 void *unused ATTRIBUTE_UNUSED
)
1566 struct frchain
*frchp
;
1567 segment_info_type
*seginfo
= seg_info (sec
);
1569 if (seginfo
== NULL
)
1572 /* We are not allowed subtractions where either of the operands is
1573 undefined. So look through the frags for any fixes to check. */
1574 for (frchp
= seginfo
->frchainP
; frchp
!= NULL
; frchp
= frchp
->frch_next
)
1575 for (fixP
= frchp
->fix_root
; fixP
!= NULL
; fixP
= fixP
->fx_next
)
1577 if (fixP
->fx_addsy
!= NULL
1578 && fixP
->fx_subsy
!= NULL
1579 && (! S_IS_DEFINED (fixP
->fx_addsy
)
1580 || ! S_IS_DEFINED (fixP
->fx_subsy
)))
1582 segT add_symbol_segment
= S_GET_SEGMENT (fixP
->fx_addsy
);
1583 segT sub_symbol_segment
= S_GET_SEGMENT (fixP
->fx_subsy
);
1585 if (! S_IS_DEFINED (fixP
->fx_addsy
)
1586 && S_IS_DEFINED (fixP
->fx_subsy
))
1588 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1589 _("`%s' can't be undefined in `%s' - `%s' {%s section}"),
1590 S_GET_NAME (fixP
->fx_addsy
), S_GET_NAME (fixP
->fx_addsy
),
1591 S_GET_NAME (fixP
->fx_subsy
), segment_name (sub_symbol_segment
));
1593 else if (! S_IS_DEFINED (fixP
->fx_subsy
)
1594 && S_IS_DEFINED (fixP
->fx_addsy
))
1596 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1597 _("`%s' can't be undefined in `%s' {%s section} - `%s'"),
1598 S_GET_NAME (fixP
->fx_subsy
), S_GET_NAME (fixP
->fx_addsy
),
1599 segment_name (add_symbol_segment
), S_GET_NAME (fixP
->fx_subsy
));
1603 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1604 _("`%s' and `%s' can't be undefined in `%s' - `%s'"),
1605 S_GET_NAME (fixP
->fx_addsy
), S_GET_NAME (fixP
->fx_subsy
),
1606 S_GET_NAME (fixP
->fx_addsy
), S_GET_NAME (fixP
->fx_subsy
));
1612 /* Do any checks that we can't complete without knowing what's undefined. */
1614 obj_mach_o_pre_output_hook (void)
1616 bfd_map_over_sections (stdoutput
, obj_mach_o_check_before_writing
, (char *) 0);
1619 /* Here we count up frags in each subsection (where a sub-section is defined
1620 as starting with a non-local symbol).
1621 Note that, if there are no non-local symbols in a section, all the frags will
1622 be attached as one anonymous subsection. */
1625 obj_mach_o_set_subsections (bfd
*abfd ATTRIBUTE_UNUSED
,
1627 void *unused ATTRIBUTE_UNUSED
)
1629 segment_info_type
*seginfo
= seg_info (sec
);
1630 symbolS
*cur_subsection
= NULL
;
1631 struct obj_mach_o_symbol_data
*cur_subsection_data
= NULL
;
1635 /* Protect against sections not created by gas. */
1636 if (seginfo
== NULL
)
1639 /* Attach every frag to a subsection. */
1640 for (chain
= seginfo
->frchainP
; chain
!= NULL
; chain
= chain
->frch_next
)
1641 for (frag
= chain
->frch_root
; frag
!= NULL
; frag
= frag
->fr_next
)
1643 if (frag
->obj_frag_data
.subsection
== NULL
)
1644 frag
->obj_frag_data
.subsection
= cur_subsection
;
1647 cur_subsection
= frag
->obj_frag_data
.subsection
;
1648 cur_subsection_data
= symbol_get_obj (cur_subsection
);
1649 cur_subsection_data
->subsection_size
= 0;
1651 if (cur_subsection_data
!= NULL
)
1653 /* Update subsection size. */
1654 cur_subsection_data
->subsection_size
+= frag
->fr_fix
;
1659 /* Handle mach-o subsections-via-symbols counting up frags belonging to each
1663 obj_mach_o_pre_relax_hook (void)
1665 bfd_map_over_sections (stdoutput
, obj_mach_o_set_subsections
, (char *) 0);
1668 /* Zerofill and GB Zerofill sections must be sorted to follow all other
1669 sections in their segments.
1671 The native 'as' leaves the sections physically in the order they appear in
1672 the source, and adjusts the section VMAs to meet the constraint.
1674 We follow this for now - if nothing else, it makes comparison easier.
1676 An alternative implementation would be to sort the sections as ld requires.
1677 It might be advantageous to implement such a scheme in the future (or even
1678 to make the style of section ordering user-selectable). */
1680 typedef struct obj_mach_o_set_vma_data
1684 unsigned zerofill_seen
;
1685 unsigned gb_zerofill_seen
;
1686 } obj_mach_o_set_vma_data
;
1688 /* We do (possibly) three passes through to set the vma, so that:
1690 zerofill sections get VMAs after all others in their segment
1691 GB zerofill get VMAs last.
1693 As we go, we notice if we see any Zerofill or GB Zerofill sections, so that
1694 we can skip the additional passes if there's nothing to do. */
1697 obj_mach_o_set_section_vma (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
, void *v_p
)
1699 bfd_mach_o_section
*ms
= bfd_mach_o_get_mach_o_section (sec
);
1700 unsigned bfd_align
= bfd_get_section_alignment (abfd
, sec
);
1701 obj_mach_o_set_vma_data
*p
= (struct obj_mach_o_set_vma_data
*)v_p
;
1702 unsigned sectype
= (ms
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
);
1706 if (sectype
== BFD_MACH_O_S_ZEROFILL
)
1709 p
->zerofill_seen
= zf
;
1711 else if (sectype
== BFD_MACH_O_S_GB_ZEROFILL
)
1714 p
->gb_zerofill_seen
= zf
;
1717 if (p
->vma_pass
!= zf
)
1720 /* We know the section size now - so make a vma for the section just
1722 ms
->size
= bfd_get_section_size (sec
);
1724 /* Make sure that the align agrees, and set to the largest value chosen. */
1725 ms
->align
= ms
->align
> bfd_align
? ms
->align
: bfd_align
;
1726 bfd_set_section_alignment (abfd
, sec
, ms
->align
);
1728 p
->vma
+= (1 << ms
->align
) - 1;
1729 p
->vma
&= ~((1 << ms
->align
) - 1);
1731 bfd_set_section_vma (abfd
, sec
, p
->vma
);
1735 /* (potentially) three passes over the sections, setting VMA. We skip the
1736 {gb}zerofill passes if we didn't see any of the relevant sections. */
1738 void obj_mach_o_post_relax_hook (void)
1740 obj_mach_o_set_vma_data d
;
1742 memset (&d
, 0, sizeof (d
));
1744 bfd_map_over_sections (stdoutput
, obj_mach_o_set_section_vma
, (char *) &d
);
1745 if ((d
.vma_pass
= d
.zerofill_seen
) != 0)
1746 bfd_map_over_sections (stdoutput
, obj_mach_o_set_section_vma
, (char *) &d
);
1747 if ((d
.vma_pass
= d
.gb_zerofill_seen
) != 0)
1748 bfd_map_over_sections (stdoutput
, obj_mach_o_set_section_vma
, (char *) &d
);
1752 obj_mach_o_set_indirect_symbols (bfd
*abfd
, asection
*sec
,
1753 void *xxx ATTRIBUTE_UNUSED
)
1755 bfd_vma sect_size
= bfd_section_size (abfd
, sec
);
1756 bfd_mach_o_section
*ms
= bfd_mach_o_get_mach_o_section (sec
);
1759 /* See if we have any indirect syms to consider. */
1760 if (indirect_syms
== NULL
)
1763 /* Process indirect symbols.
1764 Check for errors, if OK attach them as a flat array to the section
1765 for which they are defined. */
1767 switch (ms
->flags
& BFD_MACH_O_SECTION_TYPE_MASK
)
1769 case BFD_MACH_O_S_SYMBOL_STUBS
:
1770 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS
:
1773 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS
:
1775 unsigned int nactual
= 0;
1777 obj_mach_o_indirect_sym
*isym
;
1778 obj_mach_o_indirect_sym
*list
= NULL
;
1779 obj_mach_o_indirect_sym
*list_tail
= NULL
;
1780 unsigned long eltsiz
=
1781 bfd_mach_o_section_get_entry_size (abfd
, ms
);
1783 for (isym
= indirect_syms
; isym
!= NULL
; isym
= isym
->next
)
1785 if (isym
->sect
== sec
)
1791 list_tail
->next
= isym
;
1796 /* If none are in this section, stop here. */
1800 /* If we somehow added indirect symbols to a section with a zero
1801 entry size, we're dead ... */
1802 gas_assert (eltsiz
!= 0);
1804 ncalc
= (unsigned int) (sect_size
/ eltsiz
);
1805 if (nactual
!= ncalc
)
1806 as_bad (_("the number of .indirect_symbols defined in section %s"
1807 " does not match the number expected (%d defined, %d"
1808 " expected)"), sec
->name
, nactual
, ncalc
);
1812 bfd_mach_o_asymbol
*sym
;
1814 /* FIXME: It seems that there can be more indirect symbols
1815 than is computed by the loop above. So be paranoid and
1816 allocate enough space for every symbol to be indirect.
1817 See PR 21939 for an example of where this is needed. */
1818 if (nactual
< bfd_get_symcount (abfd
))
1819 nactual
= bfd_get_symcount (abfd
);
1823 nactual
* sizeof (bfd_mach_o_asymbol
*));
1825 if (ms
->indirect_syms
== NULL
)
1826 as_fatal (_("internal error: failed to allocate %d indirect"
1827 "symbol pointers"), nactual
);
1829 for (isym
= list
, n
= 0; isym
!= NULL
; isym
= isym
->next
, n
++)
1831 sym
= (bfd_mach_o_asymbol
*)symbol_get_bfdsym (isym
->sym
);
1832 /* Array is init to NULL & NULL signals a local symbol
1833 If the section is lazy-bound, we need to keep the
1834 reference to the symbol, since dyld can override.
1836 Absolute symbols are handled specially. */
1837 if (sym
->symbol
.section
== bfd_abs_section_ptr
)
1840 as_fatal (_("internal error: more indirect mach-o symbols than expected"));
1841 ms
->indirect_syms
[n
] = sym
;
1843 else if (S_IS_LOCAL (isym
->sym
) && ! lazy
)
1849 /* If the symbols is external ... */
1850 else if (S_IS_EXTERNAL (isym
->sym
)
1851 || (sym
->n_type
& BFD_MACH_O_N_EXT
)
1852 || ! S_IS_DEFINED (isym
->sym
)
1855 sym
->n_desc
&= ~LAZY
;
1856 /* ... it can be lazy, if not defined or hidden. */
1857 if ((sym
->n_type
& BFD_MACH_O_N_TYPE
)
1858 == BFD_MACH_O_N_UNDF
1859 && ! (sym
->n_type
& BFD_MACH_O_N_PEXT
)
1860 && (sym
->n_type
& BFD_MACH_O_N_EXT
))
1861 sym
->n_desc
|= lazy
;
1863 as_fatal (_("internal error: more indirect mach-o symbols than expected"));
1864 ms
->indirect_syms
[n
] = sym
;
1877 /* The process of relocation could alter what's externally visible, thus we
1878 leave setting the indirect symbols until last. */
1881 obj_mach_o_frob_file_after_relocs (void)
1883 bfd_map_over_sections (stdoutput
, obj_mach_o_set_indirect_symbols
, (char *) 0);
1886 /* Reverse relocations order to make ld happy. */
1889 obj_mach_o_reorder_section_relocs (asection
*sec
, arelent
**rels
, unsigned int n
)
1892 unsigned int max
= n
/ 2;
1894 for (i
= 0; i
< max
; i
++)
1896 arelent
*r
= rels
[i
];
1897 rels
[i
] = rels
[n
- i
- 1];
1898 rels
[n
- i
- 1] = r
;
1900 bfd_set_reloc (stdoutput
, sec
, rels
, n
);
1903 /* Relocation rules are different in frame sections. */
1906 obj_mach_o_is_frame_section (segT sec
)
1909 l
= strlen (segment_name (sec
));
1910 if ((l
== 9 && strncmp (".eh_frame", segment_name (sec
), 9) == 0)
1911 || (l
== 12 && strncmp (".debug_frame", segment_name (sec
), 12) == 0))
1916 /* Unless we're in a frame section, we need to force relocs to be generated for
1917 local subtractions. We might eliminate them later (if they are within the
1918 same sub-section) but we don't know that at the point that this decision is
1922 obj_mach_o_allow_local_subtract (expressionS
* left ATTRIBUTE_UNUSED
,
1923 expressionS
* right ATTRIBUTE_UNUSED
,
1926 /* Don't interfere if it's one of the GAS internal sections. */
1927 if (! SEG_NORMAL (seg
))
1930 /* Allow in frame sections, otherwise emit a reloc. */
1931 return obj_mach_o_is_frame_section (seg
);
1935 obj_mach_o_in_different_subsection (symbolS
*a
, symbolS
*b
)
1940 if (S_GET_SEGMENT (a
) != S_GET_SEGMENT (b
)
1941 || !S_IS_DEFINED (a
)
1942 || !S_IS_DEFINED (b
))
1944 /* Not in the same segment, or undefined symbol. */
1948 fa
= symbol_get_frag (a
);
1949 fb
= symbol_get_frag (b
);
1950 if (fa
== NULL
|| fb
== NULL
)
1952 /* One of the symbols is not in a subsection. */
1956 return fa
->obj_frag_data
.subsection
!= fb
->obj_frag_data
.subsection
;
1960 obj_mach_o_force_reloc_sub_same (fixS
*fix
, segT seg
)
1962 if (! SEG_NORMAL (seg
))
1964 return obj_mach_o_in_different_subsection (fix
->fx_addsy
, fix
->fx_subsy
);
1968 obj_mach_o_force_reloc_sub_local (fixS
*fix
, segT seg ATTRIBUTE_UNUSED
)
1970 return obj_mach_o_in_different_subsection (fix
->fx_addsy
, fix
->fx_subsy
);
1974 obj_mach_o_force_reloc (fixS
*fix
)
1976 if (generic_force_reloc (fix
))
1979 /* Force a reloc if the target is not in the same subsection.
1980 FIXME: handle (a - b) where a and b belongs to the same subsection ? */
1981 if (fix
->fx_addsy
!= NULL
)
1983 symbolS
*subsec
= fix
->fx_frag
->obj_frag_data
.subsection
;
1984 symbolS
*targ
= fix
->fx_addsy
;
1986 /* There might be no subsections at all. */
1990 if (S_GET_SEGMENT (targ
) == absolute_section
)
1993 return obj_mach_o_in_different_subsection (targ
, subsec
);