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