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