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