GAS: Add ECOFF `.aent' pseudo-op support
[deliverable/binutils-gdb.git] / gas / config / obj-elf.c
1 /* ELF object file format
2 Copyright (C) 1992-2017 Free Software Foundation, Inc.
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
21 #define OBJ_HEADER "obj-elf.h"
22 #include "as.h"
23 #include "safe-ctype.h"
24 #include "subsegs.h"
25 #include "obstack.h"
26 #include "struc-symbol.h"
27 #include "dwarf2dbg.h"
28
29 #ifndef ECOFF_DEBUGGING
30 #define ECOFF_DEBUGGING 0
31 #else
32 #define NEED_ECOFF_DEBUG
33 #endif
34
35 #ifdef NEED_ECOFF_DEBUG
36 #include "ecoff.h"
37 #endif
38
39 #ifdef TC_ALPHA
40 #include "elf/alpha.h"
41 #endif
42
43 #ifdef TC_MIPS
44 #include "elf/mips.h"
45 #endif
46
47 #ifdef TC_PPC
48 #include "elf/ppc.h"
49 #endif
50
51 #ifdef TC_I370
52 #include "elf/i370.h"
53 #endif
54
55 #ifdef TC_I386
56 #include "elf/x86-64.h"
57 #endif
58
59 #ifdef TC_MEP
60 #include "elf/mep.h"
61 #endif
62
63 #ifdef TC_NIOS2
64 #include "elf/nios2.h"
65 #endif
66
67 #ifdef TC_PRU
68 #include "elf/pru.h"
69 #endif
70
71 static void obj_elf_line (int);
72 static void obj_elf_size (int);
73 static void obj_elf_type (int);
74 static void obj_elf_ident (int);
75 static void obj_elf_weak (int);
76 static void obj_elf_local (int);
77 static void obj_elf_visibility (int);
78 static void obj_elf_symver (int);
79 static void obj_elf_subsection (int);
80 static void obj_elf_popsection (int);
81 static void obj_elf_gnu_attribute (int);
82 static void obj_elf_tls_common (int);
83 static void obj_elf_lcomm (int);
84 static void obj_elf_struct (int);
85
86 static const pseudo_typeS elf_pseudo_table[] =
87 {
88 {"comm", obj_elf_common, 0},
89 {"common", obj_elf_common, 1},
90 {"ident", obj_elf_ident, 0},
91 {"lcomm", obj_elf_lcomm, 0},
92 {"local", obj_elf_local, 0},
93 {"previous", obj_elf_previous, 0},
94 {"section", obj_elf_section, 0},
95 {"section.s", obj_elf_section, 0},
96 {"sect", obj_elf_section, 0},
97 {"sect.s", obj_elf_section, 0},
98 {"pushsection", obj_elf_section, 1},
99 {"popsection", obj_elf_popsection, 0},
100 {"size", obj_elf_size, 0},
101 {"type", obj_elf_type, 0},
102 {"version", obj_elf_version, 0},
103 {"weak", obj_elf_weak, 0},
104
105 /* These define symbol visibility. */
106 {"internal", obj_elf_visibility, STV_INTERNAL},
107 {"hidden", obj_elf_visibility, STV_HIDDEN},
108 {"protected", obj_elf_visibility, STV_PROTECTED},
109
110 /* These are used for stabs-in-elf configurations. */
111 {"line", obj_elf_line, 0},
112
113 /* This is a GNU extension to handle symbol versions. */
114 {"symver", obj_elf_symver, 0},
115
116 /* A GNU extension to change subsection only. */
117 {"subsection", obj_elf_subsection, 0},
118
119 /* These are GNU extensions to aid in garbage collecting C++ vtables. */
120 {"vtable_inherit", (void (*) (int)) &obj_elf_vtable_inherit, 0},
121 {"vtable_entry", (void (*) (int)) &obj_elf_vtable_entry, 0},
122
123 /* A GNU extension for object attributes. */
124 {"gnu_attribute", obj_elf_gnu_attribute, 0},
125
126 /* These are used for dwarf. */
127 {"2byte", cons, 2},
128 {"4byte", cons, 4},
129 {"8byte", cons, 8},
130 /* These are used for dwarf2. */
131 { "file", (void (*) (int)) dwarf2_directive_file, 0 },
132 { "loc", dwarf2_directive_loc, 0 },
133 { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
134
135 /* We need to trap the section changing calls to handle .previous. */
136 {"data", obj_elf_data, 0},
137 {"offset", obj_elf_struct, 0},
138 {"struct", obj_elf_struct, 0},
139 {"text", obj_elf_text, 0},
140
141 {"tls_common", obj_elf_tls_common, 0},
142
143 /* End sentinel. */
144 {NULL, NULL, 0},
145 };
146
147 static const pseudo_typeS ecoff_debug_pseudo_table[] =
148 {
149 #ifdef NEED_ECOFF_DEBUG
150 /* COFF style debugging information for ECOFF. .ln is not used; .loc
151 is used instead. */
152 { "def", ecoff_directive_def, 0 },
153 { "dim", ecoff_directive_dim, 0 },
154 { "endef", ecoff_directive_endef, 0 },
155 { "file", ecoff_directive_file, 0 },
156 { "scl", ecoff_directive_scl, 0 },
157 { "tag", ecoff_directive_tag, 0 },
158 { "val", ecoff_directive_val, 0 },
159
160 /* COFF debugging requires pseudo-ops .size and .type, but ELF
161 already has meanings for those. We use .esize and .etype
162 instead. These are only generated by gcc anyhow. */
163 { "esize", ecoff_directive_size, 0 },
164 { "etype", ecoff_directive_type, 0 },
165
166 /* ECOFF specific debugging information. */
167 { "aent", ecoff_directive_ent, 1 },
168 { "begin", ecoff_directive_begin, 0 },
169 { "bend", ecoff_directive_bend, 0 },
170 { "end", ecoff_directive_end, 0 },
171 { "ent", ecoff_directive_ent, 0 },
172 { "fmask", ecoff_directive_fmask, 0 },
173 { "frame", ecoff_directive_frame, 0 },
174 { "loc", ecoff_directive_loc, 0 },
175 { "mask", ecoff_directive_mask, 0 },
176
177 /* Other ECOFF directives. */
178 { "extern", ecoff_directive_extern, 0 },
179
180 /* These are used on Irix. I don't know how to implement them. */
181 { "alias", s_ignore, 0 },
182 { "bgnb", s_ignore, 0 },
183 { "endb", s_ignore, 0 },
184 { "lab", s_ignore, 0 },
185 { "noalias", s_ignore, 0 },
186 { "verstamp", s_ignore, 0 },
187 { "vreg", s_ignore, 0 },
188 #endif
189
190 {NULL, NULL, 0} /* end sentinel */
191 };
192
193 #undef NO_RELOC
194 #include "aout/aout64.h"
195
196 /* This is called when the assembler starts. */
197
198 asection *elf_com_section_ptr;
199
200 void
201 elf_begin (void)
202 {
203 asection *s;
204
205 /* Add symbols for the known sections to the symbol table. */
206 s = bfd_get_section_by_name (stdoutput, TEXT_SECTION_NAME);
207 symbol_table_insert (section_symbol (s));
208 s = bfd_get_section_by_name (stdoutput, DATA_SECTION_NAME);
209 symbol_table_insert (section_symbol (s));
210 s = bfd_get_section_by_name (stdoutput, BSS_SECTION_NAME);
211 symbol_table_insert (section_symbol (s));
212 elf_com_section_ptr = bfd_com_section_ptr;
213 }
214
215 void
216 elf_pop_insert (void)
217 {
218 pop_insert (elf_pseudo_table);
219 if (ECOFF_DEBUGGING)
220 pop_insert (ecoff_debug_pseudo_table);
221 }
222
223 static bfd_vma
224 elf_s_get_size (symbolS *sym)
225 {
226 return S_GET_SIZE (sym);
227 }
228
229 static void
230 elf_s_set_size (symbolS *sym, bfd_vma sz)
231 {
232 S_SET_SIZE (sym, sz);
233 }
234
235 static bfd_vma
236 elf_s_get_align (symbolS *sym)
237 {
238 return S_GET_ALIGN (sym);
239 }
240
241 static void
242 elf_s_set_align (symbolS *sym, bfd_vma align)
243 {
244 S_SET_ALIGN (sym, align);
245 }
246
247 int
248 elf_s_get_other (symbolS *sym)
249 {
250 return elf_symbol (symbol_get_bfdsym (sym))->internal_elf_sym.st_other;
251 }
252
253 static void
254 elf_s_set_other (symbolS *sym, int other)
255 {
256 S_SET_OTHER (sym, other);
257 }
258
259 static int
260 elf_sec_sym_ok_for_reloc (asection *sec)
261 {
262 return obj_sec_sym_ok_for_reloc (sec);
263 }
264
265 void
266 elf_file_symbol (const char *s, int appfile)
267 {
268 if (!appfile
269 || symbol_rootP == NULL
270 || symbol_rootP->bsym == NULL
271 || (symbol_rootP->bsym->flags & BSF_FILE) == 0)
272 {
273 symbolS *sym;
274 size_t name_length;
275
276 sym = symbol_new (s, absolute_section, 0, NULL);
277 symbol_set_frag (sym, &zero_address_frag);
278
279 name_length = strlen (s);
280 if (name_length > strlen (S_GET_NAME (sym)))
281 {
282 obstack_grow (&notes, s, name_length + 1);
283 S_SET_NAME (sym, (const char *) obstack_finish (&notes));
284 }
285 else
286 strcpy ((char *) S_GET_NAME (sym), s);
287
288 symbol_get_bfdsym (sym)->flags |= BSF_FILE;
289
290 if (symbol_rootP != sym
291 && (symbol_rootP->bsym == NULL
292 || !(symbol_rootP->bsym->flags & BSF_FILE)))
293 {
294 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
295 symbol_insert (sym, symbol_rootP, &symbol_rootP, &symbol_lastP);
296 }
297
298 #ifdef DEBUG
299 verify_symbol_chain (symbol_rootP, symbol_lastP);
300 #endif
301 }
302
303 #ifdef NEED_ECOFF_DEBUG
304 ecoff_new_file (s, appfile);
305 #endif
306 }
307
308 /* Called from read.c:s_comm after we've parsed .comm symbol, size.
309 Parse a possible alignment value. */
310
311 symbolS *
312 elf_common_parse (int ignore ATTRIBUTE_UNUSED, symbolS *symbolP, addressT size)
313 {
314 addressT align = 0;
315 int is_local = symbol_get_obj (symbolP)->local;
316
317 if (*input_line_pointer == ',')
318 {
319 char *save = input_line_pointer;
320
321 input_line_pointer++;
322 SKIP_WHITESPACE ();
323
324 if (*input_line_pointer == '"')
325 {
326 /* For sparc. Accept .common symbol, length, "bss" */
327 input_line_pointer++;
328 /* Some use the dot, some don't. */
329 if (*input_line_pointer == '.')
330 input_line_pointer++;
331 /* Some say data, some say bss. */
332 if (strncmp (input_line_pointer, "bss\"", 4) == 0)
333 input_line_pointer += 4;
334 else if (strncmp (input_line_pointer, "data\"", 5) == 0)
335 input_line_pointer += 5;
336 else
337 {
338 char *p = input_line_pointer;
339 char c;
340
341 while (*--p != '"')
342 ;
343 while (!is_end_of_line[(unsigned char) *input_line_pointer])
344 if (*input_line_pointer++ == '"')
345 break;
346 c = *input_line_pointer;
347 *input_line_pointer = '\0';
348 as_bad (_("bad .common segment %s"), p);
349 *input_line_pointer = c;
350 ignore_rest_of_line ();
351 return NULL;
352 }
353 /* ??? Don't ask me why these are always global. */
354 is_local = 0;
355 }
356 else
357 {
358 input_line_pointer = save;
359 align = parse_align (is_local);
360 if (align == (addressT) -1)
361 return NULL;
362 }
363 }
364
365 if (is_local)
366 {
367 bss_alloc (symbolP, size, align);
368 S_CLEAR_EXTERNAL (symbolP);
369 }
370 else
371 {
372 S_SET_VALUE (symbolP, size);
373 S_SET_ALIGN (symbolP, align);
374 S_SET_EXTERNAL (symbolP);
375 S_SET_SEGMENT (symbolP, elf_com_section_ptr);
376 }
377
378 symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
379
380 return symbolP;
381 }
382
383 void
384 obj_elf_common (int is_common)
385 {
386 if (flag_mri && is_common)
387 s_mri_common (0);
388 else
389 s_comm_internal (0, elf_common_parse);
390 }
391
392 static void
393 obj_elf_tls_common (int ignore ATTRIBUTE_UNUSED)
394 {
395 symbolS *symbolP = s_comm_internal (0, elf_common_parse);
396
397 if (symbolP)
398 symbol_get_bfdsym (symbolP)->flags |= BSF_THREAD_LOCAL;
399 }
400
401 static void
402 obj_elf_lcomm (int ignore ATTRIBUTE_UNUSED)
403 {
404 symbolS *symbolP = s_comm_internal (0, s_lcomm_internal);
405
406 if (symbolP)
407 symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
408 }
409
410 static symbolS *
411 get_sym_from_input_line_and_check (void)
412 {
413 char *name;
414 char c;
415 symbolS *sym;
416
417 c = get_symbol_name (& name);
418 sym = symbol_find_or_make (name);
419 *input_line_pointer = c;
420 SKIP_WHITESPACE_AFTER_NAME ();
421
422 /* There is no symbol name if input_line_pointer has not moved. */
423 if (name == input_line_pointer)
424 as_bad (_("Missing symbol name in directive"));
425 return sym;
426 }
427
428 static void
429 obj_elf_local (int ignore ATTRIBUTE_UNUSED)
430 {
431 int c;
432 symbolS *symbolP;
433
434 do
435 {
436 symbolP = get_sym_from_input_line_and_check ();
437 c = *input_line_pointer;
438 S_CLEAR_EXTERNAL (symbolP);
439 symbol_get_obj (symbolP)->local = 1;
440 if (c == ',')
441 {
442 input_line_pointer++;
443 SKIP_WHITESPACE ();
444 if (*input_line_pointer == '\n')
445 c = '\n';
446 }
447 }
448 while (c == ',');
449 demand_empty_rest_of_line ();
450 }
451
452 static void
453 obj_elf_weak (int ignore ATTRIBUTE_UNUSED)
454 {
455 int c;
456 symbolS *symbolP;
457
458 do
459 {
460 symbolP = get_sym_from_input_line_and_check ();
461 c = *input_line_pointer;
462 S_SET_WEAK (symbolP);
463 if (c == ',')
464 {
465 input_line_pointer++;
466 SKIP_WHITESPACE ();
467 if (*input_line_pointer == '\n')
468 c = '\n';
469 }
470 }
471 while (c == ',');
472 demand_empty_rest_of_line ();
473 }
474
475 static void
476 obj_elf_visibility (int visibility)
477 {
478 int c;
479 symbolS *symbolP;
480 asymbol *bfdsym;
481 elf_symbol_type *elfsym;
482
483 do
484 {
485 symbolP = get_sym_from_input_line_and_check ();
486
487 bfdsym = symbol_get_bfdsym (symbolP);
488 elfsym = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym);
489
490 gas_assert (elfsym);
491
492 elfsym->internal_elf_sym.st_other &= ~3;
493 elfsym->internal_elf_sym.st_other |= visibility;
494
495 c = *input_line_pointer;
496 if (c == ',')
497 {
498 input_line_pointer ++;
499
500 SKIP_WHITESPACE ();
501
502 if (*input_line_pointer == '\n')
503 c = '\n';
504 }
505 }
506 while (c == ',');
507
508 demand_empty_rest_of_line ();
509 }
510
511 static segT previous_section;
512 static int previous_subsection;
513
514 struct section_stack
515 {
516 struct section_stack *next;
517 segT seg, prev_seg;
518 int subseg, prev_subseg;
519 };
520
521 static struct section_stack *section_stack;
522
523 static bfd_boolean
524 get_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
525 {
526 const char *gname = (const char *) inf;
527 const char *group_name = elf_group_name (sec);
528
529 return (group_name == gname
530 || (group_name != NULL
531 && gname != NULL
532 && strcmp (group_name, gname) == 0));
533 }
534
535 /* Handle the .section pseudo-op. This code supports two different
536 syntaxes.
537
538 The first is found on Solaris, and looks like
539 .section ".sec1",#alloc,#execinstr,#write
540 Here the names after '#' are the SHF_* flags to turn on for the
541 section. I'm not sure how it determines the SHT_* type (BFD
542 doesn't really give us control over the type, anyhow).
543
544 The second format is found on UnixWare, and probably most SVR4
545 machines, and looks like
546 .section .sec1,"a",@progbits
547 The quoted string may contain any combination of a, w, x, and
548 represents the SHF_* flags to turn on for the section. The string
549 beginning with '@' can be progbits or nobits. There should be
550 other possibilities, but I don't know what they are. In any case,
551 BFD doesn't really let us set the section type. */
552
553 void
554 obj_elf_change_section (const char *name,
555 unsigned int type,
556 bfd_vma attr,
557 int entsize,
558 const char *group_name,
559 int linkonce,
560 int push)
561 {
562 asection *old_sec;
563 segT sec;
564 flagword flags;
565 const struct elf_backend_data *bed;
566 const struct bfd_elf_special_section *ssect;
567
568 #ifdef md_flush_pending_output
569 md_flush_pending_output ();
570 #endif
571
572 /* Switch to the section, creating it if necessary. */
573 if (push)
574 {
575 struct section_stack *elt;
576 elt = XNEW (struct section_stack);
577 elt->next = section_stack;
578 elt->seg = now_seg;
579 elt->prev_seg = previous_section;
580 elt->subseg = now_subseg;
581 elt->prev_subseg = previous_subsection;
582 section_stack = elt;
583 }
584 previous_section = now_seg;
585 previous_subsection = now_subseg;
586
587 old_sec = bfd_get_section_by_name_if (stdoutput, name, get_section,
588 (void *) group_name);
589 if (old_sec)
590 {
591 sec = old_sec;
592 subseg_set (sec, 0);
593 }
594 else
595 sec = subseg_force_new (name, 0);
596
597 bed = get_elf_backend_data (stdoutput);
598 ssect = (*bed->get_sec_type_attr) (stdoutput, sec);
599
600 if (ssect != NULL)
601 {
602 bfd_boolean override = FALSE;
603
604 if (type == SHT_NULL)
605 type = ssect->type;
606 else if (type != ssect->type)
607 {
608 if (old_sec == NULL
609 /* Some older versions of gcc will emit
610
611 .section .init_array,"aw",@progbits
612
613 for __attribute__ ((section (".init_array"))).
614 "@progbits" is incorrect. Also for x86-64 large bss
615 sections, some older versions of gcc will emit
616
617 .section .lbss,"aw",@progbits
618
619 "@progbits" is incorrect. */
620 #ifdef TC_I386
621 && (bed->s->arch_size != 64
622 || !(ssect->attr & SHF_X86_64_LARGE))
623 #endif
624 && ssect->type != SHT_INIT_ARRAY
625 && ssect->type != SHT_FINI_ARRAY
626 && ssect->type != SHT_PREINIT_ARRAY)
627 {
628 /* We allow to specify any type for a .note section. */
629 if (ssect->type != SHT_NOTE
630 /* Processor and application defined types are allowed too. */
631 && type < SHT_LOPROC)
632 as_warn (_("setting incorrect section type for %s"),
633 name);
634 }
635 else
636 {
637 as_warn (_("ignoring incorrect section type for %s"),
638 name);
639 type = ssect->type;
640 }
641 }
642
643 if (old_sec == NULL && ((attr & ~(SHF_MASKOS | SHF_MASKPROC))
644 & ~ssect->attr) != 0)
645 {
646 /* As a GNU extension, we permit a .note section to be
647 allocatable. If the linker sees an allocatable .note
648 section, it will create a PT_NOTE segment in the output
649 file. We also allow "x" for .note.GNU-stack. */
650 if (ssect->type == SHT_NOTE
651 && (attr == SHF_ALLOC || attr == SHF_EXECINSTR))
652 ;
653 /* Allow different SHF_MERGE and SHF_STRINGS if we have
654 something like .rodata.str. */
655 else if (ssect->suffix_length == -2
656 && name[ssect->prefix_length] == '.'
657 && (attr
658 & ~ssect->attr
659 & ~SHF_MERGE
660 & ~SHF_STRINGS) == 0)
661 ;
662 /* .interp, .strtab and .symtab can have SHF_ALLOC. */
663 else if (attr == SHF_ALLOC
664 && (strcmp (name, ".interp") == 0
665 || strcmp (name, ".strtab") == 0
666 || strcmp (name, ".symtab") == 0))
667 override = TRUE;
668 /* .note.GNU-stack can have SHF_EXECINSTR. */
669 else if (attr == SHF_EXECINSTR
670 && strcmp (name, ".note.GNU-stack") == 0)
671 override = TRUE;
672 #ifdef TC_ALPHA
673 /* A section on Alpha may have SHF_ALPHA_GPREL. */
674 else if ((attr & ~ssect->attr) == SHF_ALPHA_GPREL)
675 override = TRUE;
676 #endif
677 #ifdef TC_RX
678 else if (attr == (SHF_EXECINSTR | SHF_WRITE | SHF_ALLOC)
679 && (ssect->type == SHT_INIT_ARRAY
680 || ssect->type == SHT_FINI_ARRAY
681 || ssect->type == SHT_PREINIT_ARRAY))
682 /* RX init/fini arrays can and should have the "awx" attributes set. */
683 ;
684 #endif
685 else
686 {
687 if (group_name == NULL)
688 as_warn (_("setting incorrect section attributes for %s"),
689 name);
690 override = TRUE;
691 }
692 }
693
694 if (!override && old_sec == NULL)
695 attr |= ssect->attr;
696 }
697
698 /* Convert ELF type and flags to BFD flags. */
699 flags = (SEC_RELOC
700 | ((attr & SHF_WRITE) ? 0 : SEC_READONLY)
701 | ((attr & SHF_ALLOC) ? SEC_ALLOC : 0)
702 | (((attr & SHF_ALLOC) && type != SHT_NOBITS) ? SEC_LOAD : 0)
703 | ((attr & SHF_EXECINSTR) ? SEC_CODE : 0)
704 | ((attr & SHF_MERGE) ? SEC_MERGE : 0)
705 | ((attr & SHF_STRINGS) ? SEC_STRINGS : 0)
706 | ((attr & SHF_EXCLUDE) ? SEC_EXCLUDE: 0)
707 | ((attr & SHF_TLS) ? SEC_THREAD_LOCAL : 0));
708 #ifdef md_elf_section_flags
709 flags = md_elf_section_flags (flags, attr, type);
710 #endif
711
712 if (linkonce)
713 flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
714
715 if (old_sec == NULL)
716 {
717 symbolS *secsym;
718
719 if (type == SHT_NULL)
720 type = bfd_elf_get_default_section_type (flags);
721 elf_section_type (sec) = type;
722 elf_section_flags (sec) = attr;
723
724 /* Prevent SEC_HAS_CONTENTS from being inadvertently set. */
725 if (type == SHT_NOBITS)
726 seg_info (sec)->bss = 1;
727
728 bfd_set_section_flags (stdoutput, sec, flags);
729 if (flags & SEC_MERGE)
730 sec->entsize = entsize;
731 elf_group_name (sec) = group_name;
732
733 /* Add a symbol for this section to the symbol table. */
734 secsym = symbol_find (name);
735 if (secsym != NULL)
736 symbol_set_bfdsym (secsym, sec->symbol);
737 else
738 symbol_table_insert (section_symbol (sec));
739 }
740 else
741 {
742 if (type != SHT_NULL
743 && (unsigned) type != elf_section_type (old_sec))
744 as_warn (_("ignoring changed section type for %s"), name);
745
746 if (attr != 0)
747 {
748 /* If section attributes are specified the second time we see a
749 particular section, then check that they are the same as we
750 saw the first time. */
751 if (((old_sec->flags ^ flags)
752 & (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
753 | SEC_EXCLUDE | SEC_SORT_ENTRIES | SEC_MERGE | SEC_STRINGS
754 | SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD
755 | SEC_THREAD_LOCAL)))
756 as_warn (_("ignoring changed section attributes for %s"), name);
757 else
758 /* FIXME: Maybe we should consider removing a previously set
759 processor or application specific attribute as suspicious ? */
760 elf_section_flags (sec) = attr;
761
762 if ((flags & SEC_MERGE) && old_sec->entsize != (unsigned) entsize)
763 as_warn (_("ignoring changed section entity size for %s"), name);
764 }
765 }
766
767 #ifdef md_elf_section_change_hook
768 md_elf_section_change_hook ();
769 #endif
770 }
771
772 static bfd_vma
773 obj_elf_parse_section_letters (char *str, size_t len, bfd_boolean *is_clone)
774 {
775 bfd_vma attr = 0;
776 *is_clone = FALSE;
777
778 while (len > 0)
779 {
780 switch (*str)
781 {
782 case 'a':
783 attr |= SHF_ALLOC;
784 break;
785 case 'e':
786 attr |= SHF_EXCLUDE;
787 break;
788 case 'w':
789 attr |= SHF_WRITE;
790 break;
791 case 'x':
792 attr |= SHF_EXECINSTR;
793 break;
794 case 'M':
795 attr |= SHF_MERGE;
796 break;
797 case 'S':
798 attr |= SHF_STRINGS;
799 break;
800 case 'G':
801 attr |= SHF_GROUP;
802 break;
803 case 'T':
804 attr |= SHF_TLS;
805 break;
806 case '?':
807 *is_clone = TRUE;
808 break;
809 /* Compatibility. */
810 case 'm':
811 if (*(str - 1) == 'a')
812 {
813 attr |= SHF_MERGE;
814 if (len > 1 && str[1] == 's')
815 {
816 attr |= SHF_STRINGS;
817 str++, len--;
818 }
819 break;
820 }
821 /* Fall through. */
822 default:
823 {
824 const char *bad_msg = _("unrecognized .section attribute:"
825 " want a,e,w,x,M,S,G,T or number");
826 #ifdef md_elf_section_letter
827 bfd_vma md_attr = md_elf_section_letter (*str, &bad_msg);
828 if (md_attr != (bfd_vma) -1)
829 attr |= md_attr;
830 else
831 #endif
832 if (ISDIGIT (*str))
833 {
834 char * end;
835
836 attr |= strtoul (str, & end, 0);
837 /* Update str and len, allowing for the fact that
838 we will execute str++ and len-- below. */
839 end --;
840 len -= (end - str);
841 str = end;
842 }
843 else
844 as_fatal ("%s", bad_msg);
845 }
846 break;
847 }
848 str++, len--;
849 }
850
851 return attr;
852 }
853
854 static int
855 obj_elf_section_type (char *str, size_t len, bfd_boolean warn)
856 {
857 if (len == 8 && strncmp (str, "progbits", 8) == 0)
858 return SHT_PROGBITS;
859 if (len == 6 && strncmp (str, "nobits", 6) == 0)
860 return SHT_NOBITS;
861 if (len == 4 && strncmp (str, "note", 4) == 0)
862 return SHT_NOTE;
863 if (len == 10 && strncmp (str, "init_array", 10) == 0)
864 return SHT_INIT_ARRAY;
865 if (len == 10 && strncmp (str, "fini_array", 10) == 0)
866 return SHT_FINI_ARRAY;
867 if (len == 13 && strncmp (str, "preinit_array", 13) == 0)
868 return SHT_PREINIT_ARRAY;
869
870 #ifdef md_elf_section_type
871 {
872 int md_type = md_elf_section_type (str, len);
873 if (md_type >= 0)
874 return md_type;
875 }
876 #endif
877
878 if (ISDIGIT (*str))
879 {
880 char * end;
881 int type = strtoul (str, & end, 0);
882
883 if (warn && (size_t) (end - str) != len)
884 as_warn (_("extraneous characters at end of numeric section type"));
885
886 return type;
887 }
888
889 if (warn)
890 as_warn (_("unrecognized section type"));
891 return 0;
892 }
893
894 static bfd_vma
895 obj_elf_section_word (char *str, size_t len, int *type)
896 {
897 int ret;
898
899 if (len == 5 && strncmp (str, "write", 5) == 0)
900 return SHF_WRITE;
901 if (len == 5 && strncmp (str, "alloc", 5) == 0)
902 return SHF_ALLOC;
903 if (len == 9 && strncmp (str, "execinstr", 9) == 0)
904 return SHF_EXECINSTR;
905 if (len == 7 && strncmp (str, "exclude", 7) == 0)
906 return SHF_EXCLUDE;
907 if (len == 3 && strncmp (str, "tls", 3) == 0)
908 return SHF_TLS;
909
910 #ifdef md_elf_section_word
911 {
912 bfd_vma md_attr = md_elf_section_word (str, len);
913 if (md_attr > 0)
914 return md_attr;
915 }
916 #endif
917
918 ret = obj_elf_section_type (str, len, FALSE);
919 if (ret != 0)
920 *type = ret;
921 else
922 as_warn (_("unrecognized section attribute"));
923
924 return 0;
925 }
926
927 /* Get name of section. */
928 const char *
929 obj_elf_section_name (void)
930 {
931 char *name;
932
933 SKIP_WHITESPACE ();
934 if (*input_line_pointer == '"')
935 {
936 int dummy;
937
938 name = demand_copy_C_string (&dummy);
939 if (name == NULL)
940 {
941 ignore_rest_of_line ();
942 return NULL;
943 }
944 }
945 else
946 {
947 char *end = input_line_pointer;
948
949 while (0 == strchr ("\n\t,; ", *end))
950 end++;
951 if (end == input_line_pointer)
952 {
953 as_bad (_("missing name"));
954 ignore_rest_of_line ();
955 return NULL;
956 }
957
958 name = xmemdup0 (input_line_pointer, end - input_line_pointer);
959
960 while (flag_sectname_subst)
961 {
962 char *subst = strchr (name, '%');
963 if (subst && subst[1] == 'S')
964 {
965 int oldlen = strlen (name);
966 int substlen = strlen (now_seg->name);
967 int newlen = oldlen - 2 + substlen;
968 char *newname = XNEWVEC (char, newlen + 1);
969 int headlen = subst - name;
970 memcpy (newname, name, headlen);
971 strcpy (newname + headlen, now_seg->name);
972 strcat (newname + headlen, subst + 2);
973 xfree (name);
974 name = newname;
975 }
976 else
977 break;
978 }
979
980 #ifdef tc_canonicalize_section_name
981 name = tc_canonicalize_section_name (name);
982 #endif
983 input_line_pointer = end;
984 }
985 SKIP_WHITESPACE ();
986 return name;
987 }
988
989 void
990 obj_elf_section (int push)
991 {
992 const char *name, *group_name;
993 char *beg;
994 int type, dummy;
995 bfd_vma attr;
996 int entsize;
997 int linkonce;
998 subsegT new_subsection = -1;
999
1000 #ifndef TC_I370
1001 if (flag_mri)
1002 {
1003 char mri_type;
1004
1005 #ifdef md_flush_pending_output
1006 md_flush_pending_output ();
1007 #endif
1008
1009 previous_section = now_seg;
1010 previous_subsection = now_subseg;
1011
1012 s_mri_sect (&mri_type);
1013
1014 #ifdef md_elf_section_change_hook
1015 md_elf_section_change_hook ();
1016 #endif
1017
1018 return;
1019 }
1020 #endif /* ! defined (TC_I370) */
1021
1022 name = obj_elf_section_name ();
1023 if (name == NULL)
1024 return;
1025 type = SHT_NULL;
1026 attr = 0;
1027 group_name = NULL;
1028 entsize = 0;
1029 linkonce = 0;
1030
1031 if (*input_line_pointer == ',')
1032 {
1033 /* Skip the comma. */
1034 ++input_line_pointer;
1035 SKIP_WHITESPACE ();
1036
1037 if (push && ISDIGIT (*input_line_pointer))
1038 {
1039 /* .pushsection has an optional subsection. */
1040 new_subsection = (subsegT) get_absolute_expression ();
1041
1042 SKIP_WHITESPACE ();
1043
1044 /* Stop if we don't see a comma. */
1045 if (*input_line_pointer != ',')
1046 goto done;
1047
1048 /* Skip the comma. */
1049 ++input_line_pointer;
1050 SKIP_WHITESPACE ();
1051 }
1052
1053 if (*input_line_pointer == '"')
1054 {
1055 bfd_boolean is_clone;
1056
1057 beg = demand_copy_C_string (&dummy);
1058 if (beg == NULL)
1059 {
1060 ignore_rest_of_line ();
1061 return;
1062 }
1063 attr |= obj_elf_parse_section_letters (beg, strlen (beg), &is_clone);
1064
1065 SKIP_WHITESPACE ();
1066 if (*input_line_pointer == ',')
1067 {
1068 char c;
1069 char *save = input_line_pointer;
1070
1071 ++input_line_pointer;
1072 SKIP_WHITESPACE ();
1073 c = *input_line_pointer;
1074 if (c == '"')
1075 {
1076 beg = demand_copy_C_string (&dummy);
1077 if (beg == NULL)
1078 {
1079 ignore_rest_of_line ();
1080 return;
1081 }
1082 type = obj_elf_section_type (beg, strlen (beg), TRUE);
1083 }
1084 else if (c == '@' || c == '%')
1085 {
1086 ++input_line_pointer;
1087
1088 if (ISDIGIT (* input_line_pointer))
1089 {
1090 type = strtoul (input_line_pointer, & input_line_pointer, 0);
1091 }
1092 else
1093 {
1094 c = get_symbol_name (& beg);
1095 (void) restore_line_pointer (c);
1096 type = obj_elf_section_type (beg, input_line_pointer - beg, TRUE);
1097 }
1098 }
1099 else
1100 input_line_pointer = save;
1101 }
1102
1103 SKIP_WHITESPACE ();
1104 if ((attr & SHF_MERGE) != 0 && *input_line_pointer == ',')
1105 {
1106 ++input_line_pointer;
1107 SKIP_WHITESPACE ();
1108 entsize = get_absolute_expression ();
1109 SKIP_WHITESPACE ();
1110 if (entsize < 0)
1111 {
1112 as_warn (_("invalid merge entity size"));
1113 attr &= ~SHF_MERGE;
1114 entsize = 0;
1115 }
1116 }
1117 else if ((attr & SHF_MERGE) != 0)
1118 {
1119 as_warn (_("entity size for SHF_MERGE not specified"));
1120 attr &= ~SHF_MERGE;
1121 }
1122
1123 if ((attr & SHF_GROUP) != 0 && is_clone)
1124 {
1125 as_warn (_("? section flag ignored with G present"));
1126 is_clone = FALSE;
1127 }
1128 if ((attr & SHF_GROUP) != 0 && *input_line_pointer == ',')
1129 {
1130 ++input_line_pointer;
1131 group_name = obj_elf_section_name ();
1132 if (group_name == NULL)
1133 attr &= ~SHF_GROUP;
1134 else if (*input_line_pointer == ',')
1135 {
1136 ++input_line_pointer;
1137 SKIP_WHITESPACE ();
1138 if (strncmp (input_line_pointer, "comdat", 6) == 0)
1139 {
1140 input_line_pointer += 6;
1141 linkonce = 1;
1142 }
1143 }
1144 else if (strncmp (name, ".gnu.linkonce", 13) == 0)
1145 linkonce = 1;
1146 }
1147 else if ((attr & SHF_GROUP) != 0)
1148 {
1149 as_warn (_("group name for SHF_GROUP not specified"));
1150 attr &= ~SHF_GROUP;
1151 }
1152
1153 if (is_clone)
1154 {
1155 const char *now_group = elf_group_name (now_seg);
1156 if (now_group != NULL)
1157 {
1158 group_name = xstrdup (now_group);
1159 linkonce = (now_seg->flags & SEC_LINK_ONCE) != 0;
1160 }
1161 }
1162 }
1163 else
1164 {
1165 do
1166 {
1167 char c;
1168
1169 SKIP_WHITESPACE ();
1170 if (*input_line_pointer != '#')
1171 {
1172 as_bad (_("character following name is not '#'"));
1173 ignore_rest_of_line ();
1174 return;
1175 }
1176 ++input_line_pointer;
1177 c = get_symbol_name (& beg);
1178 (void) restore_line_pointer (c);
1179
1180 attr |= obj_elf_section_word (beg, input_line_pointer - beg, & type);
1181
1182 SKIP_WHITESPACE ();
1183 }
1184 while (*input_line_pointer++ == ',');
1185 --input_line_pointer;
1186 }
1187 }
1188
1189 done:
1190 demand_empty_rest_of_line ();
1191
1192 obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push);
1193
1194 if (push && new_subsection != -1)
1195 subseg_set (now_seg, new_subsection);
1196 }
1197
1198 /* Change to the .data section. */
1199
1200 void
1201 obj_elf_data (int i)
1202 {
1203 #ifdef md_flush_pending_output
1204 md_flush_pending_output ();
1205 #endif
1206
1207 previous_section = now_seg;
1208 previous_subsection = now_subseg;
1209 s_data (i);
1210
1211 #ifdef md_elf_section_change_hook
1212 md_elf_section_change_hook ();
1213 #endif
1214 }
1215
1216 /* Change to the .text section. */
1217
1218 void
1219 obj_elf_text (int i)
1220 {
1221 #ifdef md_flush_pending_output
1222 md_flush_pending_output ();
1223 #endif
1224
1225 previous_section = now_seg;
1226 previous_subsection = now_subseg;
1227 s_text (i);
1228
1229 #ifdef md_elf_section_change_hook
1230 md_elf_section_change_hook ();
1231 #endif
1232 }
1233
1234 /* Change to the *ABS* section. */
1235
1236 void
1237 obj_elf_struct (int i)
1238 {
1239 #ifdef md_flush_pending_output
1240 md_flush_pending_output ();
1241 #endif
1242
1243 previous_section = now_seg;
1244 previous_subsection = now_subseg;
1245 s_struct (i);
1246
1247 #ifdef md_elf_section_change_hook
1248 md_elf_section_change_hook ();
1249 #endif
1250 }
1251
1252 static void
1253 obj_elf_subsection (int ignore ATTRIBUTE_UNUSED)
1254 {
1255 int temp;
1256
1257 #ifdef md_flush_pending_output
1258 md_flush_pending_output ();
1259 #endif
1260
1261 previous_section = now_seg;
1262 previous_subsection = now_subseg;
1263
1264 temp = get_absolute_expression ();
1265 subseg_set (now_seg, (subsegT) temp);
1266 demand_empty_rest_of_line ();
1267
1268 #ifdef md_elf_section_change_hook
1269 md_elf_section_change_hook ();
1270 #endif
1271 }
1272
1273 /* This can be called from the processor backends if they change
1274 sections. */
1275
1276 void
1277 obj_elf_section_change_hook (void)
1278 {
1279 previous_section = now_seg;
1280 previous_subsection = now_subseg;
1281 }
1282
1283 void
1284 obj_elf_previous (int ignore ATTRIBUTE_UNUSED)
1285 {
1286 segT new_section;
1287 int new_subsection;
1288
1289 if (previous_section == 0)
1290 {
1291 as_warn (_(".previous without corresponding .section; ignored"));
1292 return;
1293 }
1294
1295 #ifdef md_flush_pending_output
1296 md_flush_pending_output ();
1297 #endif
1298
1299 new_section = previous_section;
1300 new_subsection = previous_subsection;
1301 previous_section = now_seg;
1302 previous_subsection = now_subseg;
1303 subseg_set (new_section, new_subsection);
1304
1305 #ifdef md_elf_section_change_hook
1306 md_elf_section_change_hook ();
1307 #endif
1308 }
1309
1310 static void
1311 obj_elf_popsection (int xxx ATTRIBUTE_UNUSED)
1312 {
1313 struct section_stack *top = section_stack;
1314
1315 if (top == NULL)
1316 {
1317 as_warn (_(".popsection without corresponding .pushsection; ignored"));
1318 return;
1319 }
1320
1321 #ifdef md_flush_pending_output
1322 md_flush_pending_output ();
1323 #endif
1324
1325 section_stack = top->next;
1326 previous_section = top->prev_seg;
1327 previous_subsection = top->prev_subseg;
1328 subseg_set (top->seg, top->subseg);
1329 free (top);
1330
1331 #ifdef md_elf_section_change_hook
1332 md_elf_section_change_hook ();
1333 #endif
1334 }
1335
1336 static void
1337 obj_elf_line (int ignore ATTRIBUTE_UNUSED)
1338 {
1339 /* Assume delimiter is part of expression. BSD4.2 as fails with
1340 delightful bug, so we are not being incompatible here. */
1341 new_logical_line (NULL, get_absolute_expression ());
1342 demand_empty_rest_of_line ();
1343 }
1344
1345 /* This handles the .symver pseudo-op, which is used to specify a
1346 symbol version. The syntax is ``.symver NAME,SYMVERNAME''.
1347 SYMVERNAME may contain ELF_VER_CHR ('@') characters. This
1348 pseudo-op causes the assembler to emit a symbol named SYMVERNAME
1349 with the same value as the symbol NAME. */
1350
1351 static void
1352 obj_elf_symver (int ignore ATTRIBUTE_UNUSED)
1353 {
1354 char *name;
1355 char c;
1356 char old_lexat;
1357 symbolS *sym;
1358
1359 sym = get_sym_from_input_line_and_check ();
1360
1361 if (*input_line_pointer != ',')
1362 {
1363 as_bad (_("expected comma after name in .symver"));
1364 ignore_rest_of_line ();
1365 return;
1366 }
1367
1368 ++input_line_pointer;
1369 SKIP_WHITESPACE ();
1370
1371 /* Temporarily include '@' in symbol names. */
1372 old_lexat = lex_type[(unsigned char) '@'];
1373 lex_type[(unsigned char) '@'] |= LEX_NAME;
1374 c = get_symbol_name (& name);
1375 lex_type[(unsigned char) '@'] = old_lexat;
1376
1377 if (symbol_get_obj (sym)->versioned_name == NULL)
1378 {
1379 symbol_get_obj (sym)->versioned_name = xstrdup (name);
1380
1381 (void) restore_line_pointer (c);
1382
1383 if (strchr (symbol_get_obj (sym)->versioned_name,
1384 ELF_VER_CHR) == NULL)
1385 {
1386 as_bad (_("missing version name in `%s' for symbol `%s'"),
1387 symbol_get_obj (sym)->versioned_name,
1388 S_GET_NAME (sym));
1389 ignore_rest_of_line ();
1390 return;
1391 }
1392 }
1393 else
1394 {
1395 if (strcmp (symbol_get_obj (sym)->versioned_name, name))
1396 {
1397 as_bad (_("multiple versions [`%s'|`%s'] for symbol `%s'"),
1398 name, symbol_get_obj (sym)->versioned_name,
1399 S_GET_NAME (sym));
1400 ignore_rest_of_line ();
1401 return;
1402 }
1403
1404 (void) restore_line_pointer (c);
1405 }
1406
1407 demand_empty_rest_of_line ();
1408 }
1409
1410 /* This handles the .vtable_inherit pseudo-op, which is used to indicate
1411 to the linker the hierarchy in which a particular table resides. The
1412 syntax is ".vtable_inherit CHILDNAME, PARENTNAME". */
1413
1414 struct fix *
1415 obj_elf_vtable_inherit (int ignore ATTRIBUTE_UNUSED)
1416 {
1417 char *cname, *pname;
1418 symbolS *csym, *psym;
1419 char c, bad = 0;
1420
1421 if (*input_line_pointer == '#')
1422 ++input_line_pointer;
1423
1424 c = get_symbol_name (& cname);
1425 csym = symbol_find (cname);
1426
1427 /* GCFIXME: should check that we don't have two .vtable_inherits for
1428 the same child symbol. Also, we can currently only do this if the
1429 child symbol is already exists and is placed in a fragment. */
1430
1431 if (csym == NULL || symbol_get_frag (csym) == NULL)
1432 {
1433 as_bad (_("expected `%s' to have already been set for .vtable_inherit"),
1434 cname);
1435 bad = 1;
1436 }
1437
1438 *input_line_pointer = c;
1439
1440 SKIP_WHITESPACE_AFTER_NAME ();
1441 if (*input_line_pointer != ',')
1442 {
1443 as_bad (_("expected comma after name in .vtable_inherit"));
1444 ignore_rest_of_line ();
1445 return NULL;
1446 }
1447
1448 ++input_line_pointer;
1449 SKIP_WHITESPACE ();
1450
1451 if (*input_line_pointer == '#')
1452 ++input_line_pointer;
1453
1454 if (input_line_pointer[0] == '0'
1455 && (input_line_pointer[1] == '\0'
1456 || ISSPACE (input_line_pointer[1])))
1457 {
1458 psym = section_symbol (absolute_section);
1459 ++input_line_pointer;
1460 }
1461 else
1462 {
1463 c = get_symbol_name (& pname);
1464 psym = symbol_find_or_make (pname);
1465 restore_line_pointer (c);
1466 }
1467
1468 demand_empty_rest_of_line ();
1469
1470 if (bad)
1471 return NULL;
1472
1473 gas_assert (symbol_get_value_expression (csym)->X_op == O_constant);
1474 return fix_new (symbol_get_frag (csym),
1475 symbol_get_value_expression (csym)->X_add_number,
1476 0, psym, 0, 0, BFD_RELOC_VTABLE_INHERIT);
1477 }
1478
1479 /* This handles the .vtable_entry pseudo-op, which is used to indicate
1480 to the linker that a vtable slot was used. The syntax is
1481 ".vtable_entry tablename, offset". */
1482
1483 struct fix *
1484 obj_elf_vtable_entry (int ignore ATTRIBUTE_UNUSED)
1485 {
1486 symbolS *sym;
1487 offsetT offset;
1488
1489 if (*input_line_pointer == '#')
1490 ++input_line_pointer;
1491
1492 sym = get_sym_from_input_line_and_check ();
1493 if (*input_line_pointer != ',')
1494 {
1495 as_bad (_("expected comma after name in .vtable_entry"));
1496 ignore_rest_of_line ();
1497 return NULL;
1498 }
1499
1500 ++input_line_pointer;
1501 if (*input_line_pointer == '#')
1502 ++input_line_pointer;
1503
1504 offset = get_absolute_expression ();
1505
1506 demand_empty_rest_of_line ();
1507
1508 return fix_new (frag_now, frag_now_fix (), 0, sym, offset, 0,
1509 BFD_RELOC_VTABLE_ENTRY);
1510 }
1511
1512 #define skip_whitespace(str) do { if (*(str) == ' ') ++(str); } while (0)
1513
1514 static inline int
1515 skip_past_char (char ** str, char c)
1516 {
1517 if (**str == c)
1518 {
1519 (*str)++;
1520 return 0;
1521 }
1522 else
1523 return -1;
1524 }
1525 #define skip_past_comma(str) skip_past_char (str, ',')
1526
1527 /* A list of attributes that have been explicitly set by the assembly code.
1528 VENDOR is the vendor id, BASE is the tag shifted right by the number
1529 of bits in MASK, and bit N of MASK is set if tag BASE+N has been set. */
1530 struct recorded_attribute_info {
1531 struct recorded_attribute_info *next;
1532 int vendor;
1533 unsigned int base;
1534 unsigned long mask;
1535 };
1536 static struct recorded_attribute_info *recorded_attributes;
1537
1538 /* Record that we have seen an explicit specification of attribute TAG
1539 for vendor VENDOR. */
1540
1541 static void
1542 record_attribute (int vendor, unsigned int tag)
1543 {
1544 unsigned int base;
1545 unsigned long mask;
1546 struct recorded_attribute_info *rai;
1547
1548 base = tag / (8 * sizeof (rai->mask));
1549 mask = 1UL << (tag % (8 * sizeof (rai->mask)));
1550 for (rai = recorded_attributes; rai; rai = rai->next)
1551 if (rai->vendor == vendor && rai->base == base)
1552 {
1553 rai->mask |= mask;
1554 return;
1555 }
1556
1557 rai = XNEW (struct recorded_attribute_info);
1558 rai->next = recorded_attributes;
1559 rai->vendor = vendor;
1560 rai->base = base;
1561 rai->mask = mask;
1562 recorded_attributes = rai;
1563 }
1564
1565 /* Return true if we have seen an explicit specification of attribute TAG
1566 for vendor VENDOR. */
1567
1568 bfd_boolean
1569 obj_elf_seen_attribute (int vendor, unsigned int tag)
1570 {
1571 unsigned int base;
1572 unsigned long mask;
1573 struct recorded_attribute_info *rai;
1574
1575 base = tag / (8 * sizeof (rai->mask));
1576 mask = 1UL << (tag % (8 * sizeof (rai->mask)));
1577 for (rai = recorded_attributes; rai; rai = rai->next)
1578 if (rai->vendor == vendor && rai->base == base)
1579 return (rai->mask & mask) != 0;
1580 return FALSE;
1581 }
1582
1583 /* Parse an attribute directive for VENDOR.
1584 Returns the attribute number read, or zero on error. */
1585
1586 int
1587 obj_elf_vendor_attribute (int vendor)
1588 {
1589 expressionS exp;
1590 int type;
1591 int tag;
1592 unsigned int i = 0;
1593 char *s = NULL;
1594
1595 /* Read the first number or name. */
1596 skip_whitespace (input_line_pointer);
1597 s = input_line_pointer;
1598 if (ISDIGIT (*input_line_pointer))
1599 {
1600 expression (& exp);
1601 if (exp.X_op != O_constant)
1602 goto bad;
1603 tag = exp.X_add_number;
1604 }
1605 else
1606 {
1607 char *name;
1608
1609 /* A name may contain '_', but no other punctuation. */
1610 for (; ISALNUM (*input_line_pointer) || *input_line_pointer == '_';
1611 ++input_line_pointer)
1612 i++;
1613 if (i == 0)
1614 goto bad;
1615
1616 name = xstrndup (s, i);
1617
1618 #ifndef CONVERT_SYMBOLIC_ATTRIBUTE
1619 #define CONVERT_SYMBOLIC_ATTRIBUTE(a) -1
1620 #endif
1621
1622 tag = CONVERT_SYMBOLIC_ATTRIBUTE (name);
1623 if (tag == -1)
1624 {
1625 as_bad (_("Attribute name not recognised: %s"), name);
1626 ignore_rest_of_line ();
1627 free (name);
1628 return 0;
1629 }
1630 free (name);
1631 }
1632
1633 type = _bfd_elf_obj_attrs_arg_type (stdoutput, vendor, tag);
1634
1635 if (skip_past_comma (&input_line_pointer) == -1)
1636 goto bad;
1637 if (type & 1)
1638 {
1639 expression (& exp);
1640 if (exp.X_op != O_constant)
1641 {
1642 as_bad (_("expected numeric constant"));
1643 ignore_rest_of_line ();
1644 return 0;
1645 }
1646 i = exp.X_add_number;
1647 }
1648 if ((type & 3) == 3
1649 && skip_past_comma (&input_line_pointer) == -1)
1650 {
1651 as_bad (_("expected comma"));
1652 ignore_rest_of_line ();
1653 return 0;
1654 }
1655 if (type & 2)
1656 {
1657 int len;
1658
1659 skip_whitespace (input_line_pointer);
1660 if (*input_line_pointer != '"')
1661 goto bad_string;
1662 s = demand_copy_C_string (&len);
1663 }
1664
1665 record_attribute (vendor, tag);
1666 switch (type & 3)
1667 {
1668 case 3:
1669 bfd_elf_add_obj_attr_int_string (stdoutput, vendor, tag, i, s);
1670 break;
1671 case 2:
1672 bfd_elf_add_obj_attr_string (stdoutput, vendor, tag, s);
1673 break;
1674 case 1:
1675 bfd_elf_add_obj_attr_int (stdoutput, vendor, tag, i);
1676 break;
1677 default:
1678 abort ();
1679 }
1680
1681 demand_empty_rest_of_line ();
1682 return tag;
1683 bad_string:
1684 as_bad (_("bad string constant"));
1685 ignore_rest_of_line ();
1686 return 0;
1687 bad:
1688 as_bad (_("expected <tag> , <value>"));
1689 ignore_rest_of_line ();
1690 return 0;
1691 }
1692
1693 /* Parse a .gnu_attribute directive. */
1694
1695 static void
1696 obj_elf_gnu_attribute (int ignored ATTRIBUTE_UNUSED)
1697 {
1698 obj_elf_vendor_attribute (OBJ_ATTR_GNU);
1699 }
1700
1701 void
1702 elf_obj_read_begin_hook (void)
1703 {
1704 #ifdef NEED_ECOFF_DEBUG
1705 if (ECOFF_DEBUGGING)
1706 ecoff_read_begin_hook ();
1707 #endif
1708 }
1709
1710 void
1711 elf_obj_symbol_new_hook (symbolS *symbolP)
1712 {
1713 struct elf_obj_sy *sy_obj;
1714
1715 sy_obj = symbol_get_obj (symbolP);
1716 sy_obj->size = NULL;
1717 sy_obj->versioned_name = NULL;
1718
1719 #ifdef NEED_ECOFF_DEBUG
1720 if (ECOFF_DEBUGGING)
1721 ecoff_symbol_new_hook (symbolP);
1722 #endif
1723 }
1724
1725 /* When setting one symbol equal to another, by default we probably
1726 want them to have the same "size", whatever it means in the current
1727 context. */
1728
1729 void
1730 elf_copy_symbol_attributes (symbolS *dest, symbolS *src)
1731 {
1732 struct elf_obj_sy *srcelf = symbol_get_obj (src);
1733 struct elf_obj_sy *destelf = symbol_get_obj (dest);
1734 if (srcelf->size)
1735 {
1736 if (destelf->size == NULL)
1737 destelf->size = XNEW (expressionS);
1738 *destelf->size = *srcelf->size;
1739 }
1740 else
1741 {
1742 if (destelf->size != NULL)
1743 free (destelf->size);
1744 destelf->size = NULL;
1745 }
1746 S_SET_SIZE (dest, S_GET_SIZE (src));
1747 /* Don't copy visibility. */
1748 S_SET_OTHER (dest, (ELF_ST_VISIBILITY (S_GET_OTHER (dest))
1749 | (S_GET_OTHER (src) & ~ELF_ST_VISIBILITY (-1))));
1750 }
1751
1752 void
1753 obj_elf_version (int ignore ATTRIBUTE_UNUSED)
1754 {
1755 char *name;
1756 unsigned int c;
1757 char *p;
1758 asection *seg = now_seg;
1759 subsegT subseg = now_subseg;
1760 Elf_Internal_Note i_note;
1761 Elf_External_Note e_note;
1762 asection *note_secp = NULL;
1763
1764 SKIP_WHITESPACE ();
1765 if (*input_line_pointer == '\"')
1766 {
1767 unsigned int len;
1768
1769 ++input_line_pointer; /* -> 1st char of string. */
1770 name = input_line_pointer;
1771
1772 while (is_a_char (c = next_char_of_string ()))
1773 ;
1774 c = *input_line_pointer;
1775 *input_line_pointer = '\0';
1776 *(input_line_pointer - 1) = '\0';
1777 *input_line_pointer = c;
1778
1779 /* Create the .note section. */
1780 note_secp = subseg_new (".note", 0);
1781 bfd_set_section_flags (stdoutput,
1782 note_secp,
1783 SEC_HAS_CONTENTS | SEC_READONLY);
1784
1785 /* Process the version string. */
1786 len = strlen (name) + 1;
1787
1788 /* PR 3456: Although the name field is padded out to an 4-byte
1789 boundary, the namesz field should not be adjusted. */
1790 i_note.namesz = len;
1791 i_note.descsz = 0; /* No description. */
1792 i_note.type = NT_VERSION;
1793 p = frag_more (sizeof (e_note.namesz));
1794 md_number_to_chars (p, i_note.namesz, sizeof (e_note.namesz));
1795 p = frag_more (sizeof (e_note.descsz));
1796 md_number_to_chars (p, i_note.descsz, sizeof (e_note.descsz));
1797 p = frag_more (sizeof (e_note.type));
1798 md_number_to_chars (p, i_note.type, sizeof (e_note.type));
1799 p = frag_more (len);
1800 memcpy (p, name, len);
1801
1802 frag_align (2, 0, 0);
1803
1804 subseg_set (seg, subseg);
1805 }
1806 else
1807 as_bad (_("expected quoted string"));
1808
1809 demand_empty_rest_of_line ();
1810 }
1811
1812 static void
1813 obj_elf_size (int ignore ATTRIBUTE_UNUSED)
1814 {
1815 char *name;
1816 char c = get_symbol_name (&name);
1817 char *p;
1818 expressionS exp;
1819 symbolS *sym;
1820
1821 p = input_line_pointer;
1822 *p = c;
1823 SKIP_WHITESPACE_AFTER_NAME ();
1824 if (*input_line_pointer != ',')
1825 {
1826 *p = 0;
1827 as_bad (_("expected comma after name `%s' in .size directive"), name);
1828 *p = c;
1829 ignore_rest_of_line ();
1830 return;
1831 }
1832 input_line_pointer++;
1833 expression (&exp);
1834 if (exp.X_op == O_absent)
1835 {
1836 as_bad (_("missing expression in .size directive"));
1837 exp.X_op = O_constant;
1838 exp.X_add_number = 0;
1839 }
1840 *p = 0;
1841 sym = symbol_find_or_make (name);
1842 *p = c;
1843 if (exp.X_op == O_constant)
1844 {
1845 S_SET_SIZE (sym, exp.X_add_number);
1846 if (symbol_get_obj (sym)->size)
1847 {
1848 xfree (symbol_get_obj (sym)->size);
1849 symbol_get_obj (sym)->size = NULL;
1850 }
1851 }
1852 else
1853 {
1854 symbol_get_obj (sym)->size = XNEW (expressionS);
1855 *symbol_get_obj (sym)->size = exp;
1856 }
1857 demand_empty_rest_of_line ();
1858 }
1859
1860 /* Handle the ELF .type pseudo-op. This sets the type of a symbol.
1861 There are six syntaxes:
1862
1863 The first (used on Solaris) is
1864 .type SYM,#function
1865 The second (used on UnixWare) is
1866 .type SYM,@function
1867 The third (reportedly to be used on Irix 6.0) is
1868 .type SYM STT_FUNC
1869 The fourth (used on NetBSD/Arm and Linux/ARM) is
1870 .type SYM,%function
1871 The fifth (used on SVR4/860) is
1872 .type SYM,"function"
1873 The sixth (emitted by recent SunPRO under Solaris) is
1874 .type SYM,[0-9]
1875 where the integer is the STT_* value.
1876 */
1877
1878 static char *
1879 obj_elf_type_name (char *cp)
1880 {
1881 char *p;
1882
1883 p = input_line_pointer;
1884 if (*input_line_pointer >= '0'
1885 && *input_line_pointer <= '9')
1886 {
1887 while (*input_line_pointer >= '0'
1888 && *input_line_pointer <= '9')
1889 ++input_line_pointer;
1890 *cp = *input_line_pointer;
1891 *input_line_pointer = '\0';
1892 }
1893 else
1894 *cp = get_symbol_name (&p);
1895
1896 return p;
1897 }
1898
1899 static void
1900 obj_elf_type (int ignore ATTRIBUTE_UNUSED)
1901 {
1902 char c;
1903 int type;
1904 const char *type_name;
1905 symbolS *sym;
1906 elf_symbol_type *elfsym;
1907
1908 sym = get_sym_from_input_line_and_check ();
1909 c = *input_line_pointer;
1910 elfsym = (elf_symbol_type *) symbol_get_bfdsym (sym);
1911
1912 if (*input_line_pointer == ',')
1913 ++input_line_pointer;
1914
1915 SKIP_WHITESPACE ();
1916 if ( *input_line_pointer == '#'
1917 || *input_line_pointer == '@'
1918 || *input_line_pointer == '"'
1919 || *input_line_pointer == '%')
1920 ++input_line_pointer;
1921
1922 type_name = obj_elf_type_name (& c);
1923
1924 type = 0;
1925 if (strcmp (type_name, "function") == 0
1926 || strcmp (type_name, "2") == 0
1927 || strcmp (type_name, "STT_FUNC") == 0)
1928 type = BSF_FUNCTION;
1929 else if (strcmp (type_name, "object") == 0
1930 || strcmp (type_name, "1") == 0
1931 || strcmp (type_name, "STT_OBJECT") == 0)
1932 type = BSF_OBJECT;
1933 else if (strcmp (type_name, "tls_object") == 0
1934 || strcmp (type_name, "6") == 0
1935 || strcmp (type_name, "STT_TLS") == 0)
1936 type = BSF_OBJECT | BSF_THREAD_LOCAL;
1937 else if (strcmp (type_name, "notype") == 0
1938 || strcmp (type_name, "0") == 0
1939 || strcmp (type_name, "STT_NOTYPE") == 0)
1940 ;
1941 else if (strcmp (type_name, "common") == 0
1942 || strcmp (type_name, "5") == 0
1943 || strcmp (type_name, "STT_COMMON") == 0)
1944 {
1945 type = BSF_OBJECT;
1946
1947 if (! S_IS_COMMON (sym))
1948 {
1949 if (S_IS_VOLATILE (sym))
1950 {
1951 sym = symbol_clone (sym, 1);
1952 S_SET_SEGMENT (sym, bfd_com_section_ptr);
1953 S_SET_VALUE (sym, 0);
1954 S_SET_EXTERNAL (sym);
1955 symbol_set_frag (sym, &zero_address_frag);
1956 S_CLEAR_VOLATILE (sym);
1957 }
1958 else if (S_IS_DEFINED (sym) || symbol_equated_p (sym))
1959 as_bad (_("symbol '%s' is already defined"), S_GET_NAME (sym));
1960 else
1961 {
1962 /* FIXME: Is it safe to just change the section ? */
1963 S_SET_SEGMENT (sym, bfd_com_section_ptr);
1964 S_SET_VALUE (sym, 0);
1965 S_SET_EXTERNAL (sym);
1966 }
1967 }
1968 }
1969 else if (strcmp (type_name, "gnu_indirect_function") == 0
1970 || strcmp (type_name, "10") == 0
1971 || strcmp (type_name, "STT_GNU_IFUNC") == 0)
1972 {
1973 const struct elf_backend_data *bed;
1974
1975 bed = get_elf_backend_data (stdoutput);
1976 if (!(bed->elf_osabi == ELFOSABI_GNU
1977 || bed->elf_osabi == ELFOSABI_FREEBSD
1978 /* GNU is still using the default value 0. */
1979 || bed->elf_osabi == ELFOSABI_NONE))
1980 as_bad (_("symbol type \"%s\" is supported only by GNU and FreeBSD targets"),
1981 type_name);
1982 type = BSF_FUNCTION | BSF_GNU_INDIRECT_FUNCTION;
1983 }
1984 else if (strcmp (type_name, "gnu_unique_object") == 0)
1985 {
1986 struct elf_backend_data *bed;
1987
1988 bed = (struct elf_backend_data *) get_elf_backend_data (stdoutput);
1989 if (!(bed->elf_osabi == ELFOSABI_GNU
1990 /* GNU is still using the default value 0. */
1991 || bed->elf_osabi == ELFOSABI_NONE))
1992 as_bad (_("symbol type \"%s\" is supported only by GNU targets"),
1993 type_name);
1994 type = BSF_OBJECT | BSF_GNU_UNIQUE;
1995 /* PR 10549: Always set OSABI field to GNU for objects containing unique symbols. */
1996 bed->elf_osabi = ELFOSABI_GNU;
1997 }
1998 #ifdef md_elf_symbol_type
1999 else if ((type = md_elf_symbol_type (type_name, sym, elfsym)) != -1)
2000 ;
2001 #endif
2002 else
2003 as_bad (_("unrecognized symbol type \"%s\""), type_name);
2004
2005 *input_line_pointer = c;
2006
2007 if (*input_line_pointer == '"')
2008 ++input_line_pointer;
2009
2010 elfsym->symbol.flags |= type;
2011
2012 demand_empty_rest_of_line ();
2013 }
2014
2015 static void
2016 obj_elf_ident (int ignore ATTRIBUTE_UNUSED)
2017 {
2018 static segT comment_section;
2019 segT old_section = now_seg;
2020 int old_subsection = now_subseg;
2021
2022 #ifdef md_flush_pending_output
2023 md_flush_pending_output ();
2024 #endif
2025
2026 if (!comment_section)
2027 {
2028 char *p;
2029 comment_section = subseg_new (".comment", 0);
2030 bfd_set_section_flags (stdoutput, comment_section,
2031 SEC_READONLY | SEC_HAS_CONTENTS
2032 | SEC_MERGE | SEC_STRINGS);
2033 comment_section->entsize = 1;
2034 #ifdef md_elf_section_change_hook
2035 md_elf_section_change_hook ();
2036 #endif
2037 p = frag_more (1);
2038 *p = 0;
2039 }
2040 else
2041 subseg_set (comment_section, 0);
2042 stringer (8 + 1);
2043 subseg_set (old_section, old_subsection);
2044 }
2045
2046 #ifdef INIT_STAB_SECTION
2047
2048 /* The first entry in a .stabs section is special. */
2049
2050 void
2051 obj_elf_init_stab_section (segT seg)
2052 {
2053 const char *file;
2054 char *p;
2055 char *stabstr_name;
2056 unsigned int stroff;
2057
2058 /* Force the section to align to a longword boundary. Without this,
2059 UnixWare ar crashes. */
2060 bfd_set_section_alignment (stdoutput, seg, 2);
2061
2062 /* Make space for this first symbol. */
2063 p = frag_more (12);
2064 /* Zero it out. */
2065 memset (p, 0, 12);
2066 file = as_where (NULL);
2067 stabstr_name = concat (segment_name (seg), "str", (char *) NULL);
2068 stroff = get_stab_string_offset (file, stabstr_name);
2069 know (stroff == 1 || (stroff == 0 && file[0] == '\0'));
2070 md_number_to_chars (p, stroff, 4);
2071 seg_info (seg)->stabu.p = p;
2072 }
2073
2074 #endif
2075
2076 /* Fill in the counts in the first entry in a .stabs section. */
2077
2078 static void
2079 adjust_stab_sections (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
2080 {
2081 char *name;
2082 asection *strsec;
2083 char *p;
2084 int strsz, nsyms;
2085
2086 if (strncmp (".stab", sec->name, 5))
2087 return;
2088 if (!strcmp ("str", sec->name + strlen (sec->name) - 3))
2089 return;
2090
2091 name = concat (sec->name, "str", NULL);
2092 strsec = bfd_get_section_by_name (abfd, name);
2093 if (strsec)
2094 strsz = bfd_section_size (abfd, strsec);
2095 else
2096 strsz = 0;
2097 nsyms = bfd_section_size (abfd, sec) / 12 - 1;
2098
2099 p = seg_info (sec)->stabu.p;
2100 gas_assert (p != 0);
2101
2102 bfd_h_put_16 (abfd, nsyms, p + 6);
2103 bfd_h_put_32 (abfd, strsz, p + 8);
2104 free (name);
2105 }
2106
2107 #ifdef NEED_ECOFF_DEBUG
2108
2109 /* This function is called by the ECOFF code. It is supposed to
2110 record the external symbol information so that the backend can
2111 write it out correctly. The ELF backend doesn't actually handle
2112 this at the moment, so we do it ourselves. We save the information
2113 in the symbol. */
2114
2115 #ifdef OBJ_MAYBE_ELF
2116 static
2117 #endif
2118 void
2119 elf_ecoff_set_ext (symbolS *sym, struct ecoff_extr *ext)
2120 {
2121 symbol_get_bfdsym (sym)->udata.p = ext;
2122 }
2123
2124 /* This function is called by bfd_ecoff_debug_externals. It is
2125 supposed to *EXT to the external symbol information, and return
2126 whether the symbol should be used at all. */
2127
2128 static bfd_boolean
2129 elf_get_extr (asymbol *sym, EXTR *ext)
2130 {
2131 if (sym->udata.p == NULL)
2132 return FALSE;
2133 *ext = *(EXTR *) sym->udata.p;
2134 return TRUE;
2135 }
2136
2137 /* This function is called by bfd_ecoff_debug_externals. It has
2138 nothing to do for ELF. */
2139
2140 static void
2141 elf_set_index (asymbol *sym ATTRIBUTE_UNUSED,
2142 bfd_size_type indx ATTRIBUTE_UNUSED)
2143 {
2144 }
2145
2146 #endif /* NEED_ECOFF_DEBUG */
2147
2148 void
2149 elf_frob_symbol (symbolS *symp, int *puntp)
2150 {
2151 struct elf_obj_sy *sy_obj;
2152 expressionS *size;
2153
2154 #ifdef NEED_ECOFF_DEBUG
2155 if (ECOFF_DEBUGGING)
2156 ecoff_frob_symbol (symp);
2157 #endif
2158
2159 sy_obj = symbol_get_obj (symp);
2160
2161 size = sy_obj->size;
2162 if (size != NULL)
2163 {
2164 if (resolve_expression (size)
2165 && size->X_op == O_constant)
2166 S_SET_SIZE (symp, size->X_add_number);
2167 else
2168 {
2169 if (!flag_allow_nonconst_size)
2170 as_bad (_(".size expression for %s "
2171 "does not evaluate to a constant"), S_GET_NAME (symp));
2172 else
2173 as_warn (_(".size expression for %s "
2174 "does not evaluate to a constant"), S_GET_NAME (symp));
2175 }
2176 free (sy_obj->size);
2177 sy_obj->size = NULL;
2178 }
2179
2180 if (sy_obj->versioned_name != NULL)
2181 {
2182 char *p;
2183
2184 p = strchr (sy_obj->versioned_name, ELF_VER_CHR);
2185 if (p == NULL)
2186 /* We will have already reported an error about a missing version. */
2187 *puntp = TRUE;
2188
2189 /* This symbol was given a new name with the .symver directive.
2190
2191 If this is an external reference, just rename the symbol to
2192 include the version string. This will make the relocs be
2193 against the correct versioned symbol.
2194
2195 If this is a definition, add an alias. FIXME: Using an alias
2196 will permit the debugging information to refer to the right
2197 symbol. However, it's not clear whether it is the best
2198 approach. */
2199
2200 else if (! S_IS_DEFINED (symp))
2201 {
2202 /* Verify that the name isn't using the @@ syntax--this is
2203 reserved for definitions of the default version to link
2204 against. */
2205 if (p[1] == ELF_VER_CHR)
2206 {
2207 as_bad (_("invalid attempt to declare external version name"
2208 " as default in symbol `%s'"),
2209 sy_obj->versioned_name);
2210 *puntp = TRUE;
2211 }
2212 S_SET_NAME (symp, sy_obj->versioned_name);
2213 }
2214 else
2215 {
2216 if (p[1] == ELF_VER_CHR && p[2] == ELF_VER_CHR)
2217 {
2218 size_t l;
2219
2220 /* The @@@ syntax is a special case. It renames the
2221 symbol name to versioned_name with one `@' removed. */
2222 l = strlen (&p[3]) + 1;
2223 memmove (&p[2], &p[3], l);
2224 S_SET_NAME (symp, sy_obj->versioned_name);
2225 }
2226 else
2227 {
2228 symbolS *symp2;
2229
2230 /* FIXME: Creating a new symbol here is risky. We're
2231 in the final loop over the symbol table. We can
2232 get away with it only because the symbol goes to
2233 the end of the list, where the loop will still see
2234 it. It would probably be better to do this in
2235 obj_frob_file_before_adjust. */
2236
2237 symp2 = symbol_find_or_make (sy_obj->versioned_name);
2238
2239 /* Now we act as though we saw symp2 = sym. */
2240
2241 S_SET_SEGMENT (symp2, S_GET_SEGMENT (symp));
2242
2243 /* Subtracting out the frag address here is a hack
2244 because we are in the middle of the final loop. */
2245 S_SET_VALUE (symp2,
2246 (S_GET_VALUE (symp)
2247 - symbol_get_frag (symp)->fr_address));
2248
2249 symbol_set_frag (symp2, symbol_get_frag (symp));
2250
2251 /* This will copy over the size information. */
2252 copy_symbol_attributes (symp2, symp);
2253
2254 S_SET_OTHER (symp2, S_GET_OTHER (symp));
2255
2256 if (S_IS_WEAK (symp))
2257 S_SET_WEAK (symp2);
2258
2259 if (S_IS_EXTERNAL (symp))
2260 S_SET_EXTERNAL (symp2);
2261 }
2262 }
2263 }
2264
2265 /* Double check weak symbols. */
2266 if (S_IS_WEAK (symp))
2267 {
2268 if (S_IS_COMMON (symp))
2269 as_bad (_("symbol `%s' can not be both weak and common"),
2270 S_GET_NAME (symp));
2271 }
2272
2273 #ifdef TC_MIPS
2274 /* The Irix 5 and 6 assemblers set the type of any common symbol and
2275 any undefined non-function symbol to STT_OBJECT. We try to be
2276 compatible, since newer Irix 5 and 6 linkers care. However, we
2277 only set undefined symbols to be STT_OBJECT if we are on Irix,
2278 because that is the only time gcc will generate the necessary
2279 .global directives to mark functions. */
2280
2281 if (S_IS_COMMON (symp))
2282 symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
2283
2284 if (strstr (TARGET_OS, "irix") != NULL
2285 && ! S_IS_DEFINED (symp)
2286 && (symbol_get_bfdsym (symp)->flags & BSF_FUNCTION) == 0)
2287 symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
2288 #endif
2289 }
2290
2291 struct group_list
2292 {
2293 asection **head; /* Section lists. */
2294 unsigned int *elt_count; /* Number of sections in each list. */
2295 unsigned int num_group; /* Number of lists. */
2296 struct hash_control *indexes; /* Maps group name to index in head array. */
2297 };
2298
2299 /* Called via bfd_map_over_sections. If SEC is a member of a group,
2300 add it to a list of sections belonging to the group. INF is a
2301 pointer to a struct group_list, which is where we store the head of
2302 each list. */
2303
2304 static void
2305 build_group_lists (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
2306 {
2307 struct group_list *list = (struct group_list *) inf;
2308 const char *group_name = elf_group_name (sec);
2309 unsigned int i;
2310 unsigned int *elem_idx;
2311 unsigned int *idx_ptr;
2312
2313 if (group_name == NULL)
2314 return;
2315
2316 /* If this group already has a list, add the section to the head of
2317 the list. */
2318 elem_idx = (unsigned int *) hash_find (list->indexes, group_name);
2319 if (elem_idx != NULL)
2320 {
2321 elf_next_in_group (sec) = list->head[*elem_idx];
2322 list->head[*elem_idx] = sec;
2323 list->elt_count[*elem_idx] += 1;
2324 return;
2325 }
2326
2327 /* New group. Make the arrays bigger in chunks to minimize calls to
2328 realloc. */
2329 i = list->num_group;
2330 if ((i & 127) == 0)
2331 {
2332 unsigned int newsize = i + 128;
2333 list->head = XRESIZEVEC (asection *, list->head, newsize);
2334 list->elt_count = XRESIZEVEC (unsigned int, list->elt_count, newsize);
2335 }
2336 list->head[i] = sec;
2337 list->elt_count[i] = 1;
2338 list->num_group += 1;
2339
2340 /* Add index to hash. */
2341 idx_ptr = XNEW (unsigned int);
2342 *idx_ptr = i;
2343 hash_insert (list->indexes, group_name, idx_ptr);
2344 }
2345
2346 static void free_section_idx (const char *key ATTRIBUTE_UNUSED, void *val)
2347 {
2348 free ((unsigned int *) val);
2349 }
2350
2351 void
2352 elf_adjust_symtab (void)
2353 {
2354 struct group_list list;
2355 unsigned int i;
2356
2357 /* Go find section groups. */
2358 list.num_group = 0;
2359 list.head = NULL;
2360 list.elt_count = NULL;
2361 list.indexes = hash_new ();
2362 bfd_map_over_sections (stdoutput, build_group_lists, &list);
2363
2364 /* Make the SHT_GROUP sections that describe each section group. We
2365 can't set up the section contents here yet, because elf section
2366 indices have yet to be calculated. elf.c:set_group_contents does
2367 the rest of the work. */
2368 for (i = 0; i < list.num_group; i++)
2369 {
2370 const char *group_name = elf_group_name (list.head[i]);
2371 const char *sec_name;
2372 asection *s;
2373 flagword flags;
2374 struct symbol *sy;
2375 bfd_size_type size;
2376
2377 flags = SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_GROUP;
2378 for (s = list.head[i]; s != NULL; s = elf_next_in_group (s))
2379 if ((s->flags ^ flags) & SEC_LINK_ONCE)
2380 {
2381 flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
2382 if (s != list.head[i])
2383 {
2384 as_warn (_("assuming all members of group `%s' are COMDAT"),
2385 group_name);
2386 break;
2387 }
2388 }
2389
2390 sec_name = ".group";
2391 s = subseg_force_new (sec_name, 0);
2392 if (s == NULL
2393 || !bfd_set_section_flags (stdoutput, s, flags)
2394 || !bfd_set_section_alignment (stdoutput, s, 2))
2395 {
2396 as_fatal (_("can't create group: %s"),
2397 bfd_errmsg (bfd_get_error ()));
2398 }
2399 elf_section_type (s) = SHT_GROUP;
2400
2401 /* Pass a pointer to the first section in this group. */
2402 elf_next_in_group (s) = list.head[i];
2403 /* Make sure that the signature symbol for the group has the
2404 name of the group. */
2405 sy = symbol_find_exact (group_name);
2406 if (!sy
2407 || (sy != symbol_lastP
2408 && (sy->sy_next == NULL
2409 || sy->sy_next->sy_previous != sy)))
2410 {
2411 /* Create the symbol now. */
2412 sy = symbol_new (group_name, now_seg, (valueT) 0, frag_now);
2413 #ifdef TE_SOLARIS
2414 /* Before Solaris 11 build 154, Sun ld rejects local group
2415 signature symbols, so make them weak hidden instead. */
2416 symbol_get_bfdsym (sy)->flags |= BSF_WEAK;
2417 S_SET_OTHER (sy, STV_HIDDEN);
2418 #else
2419 symbol_get_obj (sy)->local = 1;
2420 #endif
2421 symbol_table_insert (sy);
2422 }
2423 elf_group_id (s) = symbol_get_bfdsym (sy);
2424
2425 size = 4 * (list.elt_count[i] + 1);
2426 bfd_set_section_size (stdoutput, s, size);
2427 s->contents = (unsigned char *) frag_more (size);
2428 frag_now->fr_fix = frag_now_fix_octets ();
2429 frag_wane (frag_now);
2430 }
2431
2432 /* Cleanup hash. */
2433 hash_traverse (list.indexes, free_section_idx);
2434 hash_die (list.indexes);
2435 }
2436
2437 void
2438 elf_frob_file (void)
2439 {
2440 bfd_map_over_sections (stdoutput, adjust_stab_sections, NULL);
2441
2442 #ifdef elf_tc_final_processing
2443 elf_tc_final_processing ();
2444 #endif
2445 }
2446
2447 /* It removes any unneeded versioned symbols from the symbol table. */
2448
2449 void
2450 elf_frob_file_before_adjust (void)
2451 {
2452 if (symbol_rootP)
2453 {
2454 symbolS *symp;
2455
2456 for (symp = symbol_rootP; symp; symp = symbol_next (symp))
2457 if (!S_IS_DEFINED (symp))
2458 {
2459 if (symbol_get_obj (symp)->versioned_name)
2460 {
2461 char *p;
2462
2463 /* The @@@ syntax is a special case. If the symbol is
2464 not defined, 2 `@'s will be removed from the
2465 versioned_name. */
2466
2467 p = strchr (symbol_get_obj (symp)->versioned_name,
2468 ELF_VER_CHR);
2469 if (p != NULL && p[1] == ELF_VER_CHR && p[2] == ELF_VER_CHR)
2470 {
2471 size_t l = strlen (&p[3]) + 1;
2472 memmove (&p[1], &p[3], l);
2473 }
2474 if (symbol_used_p (symp) == 0
2475 && symbol_used_in_reloc_p (symp) == 0)
2476 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2477 }
2478
2479 /* If there was .weak foo, but foo was neither defined nor
2480 used anywhere, remove it. */
2481
2482 else if (S_IS_WEAK (symp)
2483 && symbol_used_p (symp) == 0
2484 && symbol_used_in_reloc_p (symp) == 0)
2485 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2486 }
2487 }
2488 }
2489
2490 /* It is required that we let write_relocs have the opportunity to
2491 optimize away fixups before output has begun, since it is possible
2492 to eliminate all fixups for a section and thus we never should
2493 have generated the relocation section. */
2494
2495 void
2496 elf_frob_file_after_relocs (void)
2497 {
2498 #ifdef NEED_ECOFF_DEBUG
2499 if (ECOFF_DEBUGGING)
2500 /* Generate the ECOFF debugging information. */
2501 {
2502 const struct ecoff_debug_swap *debug_swap;
2503 struct ecoff_debug_info debug;
2504 char *buf;
2505 asection *sec;
2506
2507 debug_swap
2508 = get_elf_backend_data (stdoutput)->elf_backend_ecoff_debug_swap;
2509 know (debug_swap != NULL);
2510 ecoff_build_debug (&debug.symbolic_header, &buf, debug_swap);
2511
2512 /* Set up the pointers in debug. */
2513 #define SET(ptr, offset, type) \
2514 debug.ptr = (type) (buf + debug.symbolic_header.offset)
2515
2516 SET (line, cbLineOffset, unsigned char *);
2517 SET (external_dnr, cbDnOffset, void *);
2518 SET (external_pdr, cbPdOffset, void *);
2519 SET (external_sym, cbSymOffset, void *);
2520 SET (external_opt, cbOptOffset, void *);
2521 SET (external_aux, cbAuxOffset, union aux_ext *);
2522 SET (ss, cbSsOffset, char *);
2523 SET (external_fdr, cbFdOffset, void *);
2524 SET (external_rfd, cbRfdOffset, void *);
2525 /* ssext and external_ext are set up just below. */
2526
2527 #undef SET
2528
2529 /* Set up the external symbols. */
2530 debug.ssext = debug.ssext_end = NULL;
2531 debug.external_ext = debug.external_ext_end = NULL;
2532 if (! bfd_ecoff_debug_externals (stdoutput, &debug, debug_swap, TRUE,
2533 elf_get_extr, elf_set_index))
2534 as_fatal (_("failed to set up debugging information: %s"),
2535 bfd_errmsg (bfd_get_error ()));
2536
2537 sec = bfd_get_section_by_name (stdoutput, ".mdebug");
2538 gas_assert (sec != NULL);
2539
2540 know (!stdoutput->output_has_begun);
2541
2542 /* We set the size of the section, call bfd_set_section_contents
2543 to force the ELF backend to allocate a file position, and then
2544 write out the data. FIXME: Is this really the best way to do
2545 this? */
2546 bfd_set_section_size
2547 (stdoutput, sec, bfd_ecoff_debug_size (stdoutput, &debug, debug_swap));
2548
2549 /* Pass BUF to bfd_set_section_contents because this will
2550 eventually become a call to fwrite, and ISO C prohibits
2551 passing a NULL pointer to a stdio function even if the
2552 pointer will not be used. */
2553 if (! bfd_set_section_contents (stdoutput, sec, buf, 0, 0))
2554 as_fatal (_("can't start writing .mdebug section: %s"),
2555 bfd_errmsg (bfd_get_error ()));
2556
2557 know (stdoutput->output_has_begun);
2558 know (sec->filepos != 0);
2559
2560 if (! bfd_ecoff_write_debug (stdoutput, &debug, debug_swap,
2561 sec->filepos))
2562 as_fatal (_("could not write .mdebug section: %s"),
2563 bfd_errmsg (bfd_get_error ()));
2564 }
2565 #endif /* NEED_ECOFF_DEBUG */
2566 }
2567
2568 #ifdef SCO_ELF
2569
2570 /* Heavily plagiarized from obj_elf_version. The idea is to emit the
2571 SCO specific identifier in the .notes section to satisfy the SCO
2572 linker.
2573
2574 This looks more complicated than it really is. As opposed to the
2575 "obvious" solution, this should handle the cross dev cases
2576 correctly. (i.e, hosting on a 64 bit big endian processor, but
2577 generating SCO Elf code) Efficiency isn't a concern, as there
2578 should be exactly one of these sections per object module.
2579
2580 SCO OpenServer 5 identifies it's ELF modules with a standard ELF
2581 .note section.
2582
2583 int_32 namesz = 4 ; Name size
2584 int_32 descsz = 12 ; Descriptive information
2585 int_32 type = 1 ;
2586 char name[4] = "SCO" ; Originator name ALWAYS SCO + NULL
2587 int_32 version = (major ver # << 16) | version of tools ;
2588 int_32 source = (tool_id << 16 ) | 1 ;
2589 int_32 info = 0 ; These are set by the SCO tools, but we
2590 don't know enough about the source
2591 environment to set them. SCO ld currently
2592 ignores them, and recommends we set them
2593 to zero. */
2594
2595 #define SCO_MAJOR_VERSION 0x1
2596 #define SCO_MINOR_VERSION 0x1
2597
2598 void
2599 sco_id (void)
2600 {
2601
2602 char *name;
2603 unsigned int c;
2604 char ch;
2605 char *p;
2606 asection *seg = now_seg;
2607 subsegT subseg = now_subseg;
2608 Elf_Internal_Note i_note;
2609 Elf_External_Note e_note;
2610 asection *note_secp = NULL;
2611 int i, len;
2612
2613 /* create the .note section */
2614
2615 note_secp = subseg_new (".note", 0);
2616 bfd_set_section_flags (stdoutput,
2617 note_secp,
2618 SEC_HAS_CONTENTS | SEC_READONLY);
2619
2620 /* process the version string */
2621
2622 i_note.namesz = 4;
2623 i_note.descsz = 12; /* 12 descriptive bytes */
2624 i_note.type = NT_VERSION; /* Contains a version string */
2625
2626 p = frag_more (sizeof (i_note.namesz));
2627 md_number_to_chars (p, i_note.namesz, 4);
2628
2629 p = frag_more (sizeof (i_note.descsz));
2630 md_number_to_chars (p, i_note.descsz, 4);
2631
2632 p = frag_more (sizeof (i_note.type));
2633 md_number_to_chars (p, i_note.type, 4);
2634
2635 p = frag_more (4);
2636 strcpy (p, "SCO");
2637
2638 /* Note: this is the version number of the ELF we're representing */
2639 p = frag_more (4);
2640 md_number_to_chars (p, (SCO_MAJOR_VERSION << 16) | (SCO_MINOR_VERSION), 4);
2641
2642 /* Here, we pick a magic number for ourselves (yes, I "registered"
2643 it with SCO. The bottom bit shows that we are compat with the
2644 SCO ABI. */
2645 p = frag_more (4);
2646 md_number_to_chars (p, 0x4c520000 | 0x0001, 4);
2647
2648 /* If we knew (or cared) what the source language options were, we'd
2649 fill them in here. SCO has given us permission to ignore these
2650 and just set them to zero. */
2651 p = frag_more (4);
2652 md_number_to_chars (p, 0x0000, 4);
2653
2654 frag_align (2, 0, 0);
2655
2656 /* We probably can't restore the current segment, for there likely
2657 isn't one yet... */
2658 if (seg && subseg)
2659 subseg_set (seg, subseg);
2660
2661 }
2662
2663 #endif /* SCO_ELF */
2664
2665 static void
2666 elf_generate_asm_lineno (void)
2667 {
2668 #ifdef NEED_ECOFF_DEBUG
2669 if (ECOFF_DEBUGGING)
2670 ecoff_generate_asm_lineno ();
2671 #endif
2672 }
2673
2674 static void
2675 elf_process_stab (segT sec ATTRIBUTE_UNUSED,
2676 int what ATTRIBUTE_UNUSED,
2677 const char *string ATTRIBUTE_UNUSED,
2678 int type ATTRIBUTE_UNUSED,
2679 int other ATTRIBUTE_UNUSED,
2680 int desc ATTRIBUTE_UNUSED)
2681 {
2682 #ifdef NEED_ECOFF_DEBUG
2683 if (ECOFF_DEBUGGING)
2684 ecoff_stab (sec, what, string, type, other, desc);
2685 #endif
2686 }
2687
2688 static int
2689 elf_separate_stab_sections (void)
2690 {
2691 #ifdef NEED_ECOFF_DEBUG
2692 return (!ECOFF_DEBUGGING);
2693 #else
2694 return 1;
2695 #endif
2696 }
2697
2698 static void
2699 elf_init_stab_section (segT seg)
2700 {
2701 #ifdef NEED_ECOFF_DEBUG
2702 if (!ECOFF_DEBUGGING)
2703 #endif
2704 obj_elf_init_stab_section (seg);
2705 }
2706
2707 const struct format_ops elf_format_ops =
2708 {
2709 bfd_target_elf_flavour,
2710 0, /* dfl_leading_underscore */
2711 1, /* emit_section_symbols */
2712 elf_begin,
2713 elf_file_symbol,
2714 elf_frob_symbol,
2715 elf_frob_file,
2716 elf_frob_file_before_adjust,
2717 0, /* obj_frob_file_before_fix */
2718 elf_frob_file_after_relocs,
2719 elf_s_get_size, elf_s_set_size,
2720 elf_s_get_align, elf_s_set_align,
2721 elf_s_get_other,
2722 elf_s_set_other,
2723 0, /* s_get_desc */
2724 0, /* s_set_desc */
2725 0, /* s_get_type */
2726 0, /* s_set_type */
2727 elf_copy_symbol_attributes,
2728 elf_generate_asm_lineno,
2729 elf_process_stab,
2730 elf_separate_stab_sections,
2731 elf_init_stab_section,
2732 elf_sec_sym_ok_for_reloc,
2733 elf_pop_insert,
2734 #ifdef NEED_ECOFF_DEBUG
2735 elf_ecoff_set_ext,
2736 #else
2737 0, /* ecoff_set_ext */
2738 #endif
2739 elf_obj_read_begin_hook,
2740 elf_obj_symbol_new_hook,
2741 0,
2742 elf_adjust_symtab
2743 };
This page took 0.083298 seconds and 5 git commands to generate.