1
/* Mach-O object file format
2
Copyright 2009, 2011, 2012 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 facilites
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 overides are acually 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 overide 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
size_t seglen = strlen (segname);
210
size_t sectlen = strlen (sectname);
213
n = xmalloc (seglen + 1 + sectlen + 1);
214
memcpy (n, segname, seglen);
216
memcpy (n + seglen + 1, sectname, sectlen);
217
n[seglen + 1 + sectlen] = 0;
219
if (specified_mask & SECT_TYPE_SPECIFIED)
222
sectype = BFD_MACH_O_S_REGULAR;
223
secattr = BFD_MACH_O_S_ATTR_NONE;
225
flags = SEC_NO_FLAGS;
228
/* For now, just use what the user provided. */
230
if (specified_mask & SECT_ATTR_SPECIFIED)
233
if (specified_mask & SECT_ALGN_SPECIFIED)
236
/* Sub-segments don't exists as is on Mach-O. */
237
sec = subseg_new (name, 0);
239
oldflags = bfd_get_section_flags (stdoutput, sec);
240
msect = bfd_mach_o_get_mach_o_section (sec);
242
if (oldflags == SEC_NO_FLAGS)
244
/* In the absence of canonical information, try to determine CODE and
245
DEBUG section flags from the mach-o section data. */
246
if (flags == SEC_NO_FLAGS
247
&& (specified_mask & SECT_ATTR_SPECIFIED)
248
&& (secattr & BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS))
251
if (flags == SEC_NO_FLAGS
252
&& (specified_mask & SECT_ATTR_SPECIFIED)
253
&& (secattr & BFD_MACH_O_S_ATTR_DEBUG))
254
flags |= SEC_DEBUGGING;
256
/* New, so just use the defaults or what's specified. */
257
if (! bfd_set_section_flags (stdoutput, sec, flags))
258
as_warn (_("failed to set flags for \"%s\": %s"),
259
bfd_section_name (stdoutput, sec),
260
bfd_errmsg (bfd_get_error ()));
262
strncpy (msect->segname, segname, sizeof (msect->segname));
263
strncpy (msect->sectname, sectname, sizeof (msect->sectname));
265
msect->align = secalign;
266
msect->flags = sectype | secattr;
268
if (sectype == BFD_MACH_O_S_ZEROFILL
269
|| sectype == BFD_MACH_O_S_GB_ZEROFILL)
270
seg_info (sec)->bss = 1;
272
else if (flags != SEC_NO_FLAGS)
274
if (flags != oldflags
275
|| msect->flags != (secattr | sectype))
276
as_warn (_("Ignoring changed section attributes for %s"), name);
279
if (specified_mask & SECT_STUB_SPECIFIED)
280
/* At present, the stub size is not supplied from the BFD tables. */
281
msect->reserved2 = stub_size;
288
The '.section' specification syntax looks like:
289
.section <segment> , <section> [, type [, attribs [, size]]]
291
White space is allowed everywhere between elements.
293
<segment> and <section> may be from 0 to 16 chars in length - they may
294
contain spaces but leading and trailing space will be trimmed. It is
295
mandatory that they be present (or that zero-length names are indicated
298
There is only a single section type for any entry.
300
There may be multiple attributes, they are delimited by `+'.
302
Not all section types and attributes are accepted by the Darwin system
303
assemblers as user-specifiable - although, at present, we do here. */
306
obj_mach_o_section (int ignore ATTRIBUTE_UNUSED)
308
unsigned int sectype = BFD_MACH_O_S_REGULAR;
309
unsigned int specified_mask = 0;
310
unsigned int secattr = 0;
311
offsetT sizeof_stub = 0;
316
#ifdef md_flush_pending_output
317
md_flush_pending_output ();
320
/* Get the User's segment annd section names. */
321
if (! obj_mach_o_get_section_names (segname, sectname, 17, 17))
324
/* Parse section type, if present. */
325
if (*input_line_pointer == ',')
331
input_line_pointer++;
333
p = input_line_pointer;
334
while ((c = *input_line_pointer) != ','
335
&& !is_end_of_line[(unsigned char) c])
336
input_line_pointer++;
338
len = input_line_pointer - p;
339
/* strip trailing spaces. */
340
while (len > 0 && p[len-1] == ' ')
344
/* Temporarily make a string from the token. */
346
sectype = bfd_mach_o_get_section_type_from_name (stdoutput, p);
347
if (sectype > 255) /* Max Section ID == 255. */
349
as_bad (_("unknown or invalid section type '%s'"), p);
351
ignore_rest_of_line ();
355
specified_mask |= SECT_TYPE_SPECIFIED;
360
TODO: check validity of attributes for section type. */
361
if ((specified_mask & SECT_TYPE_SPECIFIED)
368
/* Skip initial `,' and subsequent `+'. */
369
input_line_pointer++;
371
p = input_line_pointer;
372
while ((c = *input_line_pointer) != '+'
374
&& !is_end_of_line[(unsigned char) c])
375
input_line_pointer++;
377
len = input_line_pointer - p;
378
/* strip trailing spaces. */
379
while (len > 0 && p[len-1] == ' ')
383
/* Temporarily make a string from the token. */
385
attr = bfd_mach_o_get_section_attribute_from_name (p);
388
as_bad (_("unknown or invalid section attribute '%s'"), p);
390
ignore_rest_of_line ();
395
specified_mask |= SECT_ATTR_SPECIFIED;
401
while (*input_line_pointer == '+');
403
/* Parse sizeof_stub. */
404
if ((specified_mask & SECT_ATTR_SPECIFIED)
405
&& *input_line_pointer == ',')
407
if (sectype != BFD_MACH_O_S_SYMBOL_STUBS)
409
as_bad (_("unexpected section size information"));
410
ignore_rest_of_line ();
414
input_line_pointer++;
415
sizeof_stub = get_absolute_expression ();
416
specified_mask |= SECT_STUB_SPECIFIED;
418
else if ((specified_mask & SECT_ATTR_SPECIFIED)
419
&& sectype == BFD_MACH_O_S_SYMBOL_STUBS)
421
as_bad (_("missing sizeof_stub expression"));
422
ignore_rest_of_line ();
428
new_seg = obj_mach_o_make_or_get_sect (segname, sectname, specified_mask,
429
sectype, secattr, 0 /*align */,
433
subseg_set (new_seg, 0);
434
demand_empty_rest_of_line ();
438
/* .zerofill segname, sectname [, symbolname, size [, align]]
440
Zerofill switches, temporarily, to a sect of type 'zerofill'.
442
If a variable name is given, it defines that in the section.
443
Otherwise it just creates the section if it doesn't exist. */
446
obj_mach_o_zerofill (int ignore ATTRIBUTE_UNUSED)
450
segT old_seg = now_seg;
453
unsigned int align = 0;
454
unsigned int specified_mask = 0;
457
#ifdef md_flush_pending_output
458
md_flush_pending_output ();
461
/* Get the User's segment annd section names. */
462
if (! obj_mach_o_get_section_names (segname, sectname, 17, 17))
465
/* Parse variable definition, if present. */
466
if (*input_line_pointer == ',')
468
/* Parse symbol, size [.align]
469
We follow the method of s_common_internal, with the difference
470
that the symbol cannot be a duplicate-common. */
476
input_line_pointer++; /* Skip ',' */
478
name = input_line_pointer;
479
c = get_symbol_end ();
480
/* Just after name is now '\0'. */
481
p = input_line_pointer;
486
as_bad (_("expected symbol name"));
487
ignore_rest_of_line ();
492
if (*input_line_pointer == ',')
493
input_line_pointer++;
495
expression_and_evaluate (&exp);
496
if (exp.X_op != O_constant
497
&& exp.X_op != O_absent)
499
as_bad (_("bad or irreducible absolute expression"));
500
ignore_rest_of_line ();
503
else if (exp.X_op == O_absent)
505
as_bad (_("missing size expression"));
506
ignore_rest_of_line ();
510
size = exp.X_add_number;
511
size &= ((offsetT) 2 << (stdoutput->arch_info->bits_per_address - 1)) - 1;
512
if (exp.X_add_number != size || !exp.X_unsigned)
514
as_warn (_("size (%ld) out of range, ignored"),
515
(long) exp.X_add_number);
516
ignore_rest_of_line ();
520
*p = 0; /* Make the name into a c string for err messages. */
521
sym = symbol_find_or_make (name);
522
if (S_IS_DEFINED (sym) || symbol_equated_p (sym))
524
as_bad (_("symbol `%s' is already defined"), name);
526
ignore_rest_of_line ();
530
size = S_GET_VALUE (sym);
532
size = exp.X_add_number;
533
else if (size != exp.X_add_number)
534
as_warn (_("size of \"%s\" is already %ld; not changing to %ld"),
535
name, (long) size, (long) exp.X_add_number);
537
*p = c; /* Restore the termination char. */
540
if (*input_line_pointer == ',')
542
align = (unsigned int) parse_align (0);
543
if (align == (unsigned int) -1)
545
as_warn (_("align value not recognized, using size"));
550
as_warn (_("Alignment (%lu) too large: 15 assumed."),
551
(unsigned long)align);
554
specified_mask |= SECT_ALGN_SPECIFIED;
557
/* else just a section definition. */
559
specified_mask |= SECT_TYPE_SPECIFIED;
560
new_seg = obj_mach_o_make_or_get_sect (segname, sectname, specified_mask,
561
BFD_MACH_O_S_ZEROFILL,
562
BFD_MACH_O_S_ATTR_NONE,
563
align, (offsetT) 0 /*stub size*/);
567
/* In case the user specifies the bss section by mach-o name.
568
Create it on demand */
569
if (strcmp (new_seg->name, BSS_SECTION_NAME) == 0
570
&& bss_section == NULL)
571
bss_section = new_seg;
573
subseg_set (new_seg, 0);
581
record_alignment (new_seg, align);
582
frag_align (align, 0, 0);
585
/* Detach from old frag. */
586
if (S_GET_SEGMENT (sym) == new_seg)
587
symbol_get_frag (sym)->fr_symbol = NULL;
589
symbol_set_frag (sym, frag_now);
590
pfrag = frag_var (rs_org, 1, 1, 0, sym, size, NULL);
593
S_SET_SEGMENT (sym, new_seg);
594
if (new_seg == bss_section)
595
S_CLEAR_EXTERNAL (sym);
599
/* switch back to the section that was current before the .zerofill. */
600
subseg_set (old_seg, 0);
604
obj_mach_o_segT_from_bfd_name (const char *nam, int must_succeed)
606
const mach_o_section_name_xlat *xlat;
610
/* BFD has tables of flags and default attributes for all the sections that
611
have a 'canonical' name. */
612
xlat = bfd_mach_o_section_data_for_bfd_name (stdoutput, nam, &segn);
616
as_fatal (_("BFD is out of sync with GAS, "
617
"unhandled well-known section type `%s'"), nam);
621
sec = bfd_get_section_by_name (stdoutput, nam);
624
bfd_mach_o_section *msect;
626
sec = subseg_force_new (xlat->bfd_name, 0);
628
/* Set default type, attributes and alignment. */
629
msect = bfd_mach_o_get_mach_o_section (sec);
630
msect->flags = xlat->macho_sectype | xlat->macho_secattr;
631
msect->align = xlat->sectalign;
633
if ((msect->flags & BFD_MACH_O_SECTION_TYPE_MASK)
634
== BFD_MACH_O_S_ZEROFILL)
635
seg_info (sec)->bss = 1;
641
static const char * const known_sections[] =
646
/* 2 */ ".static_const",
650
/* 6 */ ".literal16",
651
/* 7 */ ".constructor",
652
/* 8 */ ".destructor",
655
/* 10 */ ".const_data",
656
/* 11 */ ".static_data",
657
/* 12 */ ".mod_init_func",
658
/* 13 */ ".mod_term_func",
663
/* Interface for a known non-optional section directive. */
666
obj_mach_o_known_section (int sect_index)
670
#ifdef md_flush_pending_output
671
md_flush_pending_output ();
674
section = obj_mach_o_segT_from_bfd_name (known_sections[sect_index], 1);
676
subseg_set (section, 0);
678
/* else, we leave the section as it was; there was a fatal error anyway. */
681
static const char * const objc_sections[] =
684
/* 1 */ ".objc_class",
685
/* 2 */ ".objc_meta_class",
686
/* 3 */ ".objc_cat_cls_meth",
687
/* 4 */ ".objc_cat_inst_meth",
688
/* 5 */ ".objc_protocol",
689
/* 6 */ ".objc_string_object",
690
/* 7 */ ".objc_cls_meth",
691
/* 8 */ ".objc_inst_meth",
692
/* 9 */ ".objc_cls_refs",
693
/* 10 */ ".objc_message_refs",
694
/* 11 */ ".objc_symbols",
695
/* 12 */ ".objc_category",
696
/* 13 */ ".objc_class_vars",
697
/* 14 */ ".objc_instance_vars",
698
/* 15 */ ".objc_module_info",
699
/* 16 */ ".cstring", /* objc_class_names Alias for .cstring */
700
/* 17 */ ".cstring", /* Alias objc_meth_var_types for .cstring */
701
/* 18 */ ".cstring", /* objc_meth_var_names Alias for .cstring */
702
/* 19 */ ".objc_selector_strs",
703
/* 20 */ ".objc_image_info", /* extension. */
704
/* 21 */ ".objc_selector_fixup", /* extension. */
705
/* 22 */ ".objc1_class_ext", /* ObjC-1 extension. */
706
/* 23 */ ".objc1_property_list", /* ObjC-1 extension. */
707
/* 24 */ ".objc1_protocol_ext" /* ObjC-1 extension. */
710
/* This currently does the same as known_sections, but kept separate for
711
ease of maintenance. */
714
obj_mach_o_objc_section (int sect_index)
718
#ifdef md_flush_pending_output
719
md_flush_pending_output ();
722
section = obj_mach_o_segT_from_bfd_name (objc_sections[sect_index], 1);
725
obj_mach_o_seen_objc_section = 1; /* We need to ensure that certain
726
sections are present and in the
728
subseg_set (section, 0);
731
/* else, we leave the section as it was; there was a fatal error anyway. */
734
/* Debug section directives. */
736
static const char * const debug_sections[] =
740
/* 1 */ ".debug_frame",
741
/* 2 */ ".debug_info",
742
/* 3 */ ".debug_abbrev",
743
/* 4 */ ".debug_aranges",
744
/* 5 */ ".debug_macinfo",
745
/* 6 */ ".debug_line",
746
/* 7 */ ".debug_loc",
747
/* 8 */ ".debug_pubnames",
748
/* 9 */ ".debug_pubtypes",
749
/* 10 */ ".debug_str",
750
/* 11 */ ".debug_ranges",
751
/* 12 */ ".debug_macro"
754
/* ??? Maybe these should be conditional on gdwarf-*.
755
It`s also likely that we will need to be able to set them from the cfi
759
obj_mach_o_debug_section (int sect_index)
763
#ifdef md_flush_pending_output
764
md_flush_pending_output ();
767
section = obj_mach_o_segT_from_bfd_name (debug_sections[sect_index], 1);
769
subseg_set (section, 0);
771
/* else, we leave the section as it was; there was a fatal error anyway. */
774
/* This could be moved to the tc-xx files, but there is so little dependency
775
there, that the code might as well be shared. */
784
/* The extensions here are for specific sections that are generated by GCC
785
and Darwin system tools, but don't have directives in the `system as'. */
787
static const struct opt_tgt_sect tgt_sections[] =
789
/* 0 */ { NULL, 0, 0},
790
/* 1 */ { ".lazy_symbol_pointer", 0, 0},
791
/* 2 */ { ".lazy_symbol_pointer2", 0, 0}, /* X86 - extension */
792
/* 3 */ { ".lazy_symbol_pointer3", 0, 0}, /* X86 - extension */
793
/* 4 */ { ".non_lazy_symbol_pointer", 0, 0},
794
/* 5 */ { ".non_lazy_symbol_pointer_x86", 0, 0}, /* X86 - extension */
795
/* 6 */ { ".symbol_stub", 16, 20},
796
/* 7 */ { ".symbol_stub1", 0, 16}, /* PPC - extension */
797
/* 8 */ { ".picsymbol_stub", 26, 36},
798
/* 9 */ { ".picsymbol_stub1", 0, 32}, /* PPC - extension */
799
/* 10 */ { ".picsymbol_stub2", 25, 0}, /* X86 - extension */
800
/* 11 */ { ".picsymbol_stub3", 5, 0}, /* X86 - extension */
803
/* Interface for an optional section directive. */
806
obj_mach_o_opt_tgt_section (int sect_index)
808
const struct opt_tgt_sect *tgtsct = &tgt_sections[sect_index];
811
#ifdef md_flush_pending_output
812
md_flush_pending_output ();
815
section = obj_mach_o_segT_from_bfd_name (tgtsct->name, 0);
818
as_bad (_("%s is not used for the selected target"), tgtsct->name);
819
/* Leave the section as it is. */
823
bfd_mach_o_section *mo_sec = bfd_mach_o_get_mach_o_section (section);
824
subseg_set (section, 0);
825
#if defined (TC_I386)
826
mo_sec->reserved2 = tgtsct->x86_val;
827
#elif defined (TC_PPC)
828
mo_sec->reserved2 = tgtsct->ppc_val;
830
mo_sec->reserved2 = 0;
835
/* We don't necessarily have the three 'base' sections on mach-o.
836
Normally, we would start up with only the 'text' section defined.
837
However, even that can be suppressed with (TODO) c/l option "-n".
838
Thus, we have to be able to create all three sections on-demand. */
841
obj_mach_o_base_section (int sect_index)
845
#ifdef md_flush_pending_output
846
md_flush_pending_output ();
849
/* We don't support numeric (or any other) qualifications on the
850
well-known section shorthands. */
851
demand_empty_rest_of_line ();
855
/* Handle the three sections that are globally known within GAS.
856
For Mach-O, these are created on demand rather than at startup. */
858
if (text_section == NULL)
859
text_section = obj_mach_o_segT_from_bfd_name (TEXT_SECTION_NAME, 1);
860
if (obj_mach_o_is_static)
862
bfd_mach_o_section *mo_sec
863
= bfd_mach_o_get_mach_o_section (text_section);
864
mo_sec->flags &= ~BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS;
866
section = text_section;
869
if (data_section == NULL)
870
data_section = obj_mach_o_segT_from_bfd_name (DATA_SECTION_NAME, 1);
871
section = data_section;
874
/* ??? maybe this achieves very little, as an addition. */
875
if (bss_section == NULL)
877
bss_section = obj_mach_o_segT_from_bfd_name (BSS_SECTION_NAME, 1);
878
seg_info (bss_section)->bss = 1;
880
section = bss_section;
883
as_fatal (_("internal error: base section index out of range"));
887
subseg_set (section, 0);
890
/* This finishes off parsing a .comm or .lcomm statement, which both can have
891
an (optional) alignment field. It also allows us to create the bss section
895
obj_mach_o_common_parse (int is_local, symbolS *symbolP,
899
bfd_mach_o_asymbol *s;
903
/* Both comm and lcomm take an optional alignment, as a power
904
of two between 1 and 15. */
905
if (*input_line_pointer == ',')
907
/* We expect a power of 2. */
908
align = parse_align (0);
909
if (align == (addressT) -1)
913
as_warn (_("Alignment (%lu) too large: 15 assumed."),
914
(unsigned long)align);
919
s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (symbolP);
922
/* Create the BSS section on demand. */
923
if (bss_section == NULL)
925
bss_section = obj_mach_o_segT_from_bfd_name (BSS_SECTION_NAME, 1);
926
seg_info (bss_section)->bss = 1;
928
bss_alloc (symbolP, size, align);
929
s->n_type = BFD_MACH_O_N_SECT;
930
S_CLEAR_EXTERNAL (symbolP);
934
S_SET_VALUE (symbolP, size);
935
S_SET_ALIGN (symbolP, align);
936
S_SET_EXTERNAL (symbolP);
937
S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
938
s->n_type = BFD_MACH_O_N_UNDF | BFD_MACH_O_N_EXT;
941
/* This is a data object (whatever we choose that to mean). */
942
s->symbol.flags |= BSF_OBJECT;
944
/* We've set symbol qualifiers, so validate if you can. */
945
s->symbol.udata.i = SYM_MACHO_FIELDS_NOT_VALIDATED;
951
obj_mach_o_comm (int is_local)
953
s_comm_internal (is_local, obj_mach_o_common_parse);
956
/* Set properties that apply to the whole file. At present, the only
957
one defined, is subsections_via_symbols. */
959
typedef enum obj_mach_o_file_properties {
960
OBJ_MACH_O_FILE_PROP_NONE = 0,
961
OBJ_MACH_O_FILE_PROP_SUBSECTS_VIA_SYMS,
962
OBJ_MACH_O_FILE_PROP_MAX
963
} obj_mach_o_file_properties;
966
obj_mach_o_fileprop (int prop)
968
if (prop < 0 || prop >= OBJ_MACH_O_FILE_PROP_MAX)
969
as_fatal (_("internal error: bad file property ID %d"), prop);
971
switch ((obj_mach_o_file_properties) prop)
973
case OBJ_MACH_O_FILE_PROP_SUBSECTS_VIA_SYMS:
974
obj_mach_o_subsections_by_symbols = 1;
975
if (!bfd_set_private_flags (stdoutput,
976
BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS))
977
as_bad (_("failed to set subsections by symbols"));
978
demand_empty_rest_of_line ();
985
/* Temporary markers for symbol reference data.
986
Lazy will remain in place. */
990
/* We have a bunch of qualifiers that may be applied to symbols.
991
.globl is handled here so that we might make sure that conflicting qualifiers
992
are caught where possible. */
994
typedef enum obj_mach_o_symbol_type {
995
OBJ_MACH_O_SYM_UNK = 0,
996
OBJ_MACH_O_SYM_LOCAL = 1,
997
OBJ_MACH_O_SYM_GLOBL = 2,
998
OBJ_MACH_O_SYM_REFERENCE = 3,
999
OBJ_MACH_O_SYM_WEAK_REF = 4,
1000
OBJ_MACH_O_SYM_LAZY_REF = 5,
1001
OBJ_MACH_O_SYM_WEAK_DEF = 6,
1002
OBJ_MACH_O_SYM_PRIV_EXT = 7,
1003
OBJ_MACH_O_SYM_NO_DEAD_STRIP = 8,
1004
OBJ_MACH_O_SYM_WEAK = 9
1005
} obj_mach_o_symbol_type;
1007
/* Set Mach-O-specific symbol qualifiers. */
1010
obj_mach_o_set_symbol_qualifier (symbolS *sym, int type)
1013
bfd_mach_o_asymbol *s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (sym);
1014
bfd_mach_o_section *sec;
1018
/* If the symbol is defined, then we can do more rigorous checking on
1019
the validity of the qualifiers. Otherwise, we are stuck with waiting
1020
until it's defined - or until write the file.
1022
In certain cases (e.g. when a symbol qualifier is intended to introduce
1023
an undefined symbol in a stubs section) we should check that the current
1024
section is appropriate to the qualifier. */
1026
is_defined = s->symbol.section != bfd_und_section_ptr;
1028
sec = bfd_mach_o_get_mach_o_section (s->symbol.section) ;
1030
sec = bfd_mach_o_get_mach_o_section (now_seg) ;
1033
sectype = sec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
1035
switch ((obj_mach_o_symbol_type) type)
1037
case OBJ_MACH_O_SYM_LOCAL:
1038
/* This is an extension over the system tools. */
1039
if (s->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT))
1041
as_bad (_("'%s' previously declared as '%s'."), s->symbol.name,
1042
(s->n_type & BFD_MACH_O_N_PEXT) ? "private extern"
1048
s->n_type &= ~BFD_MACH_O_N_EXT;
1049
S_CLEAR_EXTERNAL (sym);
1053
case OBJ_MACH_O_SYM_PRIV_EXT:
1054
s->n_type |= BFD_MACH_O_N_PEXT ;
1055
s->n_desc &= ~LAZY; /* The native tool switches this off too. */
1056
/* We follow the system tools in marking PEXT as also global. */
1059
case OBJ_MACH_O_SYM_GLOBL:
1060
/* It's not an error to define a symbol and then make it global. */
1061
s->n_type |= BFD_MACH_O_N_EXT;
1062
S_SET_EXTERNAL (sym);
1065
case OBJ_MACH_O_SYM_REFERENCE:
1067
s->n_desc |= BFD_MACH_O_N_NO_DEAD_STRIP;
1069
s->n_desc |= (REFE | BFD_MACH_O_N_NO_DEAD_STRIP);
1072
case OBJ_MACH_O_SYM_LAZY_REF:
1074
s->n_desc |= BFD_MACH_O_N_NO_DEAD_STRIP;
1076
s->n_desc |= (REFE | LAZY | BFD_MACH_O_N_NO_DEAD_STRIP);
1079
/* Force ld to retain the symbol - even if it appears unused. */
1080
case OBJ_MACH_O_SYM_NO_DEAD_STRIP:
1081
s->n_desc |= BFD_MACH_O_N_NO_DEAD_STRIP ;
1084
/* Mach-O's idea of weak ... */
1085
case OBJ_MACH_O_SYM_WEAK_REF:
1086
s->n_desc |= BFD_MACH_O_N_WEAK_REF ;
1089
case OBJ_MACH_O_SYM_WEAK_DEF:
1090
if (is_defined && sectype != BFD_MACH_O_S_COALESCED)
1092
as_bad (_("'%s' can't be a weak_definition (currently only"
1093
" supported in sections of type coalesced)"),
1098
s->n_desc |= BFD_MACH_O_N_WEAK_DEF;
1101
case OBJ_MACH_O_SYM_WEAK:
1102
/* A generic 'weak' - we try to figure out what it means at
1103
symbol frob time. */
1111
/* We've seen some kind of qualifier - check validity if or when the entity
1113
s->symbol.udata.i = SYM_MACHO_FIELDS_NOT_VALIDATED;
1117
/* Respond to symbol qualifiers.
1119
.<qualifier> symbol [, symbol]*
1120
a list of symbols is an extension over the Darwin system as. */
1123
obj_mach_o_sym_qual (int ntype)
1129
#ifdef md_flush_pending_output
1130
md_flush_pending_output ();
1135
name = input_line_pointer;
1136
c = get_symbol_end ();
1137
symbolP = symbol_find_or_make (name);
1138
obj_mach_o_set_symbol_qualifier (symbolP, ntype);
1139
*input_line_pointer = c;
1141
c = *input_line_pointer;
1144
input_line_pointer++;
1146
if (is_end_of_line[(unsigned char) *input_line_pointer])
1152
demand_empty_rest_of_line ();
1155
typedef struct obj_mach_o_indirect_sym
1159
struct obj_mach_o_indirect_sym *next;
1160
} obj_mach_o_indirect_sym;
1162
/* We store in order an maintain a pointer to the last one - to save reversing
1164
obj_mach_o_indirect_sym *indirect_syms;
1165
obj_mach_o_indirect_sym *indirect_syms_tail;
1168
obj_mach_o_indirect_symbol (int arg ATTRIBUTE_UNUSED)
1170
bfd_mach_o_section *sec = bfd_mach_o_get_mach_o_section (now_seg);
1172
#ifdef md_flush_pending_output
1173
md_flush_pending_output ();
1176
if (obj_mach_o_is_static)
1177
as_bad (_("use of .indirect_symbols requires `-dynamic'"));
1179
switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
1181
case BFD_MACH_O_S_SYMBOL_STUBS:
1182
case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
1183
case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
1185
obj_mach_o_indirect_sym *isym;
1186
char *name = input_line_pointer;
1187
char c = get_symbol_end ();
1188
symbolS *sym = symbol_find_or_make (name);
1189
unsigned int elsize =
1190
bfd_mach_o_section_get_entry_size (stdoutput, sec);
1194
as_bad (_("attempt to add an indirect_symbol to a stub or"
1195
" reference section with a zero-sized element at %s"),
1197
*input_line_pointer = c;
1198
ignore_rest_of_line ();
1201
*input_line_pointer = c;
1203
/* The indirect symbols are validated after the symbol table is
1204
frozen, we must make sure that if a local symbol is used as an
1205
indirect, it is promoted to a 'real' one. Fetching the bfd sym
1207
symbol_get_bfdsym (sym);
1208
isym = (obj_mach_o_indirect_sym *)
1209
xmalloc (sizeof (obj_mach_o_indirect_sym));
1211
/* Just record the data for now, we will validate it when we
1212
compute the output in obj_mach_o_set_indirect_symbols. */
1214
isym->sect = now_seg;
1216
if (indirect_syms == NULL)
1217
indirect_syms = isym;
1219
indirect_syms_tail->next = isym;
1220
indirect_syms_tail = isym;
1225
as_bad (_("an .indirect_symbol must be in a symbol pointer"
1226
" or stub section."));
1227
ignore_rest_of_line ();
1230
demand_empty_rest_of_line ();
1233
const pseudo_typeS mach_o_pseudo_table[] =
1235
/* Section directives. */
1236
{ "comm", obj_mach_o_comm, 0 },
1237
{ "lcomm", obj_mach_o_comm, 1 },
1239
{ "text", obj_mach_o_base_section, 1},
1240
{ "data", obj_mach_o_base_section, 2},
1241
{ "bss", obj_mach_o_base_section, 3}, /* extension */
1243
{ "const", obj_mach_o_known_section, 1},
1244
{ "static_const", obj_mach_o_known_section, 2},
1245
{ "cstring", obj_mach_o_known_section, 3},
1246
{ "literal4", obj_mach_o_known_section, 4},
1247
{ "literal8", obj_mach_o_known_section, 5},
1248
{ "literal16", obj_mach_o_known_section, 6},
1249
{ "constructor", obj_mach_o_known_section, 7},
1250
{ "destructor", obj_mach_o_known_section, 8},
1251
{ "eh_frame", obj_mach_o_known_section, 9},
1253
{ "const_data", obj_mach_o_known_section, 10},
1254
{ "static_data", obj_mach_o_known_section, 11},
1255
{ "mod_init_func", obj_mach_o_known_section, 12},
1256
{ "mod_term_func", obj_mach_o_known_section, 13},
1257
{ "dyld", obj_mach_o_known_section, 14},
1258
{ "cfstring", obj_mach_o_known_section, 15},
1260
{ "objc_class", obj_mach_o_objc_section, 1},
1261
{ "objc_meta_class", obj_mach_o_objc_section, 2},
1262
{ "objc_cat_cls_meth", obj_mach_o_objc_section, 3},
1263
{ "objc_cat_inst_meth", obj_mach_o_objc_section, 4},
1264
{ "objc_protocol", obj_mach_o_objc_section, 5},
1265
{ "objc_string_object", obj_mach_o_objc_section, 6},
1266
{ "objc_cls_meth", obj_mach_o_objc_section, 7},
1267
{ "objc_inst_meth", obj_mach_o_objc_section, 8},
1268
{ "objc_cls_refs", obj_mach_o_objc_section, 9},
1269
{ "objc_message_refs", obj_mach_o_objc_section, 10},
1270
{ "objc_symbols", obj_mach_o_objc_section, 11},
1271
{ "objc_category", obj_mach_o_objc_section, 12},
1272
{ "objc_class_vars", obj_mach_o_objc_section, 13},
1273
{ "objc_instance_vars", obj_mach_o_objc_section, 14},
1274
{ "objc_module_info", obj_mach_o_objc_section, 15},
1275
{ "objc_class_names", obj_mach_o_objc_section, 16}, /* Alias for .cstring */
1276
{ "objc_meth_var_types", obj_mach_o_objc_section, 17}, /* Alias for .cstring */
1277
{ "objc_meth_var_names", obj_mach_o_objc_section, 18}, /* Alias for .cstring */
1278
{ "objc_selector_strs", obj_mach_o_objc_section, 19},
1279
{ "objc_image_info", obj_mach_o_objc_section, 20}, /* extension. */
1280
{ "objc_selector_fixup", obj_mach_o_objc_section, 21}, /* extension. */
1281
{ "objc1_class_ext", obj_mach_o_objc_section, 22}, /* ObjC-1 extension. */
1282
{ "objc1_property_list", obj_mach_o_objc_section, 23}, /* ObjC-1 extension. */
1283
{ "objc1_protocol_ext", obj_mach_o_objc_section, 24}, /* ObjC-1 extension. */
1285
{ "debug_frame", obj_mach_o_debug_section, 1}, /* extension. */
1286
{ "debug_info", obj_mach_o_debug_section, 2}, /* extension. */
1287
{ "debug_abbrev", obj_mach_o_debug_section, 3}, /* extension. */
1288
{ "debug_aranges", obj_mach_o_debug_section, 4}, /* extension. */
1289
{ "debug_macinfo", obj_mach_o_debug_section, 5}, /* extension. */
1290
{ "debug_line", obj_mach_o_debug_section, 6}, /* extension. */
1291
{ "debug_loc", obj_mach_o_debug_section, 7}, /* extension. */
1292
{ "debug_pubnames", obj_mach_o_debug_section, 8}, /* extension. */
1293
{ "debug_pubtypes", obj_mach_o_debug_section, 9}, /* extension. */
1294
{ "debug_str", obj_mach_o_debug_section, 10}, /* extension. */
1295
{ "debug_ranges", obj_mach_o_debug_section, 11}, /* extension. */
1296
{ "debug_macro", obj_mach_o_debug_section, 12}, /* extension. */
1298
{ "lazy_symbol_pointer", obj_mach_o_opt_tgt_section, 1},
1299
{ "lazy_symbol_pointer2", obj_mach_o_opt_tgt_section, 2}, /* extension. */
1300
{ "lazy_symbol_pointer3", obj_mach_o_opt_tgt_section, 3}, /* extension. */
1301
{ "non_lazy_symbol_pointer", obj_mach_o_opt_tgt_section, 4},
1302
{ "non_lazy_symbol_pointer_x86", obj_mach_o_opt_tgt_section, 5}, /* extension. */
1303
{ "symbol_stub", obj_mach_o_opt_tgt_section, 6},
1304
{ "symbol_stub1", obj_mach_o_opt_tgt_section, 7}, /* extension. */
1305
{ "picsymbol_stub", obj_mach_o_opt_tgt_section, 8}, /* extension. */
1306
{ "picsymbol_stub1", obj_mach_o_opt_tgt_section, 9}, /* extension. */
1307
{ "picsymbol_stub2", obj_mach_o_opt_tgt_section, 4}, /* extension. */
1308
{ "picsymbol_stub3", obj_mach_o_opt_tgt_section, 4}, /* extension. */
1310
{ "section", obj_mach_o_section, 0},
1311
{ "zerofill", obj_mach_o_zerofill, 0},
1313
/* Symbol qualifiers. */
1314
{"local", obj_mach_o_sym_qual, OBJ_MACH_O_SYM_LOCAL},
1315
{"globl", obj_mach_o_sym_qual, OBJ_MACH_O_SYM_GLOBL},
1316
{"reference", obj_mach_o_sym_qual, OBJ_MACH_O_SYM_REFERENCE},
1317
{"weak_reference", obj_mach_o_sym_qual, OBJ_MACH_O_SYM_WEAK_REF},
1318
{"lazy_reference", obj_mach_o_sym_qual, OBJ_MACH_O_SYM_LAZY_REF},
1319
{"weak_definition", obj_mach_o_sym_qual, OBJ_MACH_O_SYM_WEAK_DEF},
1320
{"private_extern", obj_mach_o_sym_qual, OBJ_MACH_O_SYM_PRIV_EXT},
1321
{"no_dead_strip", obj_mach_o_sym_qual, OBJ_MACH_O_SYM_NO_DEAD_STRIP},
1322
{"weak", obj_mach_o_sym_qual, OBJ_MACH_O_SYM_WEAK}, /* ext */
1324
{ "indirect_symbol", obj_mach_o_indirect_symbol, 0},
1327
{ "subsections_via_symbols", obj_mach_o_fileprop,
1328
OBJ_MACH_O_FILE_PROP_SUBSECTS_VIA_SYMS},
1333
/* Determine the default n_type value for a symbol from its section. */
1336
obj_mach_o_type_for_symbol (bfd_mach_o_asymbol *s)
1338
if (s->symbol.section == bfd_abs_section_ptr)
1339
return BFD_MACH_O_N_ABS;
1340
else if (s->symbol.section == bfd_com_section_ptr
1341
|| s->symbol.section == bfd_und_section_ptr)
1342
return BFD_MACH_O_N_UNDF;
1344
return BFD_MACH_O_N_SECT;
1348
obj_mach_o_frob_colon (const char *name)
1350
if (!bfd_is_local_label_name (stdoutput, name))
1352
/* A non-local label will create a new subsection, so start a new
1354
frag_wane (frag_now);
1359
/* We need to check the correspondence between some kinds of symbols and their
1360
sections. Common and BSS vars will seen via the obj_macho_comm() function.
1362
The earlier we can pick up a problem, the better the diagnostics will be.
1364
However, when symbol type information is attached, the symbol section will
1365
quite possibly be unknown. So we are stuck with checking (most of the)
1366
validity at the time the file is written (unfortunately, then one doesn't
1367
get line number information in the diagnostic). */
1369
/* Here we pick up the case where symbol qualifiers have been applied that
1370
are possibly incompatible with the section etc. that the symbol is defined
1373
void obj_mach_o_frob_label (struct symbol *sp)
1375
bfd_mach_o_asymbol *s;
1377
bfd_mach_o_section *sec;
1380
if (!bfd_is_local_label_name (stdoutput, S_GET_NAME (sp)))
1382
/* If this is a non-local label, it should have started a new sub-
1384
gas_assert (frag_now->obj_frag_data.subsection == NULL);
1385
frag_now->obj_frag_data.subsection = sp;
1388
/* Leave local symbols alone. */
1390
if (S_IS_LOCAL (sp))
1393
s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (sp);
1394
/* Leave debug symbols alone. */
1395
if ((s->n_type & BFD_MACH_O_N_STAB) != 0)
1398
/* This is the base symbol type, that we mask in. */
1399
base_type = obj_mach_o_type_for_symbol (s);
1401
sec = bfd_mach_o_get_mach_o_section (s->symbol.section);
1403
sectype = sec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
1405
/* If there is a pre-existing qualifier, we can make some checks about
1408
if(s->symbol.udata.i == SYM_MACHO_FIELDS_NOT_VALIDATED)
1410
if ((s->n_desc & BFD_MACH_O_N_WEAK_DEF)
1411
&& sectype != BFD_MACH_O_S_COALESCED)
1412
as_bad (_("'%s' can't be a weak_definition (currently only supported"
1413
" in sections of type coalesced)"), s->symbol.name);
1415
/* Have we changed from an undefined to defined ref? */
1416
s->n_desc &= ~(REFE | LAZY);
1419
s->n_type &= ~BFD_MACH_O_N_TYPE;
1420
s->n_type |= base_type;
1423
/* This is the fall-back, we come here when we get to the end of the file and
1424
the symbol is not defined - or there are combinations of qualifiers required
1425
(e.g. global + weak_def). */
1428
obj_mach_o_frob_symbol (struct symbol *sp)
1430
bfd_mach_o_asymbol *s;
1432
bfd_mach_o_section *sec;
1435
/* Leave local symbols alone. */
1436
if (S_IS_LOCAL (sp))
1439
s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (sp);
1440
/* Leave debug symbols alone. */
1441
if ((s->n_type & BFD_MACH_O_N_STAB) != 0)
1444
base_type = obj_mach_o_type_for_symbol (s);
1445
sec = bfd_mach_o_get_mach_o_section (s->symbol.section);
1447
sectype = sec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
1449
if (s->symbol.section == bfd_und_section_ptr)
1451
/* ??? Do we really gain much from implementing this as well as the
1452
mach-o specific ones? */
1453
if (s->symbol.flags & BSF_WEAK)
1454
s->n_desc |= BFD_MACH_O_N_WEAK_REF;
1456
/* Undefined syms, become extern. */
1457
s->n_type |= BFD_MACH_O_N_EXT;
1458
S_SET_EXTERNAL (sp);
1460
else if (s->symbol.section == bfd_com_section_ptr)
1462
/* ... so do comm. */
1463
s->n_type |= BFD_MACH_O_N_EXT;
1464
S_SET_EXTERNAL (sp);
1468
if ((s->symbol.flags & BSF_WEAK)
1469
&& (sectype == BFD_MACH_O_S_COALESCED)
1470
&& (s->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT)))
1471
s->n_desc |= BFD_MACH_O_N_WEAK_DEF;
1472
/* ??? we should do this - but then that reveals that the semantics of weak
1473
are different from what's supported in mach-o object files.
1475
as_bad (_("'%s' can't be a weak_definition."),
1479
if (s->symbol.udata.i == SYM_MACHO_FIELDS_UNSET)
1481
/* Anything here that should be added that is non-standard. */
1482
s->n_desc &= ~BFD_MACH_O_REFERENCE_MASK;
1483
s->symbol.udata.i = SYM_MACHO_FIELDS_NOT_VALIDATED;
1485
else if (s->symbol.udata.i == SYM_MACHO_FIELDS_NOT_VALIDATED)
1487
/* Try to validate any combinations. */
1488
if (s->n_desc & BFD_MACH_O_N_WEAK_DEF)
1490
if (s->symbol.section == bfd_und_section_ptr)
1491
as_bad (_("'%s' can't be a weak_definition (since it is"
1492
" undefined)"), s->symbol.name);
1493
else if (sectype != BFD_MACH_O_S_COALESCED)
1494
as_bad (_("'%s' can't be a weak_definition (currently only supported"
1495
" in sections of type coalesced)"), s->symbol.name);
1496
else if (! (s->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT)))
1497
as_bad (_("Non-global symbol: '%s' can't be a weak_definition."),
1503
as_bad (_("internal error: [%s] unexpected code [%lx] in frob symbol"),
1504
s->symbol.name, (unsigned long)s->symbol.udata.i);
1506
s->n_type &= ~BFD_MACH_O_N_TYPE;
1507
s->n_type |= base_type;
1509
if (s->symbol.flags & BSF_GLOBAL)
1510
s->n_type |= BFD_MACH_O_N_EXT;
1512
/* This cuts both ways - we promote some things to external above. */
1513
if (s->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT))
1514
S_SET_EXTERNAL (sp);
1519
/* Support stabs for mach-o. */
1522
obj_mach_o_process_stab (int what, const char *string,
1523
int type, int other, int desc)
1526
bfd_mach_o_asymbol *s;
1531
symbolP = symbol_new ("", now_seg, frag_now_fix (), frag_now);
1532
/* Special stabd NULL name indicator. */
1533
S_SET_NAME (symbolP, NULL);
1538
symbolP = symbol_new (string, undefined_section, (valueT) 0,
1539
&zero_address_frag);
1540
pseudo_set (symbolP);
1544
as_bad(_("unrecognized stab type '%c'"), (char)what);
1549
s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (symbolP);
1552
/* For stabd, this will eventually get overwritten by the section number. */
1555
/* It's a debug symbol. */
1556
s->symbol.flags |= BSF_DEBUGGING;
1558
/* We've set it - so check it, if you can, but don't try to create the
1560
s->symbol.udata.i = SYM_MACHO_FIELDS_NOT_VALIDATED;
1563
/* This is a place to check for any errors that we can't detect until we know
1564
what remains undefined at the end of assembly. */
1567
obj_mach_o_check_before_writing (bfd *abfd ATTRIBUTE_UNUSED,
1569
void *unused ATTRIBUTE_UNUSED)
1572
struct frchain *frchp;
1573
segment_info_type *seginfo = seg_info (sec);
1575
if (seginfo == NULL)
1578
/* We are not allowed subtractions where either of the operands is
1579
undefined. So look through the frags for any fixes to check. */
1580
for (frchp = seginfo->frchainP; frchp != NULL; frchp = frchp->frch_next)
1581
for (fixP = frchp->fix_root; fixP != NULL; fixP = fixP->fx_next)
1583
if (fixP->fx_addsy != NULL
1584
&& fixP->fx_subsy != NULL
1585
&& (! S_IS_DEFINED (fixP->fx_addsy)
1586
|| ! S_IS_DEFINED (fixP->fx_subsy)))
1588
segT add_symbol_segment = S_GET_SEGMENT (fixP->fx_addsy);
1589
segT sub_symbol_segment = S_GET_SEGMENT (fixP->fx_subsy);
1591
if (! S_IS_DEFINED (fixP->fx_addsy)
1592
&& S_IS_DEFINED (fixP->fx_subsy))
1594
as_bad_where (fixP->fx_file, fixP->fx_line,
1595
_("`%s' can't be undefined in `%s' - `%s' {%s section}"),
1596
S_GET_NAME (fixP->fx_addsy), S_GET_NAME (fixP->fx_addsy),
1597
S_GET_NAME (fixP->fx_subsy), segment_name (sub_symbol_segment));
1599
else if (! S_IS_DEFINED (fixP->fx_subsy)
1600
&& S_IS_DEFINED (fixP->fx_addsy))
1602
as_bad_where (fixP->fx_file, fixP->fx_line,
1603
_("`%s' can't be undefined in `%s' {%s section} - `%s'"),
1604
S_GET_NAME (fixP->fx_subsy), S_GET_NAME (fixP->fx_addsy),
1605
segment_name (add_symbol_segment), S_GET_NAME (fixP->fx_subsy));
1609
as_bad_where (fixP->fx_file, fixP->fx_line,
1610
_("`%s' and `%s' can't be undefined in `%s' - `%s'"),
1611
S_GET_NAME (fixP->fx_addsy), S_GET_NAME (fixP->fx_subsy),
1612
S_GET_NAME (fixP->fx_addsy), S_GET_NAME (fixP->fx_subsy));
1618
/* Do any checks that we can't complete without knowing what's undefined. */
1620
obj_mach_o_pre_output_hook (void)
1622
bfd_map_over_sections (stdoutput, obj_mach_o_check_before_writing, (char *) 0);
1625
/* Here we count up frags in each subsection (where a sub-section is defined
1626
as starting with a non-local symbol).
1627
Note that, if there are no non-local symbols in a section, all the frags will
1628
be attached as one anonymous subsection. */
1631
obj_mach_o_set_subsections (bfd *abfd ATTRIBUTE_UNUSED,
1633
void *unused ATTRIBUTE_UNUSED)
1635
segment_info_type *seginfo = seg_info (sec);
1636
symbolS *cur_subsection = NULL;
1637
struct obj_mach_o_symbol_data *cur_subsection_data = NULL;
1641
/* Protect against sections not created by gas. */
1642
if (seginfo == NULL)
1645
/* Attach every frag to a subsection. */
1646
for (chain = seginfo->frchainP; chain != NULL; chain = chain->frch_next)
1647
for (frag = chain->frch_root; frag != NULL; frag = frag->fr_next)
1649
if (frag->obj_frag_data.subsection == NULL)
1650
frag->obj_frag_data.subsection = cur_subsection;
1653
cur_subsection = frag->obj_frag_data.subsection;
1654
cur_subsection_data = symbol_get_obj (cur_subsection);
1655
cur_subsection_data->subsection_size = 0;
1657
if (cur_subsection_data != NULL)
1659
/* Update subsection size. */
1660
cur_subsection_data->subsection_size += frag->fr_fix;
1665
/* Handle mach-o subsections-via-symbols counting up frags belonging to each
1669
obj_mach_o_pre_relax_hook (void)
1671
bfd_map_over_sections (stdoutput, obj_mach_o_set_subsections, (char *) 0);
1674
/* Zerofill and GB Zerofill sections must be sorted to follow all other
1675
sections in their segments.
1677
The native 'as' leaves the sections physically in the order they appear in
1678
the source, and adjusts the section VMAs to meet the constraint.
1680
We follow this for now - if nothing else, it makes comparison easier.
1682
An alternative implementation would be to sort the sections as ld requires.
1683
It might be advantageous to implement such a scheme in the future (or even
1684
to make the style of section ordering user-selectable). */
1686
typedef struct obj_mach_o_set_vma_data
1690
unsigned zerofill_seen;
1691
unsigned gb_zerofill_seen;
1692
} obj_mach_o_set_vma_data;
1694
/* We do (possibly) three passes through to set the vma, so that:
1696
zerofill sections get VMAs after all others in their segment
1697
GB zerofill get VMAs last.
1699
As we go, we notice if we see any Zerofill or GB Zerofill sections, so that
1700
we can skip the additional passes if there's nothing to do. */
1703
obj_mach_o_set_section_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *v_p)
1705
bfd_mach_o_section *ms = bfd_mach_o_get_mach_o_section (sec);
1706
unsigned bfd_align = bfd_get_section_alignment (abfd, sec);
1707
obj_mach_o_set_vma_data *p = (struct obj_mach_o_set_vma_data *)v_p;
1708
unsigned sectype = (ms->flags & BFD_MACH_O_SECTION_TYPE_MASK);
1712
if (sectype == BFD_MACH_O_S_ZEROFILL)
1715
p->zerofill_seen = zf;
1717
else if (sectype == BFD_MACH_O_S_GB_ZEROFILL)
1720
p->gb_zerofill_seen = zf;
1723
if (p->vma_pass != zf)
1726
/* We know the section size now - so make a vma for the section just
1728
ms->size = bfd_get_section_size (sec);
1730
/* Make sure that the align agrees, and set to the largest value chosen. */
1731
ms->align = ms->align > bfd_align ? ms->align : bfd_align;
1732
bfd_set_section_alignment (abfd, sec, ms->align);
1734
p->vma += (1 << ms->align) - 1;
1735
p->vma &= ~((1 << ms->align) - 1);
1737
bfd_set_section_vma (abfd, sec, p->vma);
1741
/* (potentially) three passes over the sections, setting VMA. We skip the
1742
{gb}zerofill passes if we didn't see any of the relevant sections. */
1744
void obj_mach_o_post_relax_hook (void)
1746
obj_mach_o_set_vma_data d;
1748
memset (&d, 0, sizeof (d));
1750
bfd_map_over_sections (stdoutput, obj_mach_o_set_section_vma, (char *) &d);
1751
if ((d.vma_pass = d.zerofill_seen) != 0)
1752
bfd_map_over_sections (stdoutput, obj_mach_o_set_section_vma, (char *) &d);
1753
if ((d.vma_pass = d.gb_zerofill_seen) != 0)
1754
bfd_map_over_sections (stdoutput, obj_mach_o_set_section_vma, (char *) &d);
1758
obj_mach_o_set_indirect_symbols (bfd *abfd, asection *sec,
1759
void *xxx ATTRIBUTE_UNUSED)
1761
bfd_vma sect_size = bfd_section_size (abfd, sec);
1762
bfd_mach_o_section *ms = bfd_mach_o_get_mach_o_section (sec);
1765
/* See if we have any indirect syms to consider. */
1766
if (indirect_syms == NULL)
1769
/* Process indirect symbols.
1770
Check for errors, if OK attach them as a flat array to the section
1771
for which they are defined. */
1773
switch (ms->flags & BFD_MACH_O_SECTION_TYPE_MASK)
1775
case BFD_MACH_O_S_SYMBOL_STUBS:
1776
case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
1779
case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
1781
unsigned int nactual = 0;
1783
obj_mach_o_indirect_sym *isym;
1784
obj_mach_o_indirect_sym *list = NULL;
1785
obj_mach_o_indirect_sym *list_tail = NULL;
1786
unsigned long eltsiz =
1787
bfd_mach_o_section_get_entry_size (abfd, ms);
1789
for (isym = indirect_syms; isym != NULL; isym = isym->next)
1791
if (isym->sect == sec)
1797
list_tail->next = isym;
1802
/* If none are in this section, stop here. */
1806
/* If we somehow added indirect symbols to a section with a zero
1807
entry size, we're dead ... */
1808
gas_assert (eltsiz != 0);
1810
ncalc = (unsigned int) (sect_size / eltsiz);
1811
if (nactual != ncalc)
1812
as_bad (_("the number of .indirect_symbols defined in section %s"
1813
" does not match the number expected (%d defined, %d"
1814
" expected)"), sec->name, nactual, ncalc);
1818
bfd_mach_o_asymbol *sym;
1821
nactual * sizeof (bfd_mach_o_asymbol *));
1823
if (ms->indirect_syms == NULL)
1825
as_fatal (_("internal error: failed to allocate %d indirect"
1826
"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)
1838
ms->indirect_syms[n] = sym;
1839
else if (S_IS_LOCAL (isym->sym) && ! lazy)
1845
/* If the symbols is external ... */
1846
else if (S_IS_EXTERNAL (isym->sym)
1847
|| (sym->n_type & BFD_MACH_O_N_EXT)
1848
|| ! S_IS_DEFINED (isym->sym)
1851
sym->n_desc &= ~LAZY;
1852
/* ... it can be lazy, if not defined or hidden. */
1853
if ((sym->n_type & BFD_MACH_O_N_TYPE)
1854
== BFD_MACH_O_N_UNDF
1855
&& ! (sym->n_type & BFD_MACH_O_N_PEXT)
1856
&& (sym->n_type & BFD_MACH_O_N_EXT))
1857
sym->n_desc |= lazy;
1858
ms->indirect_syms[n] = sym;
1871
/* The process of relocation could alter what's externally visible, thus we
1872
leave setting the indirect symbols until last. */
1875
obj_mach_o_frob_file_after_relocs (void)
1877
bfd_map_over_sections (stdoutput, obj_mach_o_set_indirect_symbols, (char *) 0);
1880
/* Reverse relocations order to make ld happy. */
1883
obj_mach_o_reorder_section_relocs (asection *sec, arelent **rels, unsigned int n)
1886
unsigned int max = n / 2;
1888
for (i = 0; i < max; i++)
1890
arelent *r = rels[i];
1891
rels[i] = rels[n - i - 1];
1892
rels[n - i - 1] = r;
1894
bfd_set_reloc (stdoutput, sec, rels, n);
1897
/* Relocation rules are different in frame sections. */
1900
obj_mach_o_is_frame_section (segT sec)
1903
l = strlen (segment_name (sec));
1904
if ((l == 9 && strncmp (".eh_frame", segment_name (sec), 9) == 0)
1905
|| (l == 12 && strncmp (".debug_frame", segment_name (sec), 12) == 0))
1910
/* Unless we're in a frame section, we need to force relocs to be generated for
1911
local subtractions. We might eliminate them later (if they are within the
1912
same sub-section) but we don't know that at the point that this decision is
1916
obj_mach_o_allow_local_subtract (expressionS * left ATTRIBUTE_UNUSED,
1917
expressionS * right ATTRIBUTE_UNUSED,
1920
/* Don't interfere if it's one of the GAS internal sections. */
1921
if (! SEG_NORMAL (seg))
1924
/* Allow in frame sections, otherwise emit a reloc. */
1925
return obj_mach_o_is_frame_section (seg);
1929
obj_mach_o_in_different_subsection (symbolS *a, symbolS *b)
1934
if (S_GET_SEGMENT (a) != S_GET_SEGMENT (b)
1935
|| !S_IS_DEFINED (a)
1936
|| !S_IS_DEFINED (b))
1938
/* Not in the same segment, or undefined symbol. */
1942
fa = symbol_get_frag (a);
1943
fb = symbol_get_frag (b);
1944
if (fa == NULL || fb == NULL)
1946
/* One of the symbols is not in a subsection. */
1950
return fa->obj_frag_data.subsection != fb->obj_frag_data.subsection;
1954
obj_mach_o_force_reloc_sub_same (fixS *fix, segT seg)
1956
if (! SEG_NORMAL (seg))
1958
return obj_mach_o_in_different_subsection (fix->fx_addsy, fix->fx_subsy);
1962
obj_mach_o_force_reloc_sub_local (fixS *fix, segT seg ATTRIBUTE_UNUSED)
1964
return obj_mach_o_in_different_subsection (fix->fx_addsy, fix->fx_subsy);
1968
obj_mach_o_force_reloc (fixS *fix)
1970
if (generic_force_reloc (fix))
1973
/* Force a reloc if the target is not in the same subsection.
1974
FIXME: handle (a - b) where a and b belongs to the same subsection ? */
1975
if (fix->fx_addsy != NULL)
1977
symbolS *subsec = fix->fx_frag->obj_frag_data.subsection;
1978
symbolS *targ = fix->fx_addsy;
1980
/* There might be no subsections at all. */
1984
if (S_GET_SEGMENT (targ) == absolute_section)
1987
return obj_mach_o_in_different_subsection (targ, subsec);