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