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