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