gas/
[deliverable/binutils-gdb.git] / gas / config / obj-elf.c
CommitLineData
252b5132 1/* ELF object file format
cc8a6dd0 2 Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
a0ea3e1d 3 2001, 2002, 2003 Free Software Foundation, Inc.
252b5132
RH
4
5 This file is part of GAS, the GNU Assembler.
6
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2,
10 or (at your option) any later version.
11
12 GAS is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 the GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
bf514e21 20 02111-1307, USA. */
252b5132
RH
21
22#define OBJ_HEADER "obj-elf.h"
23#include "as.h"
3882b010 24#include "safe-ctype.h"
252b5132
RH
25#include "subsegs.h"
26#include "obstack.h"
9758f3fc 27#include "struc-symbol.h"
87ccc1b0 28#include "dwarf2dbg.h"
252b5132
RH
29
30#ifndef ECOFF_DEBUGGING
31#define ECOFF_DEBUGGING 0
32#else
33#define NEED_ECOFF_DEBUG
34#endif
35
36#ifdef NEED_ECOFF_DEBUG
37#include "ecoff.h"
38#endif
39
40#ifdef TC_ALPHA
41#include "elf/alpha.h"
42#endif
43
44#ifdef TC_MIPS
45#include "elf/mips.h"
46#endif
47
48#ifdef TC_PPC
49#include "elf/ppc.h"
50#endif
51
5b93d8bb
AM
52#ifdef TC_I370
53#include "elf/i370.h"
54#endif
55
252b5132
RH
56static bfd_vma elf_s_get_size PARAMS ((symbolS *));
57static void elf_s_set_size PARAMS ((symbolS *, bfd_vma));
58static bfd_vma elf_s_get_align PARAMS ((symbolS *));
59static void elf_s_set_align PARAMS ((symbolS *, bfd_vma));
5110c57e 60static void elf_s_set_other PARAMS ((symbolS *, int));
252b5132
RH
61static int elf_sec_sym_ok_for_reloc PARAMS ((asection *));
62static void adjust_stab_sections PARAMS ((bfd *, asection *, PTR));
060adf0e 63static void build_group_lists PARAMS ((bfd *, asection *, PTR));
5110c57e
HPN
64static int elf_separate_stab_sections PARAMS ((void));
65static void elf_init_stab_section PARAMS ((segT));
13ae64f3 66static symbolS *elf_common PARAMS ((int));
252b5132
RH
67
68#ifdef NEED_ECOFF_DEBUG
b34976b6 69static bfd_boolean elf_get_extr PARAMS ((asymbol *, EXTR *));
252b5132
RH
70static void elf_set_index PARAMS ((asymbol *, bfd_size_type));
71#endif
72
73static void obj_elf_line PARAMS ((int));
74void obj_elf_version PARAMS ((int));
75static void obj_elf_size PARAMS ((int));
76static void obj_elf_type PARAMS ((int));
77static void obj_elf_ident PARAMS ((int));
78static void obj_elf_weak PARAMS ((int));
79static void obj_elf_local PARAMS ((int));
2e13b764 80static void obj_elf_visibility PARAMS ((int));
8d28c9d7
AM
81static int obj_elf_parse_section_letters PARAMS ((char *, size_t));
82static int obj_elf_section_word PARAMS ((char *, size_t));
6ce8b369 83static char *obj_elf_section_name PARAMS ((void));
8d28c9d7 84static int obj_elf_section_type PARAMS ((char *, size_t));
252b5132 85static void obj_elf_symver PARAMS ((int));
252b5132 86static void obj_elf_subsection PARAMS ((int));
9de8d8f1 87static void obj_elf_popsection PARAMS ((int));
13ae64f3 88static void obj_elf_tls_common PARAMS ((int));
252b5132
RH
89
90static const pseudo_typeS elf_pseudo_table[] =
91{
92 {"comm", obj_elf_common, 0},
9be1cda6 93 {"common", obj_elf_common, 1},
252b5132
RH
94 {"ident", obj_elf_ident, 0},
95 {"local", obj_elf_local, 0},
96 {"previous", obj_elf_previous, 0},
97 {"section", obj_elf_section, 0},
98 {"section.s", obj_elf_section, 0},
99 {"sect", obj_elf_section, 0},
100 {"sect.s", obj_elf_section, 0},
9de8d8f1
RH
101 {"pushsection", obj_elf_section, 1},
102 {"popsection", obj_elf_popsection, 0},
252b5132
RH
103 {"size", obj_elf_size, 0},
104 {"type", obj_elf_type, 0},
105 {"version", obj_elf_version, 0},
106 {"weak", obj_elf_weak, 0},
107
bf514e21 108 /* These define symbol visibility. */
2e13b764
NC
109 {"internal", obj_elf_visibility, STV_INTERNAL},
110 {"hidden", obj_elf_visibility, STV_HIDDEN},
111 {"protected", obj_elf_visibility, STV_PROTECTED},
112
252b5132
RH
113 /* These are used for stabs-in-elf configurations. */
114 {"line", obj_elf_line, 0},
115
116 /* This is a GNU extension to handle symbol versions. */
117 {"symver", obj_elf_symver, 0},
118
119 /* A GNU extension to change subsection only. */
120 {"subsection", obj_elf_subsection, 0},
121
122 /* These are GNU extensions to aid in garbage collecting C++ vtables. */
904a31bf
AM
123 {"vtable_inherit", (void (*) PARAMS ((int))) &obj_elf_vtable_inherit, 0},
124 {"vtable_entry", (void (*) PARAMS ((int))) &obj_elf_vtable_entry, 0},
252b5132 125
bf514e21 126 /* These are used for dwarf. */
252b5132
RH
127 {"2byte", cons, 2},
128 {"4byte", cons, 4},
129 {"8byte", cons, 8},
87ccc1b0
NC
130 /* These are used for dwarf2. */
131 { "file", (void (*) PARAMS ((int))) dwarf2_directive_file, 0 },
132 { "loc", dwarf2_directive_loc, 0 },
252b5132
RH
133
134 /* We need to trap the section changing calls to handle .previous. */
135 {"data", obj_elf_data, 0},
136 {"text", obj_elf_text, 0},
137
13ae64f3
JJ
138 {"tls_common", obj_elf_tls_common, 0},
139
252b5132 140 /* End sentinel. */
ab9da554 141 {NULL, NULL, 0},
252b5132
RH
142};
143
144static const pseudo_typeS ecoff_debug_pseudo_table[] =
145{
146#ifdef NEED_ECOFF_DEBUG
147 /* COFF style debugging information for ECOFF. .ln is not used; .loc
148 is used instead. */
149 { "def", ecoff_directive_def, 0 },
150 { "dim", ecoff_directive_dim, 0 },
151 { "endef", ecoff_directive_endef, 0 },
152 { "file", ecoff_directive_file, 0 },
153 { "scl", ecoff_directive_scl, 0 },
154 { "tag", ecoff_directive_tag, 0 },
155 { "val", ecoff_directive_val, 0 },
156
157 /* COFF debugging requires pseudo-ops .size and .type, but ELF
158 already has meanings for those. We use .esize and .etype
159 instead. These are only generated by gcc anyhow. */
160 { "esize", ecoff_directive_size, 0 },
161 { "etype", ecoff_directive_type, 0 },
162
163 /* ECOFF specific debugging information. */
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
194void
195elf_begin ()
196{
197 /* Add symbols for the known sections to the symbol table. */
198 symbol_table_insert (section_symbol (bfd_get_section_by_name (stdoutput,
199 TEXT_SECTION_NAME)));
200 symbol_table_insert (section_symbol (bfd_get_section_by_name (stdoutput,
201 DATA_SECTION_NAME)));
202 symbol_table_insert (section_symbol (bfd_get_section_by_name (stdoutput,
203 BSS_SECTION_NAME)));
204}
205
206void
207elf_pop_insert ()
208{
209 pop_insert (elf_pseudo_table);
210 if (ECOFF_DEBUGGING)
211 pop_insert (ecoff_debug_pseudo_table);
212}
213
214static bfd_vma
215elf_s_get_size (sym)
216 symbolS *sym;
217{
218 return S_GET_SIZE (sym);
219}
220
221static void
222elf_s_set_size (sym, sz)
223 symbolS *sym;
224 bfd_vma sz;
225{
226 S_SET_SIZE (sym, sz);
227}
228
229static bfd_vma
230elf_s_get_align (sym)
231 symbolS *sym;
232{
233 return S_GET_ALIGN (sym);
234}
235
236static void
237elf_s_set_align (sym, align)
238 symbolS *sym;
239 bfd_vma align;
240{
241 S_SET_ALIGN (sym, align);
242}
243
4c63da97
AM
244int
245elf_s_get_other (sym)
246 symbolS *sym;
247{
248 return elf_symbol (symbol_get_bfdsym (sym))->internal_elf_sym.st_other;
249}
250
5110c57e
HPN
251static void
252elf_s_set_other (sym, other)
253 symbolS *sym;
254 int other;
255{
256 S_SET_OTHER (sym, other);
257}
258
252b5132
RH
259static int
260elf_sec_sym_ok_for_reloc (sec)
261 asection *sec;
262{
263 return obj_sec_sym_ok_for_reloc (sec);
264}
265
266void
267elf_file_symbol (s)
5110c57e 268 const char *s;
252b5132
RH
269{
270 symbolS *sym;
271
272 sym = symbol_new (s, absolute_section, (valueT) 0, (struct frag *) 0);
49309057
ILT
273 symbol_set_frag (sym, &zero_address_frag);
274 symbol_get_bfdsym (sym)->flags |= BSF_FILE;
252b5132
RH
275
276 if (symbol_rootP != sym)
277 {
278 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
279 symbol_insert (sym, symbol_rootP, &symbol_rootP, &symbol_lastP);
280#ifdef DEBUG
281 verify_symbol_chain (symbol_rootP, symbol_lastP);
282#endif
283 }
284
285#ifdef NEED_ECOFF_DEBUG
286 ecoff_new_file (s);
287#endif
288}
289
13ae64f3
JJ
290static symbolS *
291elf_common (is_common)
9be1cda6 292 int is_common;
252b5132
RH
293{
294 char *name;
295 char c;
296 char *p;
a0ea3e1d 297 offsetT temp, size, sign;
252b5132
RH
298 symbolS *symbolP;
299 int have_align;
a0ea3e1d 300 expressionS exp;
252b5132 301
9be1cda6
AS
302 if (flag_mri && is_common)
303 {
304 s_mri_common (0);
13ae64f3 305 return NULL;
9be1cda6
AS
306 }
307
252b5132
RH
308 name = input_line_pointer;
309 c = get_symbol_end ();
310 /* just after name is now '\0' */
311 p = input_line_pointer;
312 *p = c;
313 SKIP_WHITESPACE ();
314 if (*input_line_pointer != ',')
315 {
6ce8b369 316 as_bad (_("expected comma after symbol-name"));
252b5132 317 ignore_rest_of_line ();
13ae64f3 318 return NULL;
252b5132
RH
319 }
320 input_line_pointer++; /* skip ',' */
a0ea3e1d
AM
321 temp = get_absolute_expr (&exp);
322 sign = (offsetT) 1 << (stdoutput->arch_info->bits_per_address - 1);
323 size = temp & ((sign << 1) - 1);
324 if (temp != size || !exp.X_unsigned)
252b5132 325 {
a0ea3e1d 326 as_bad (_(".COMMon length (%ld) out of range, ignored."), (long) temp);
252b5132 327 ignore_rest_of_line ();
13ae64f3 328 return NULL;
252b5132 329 }
252b5132
RH
330 *p = 0;
331 symbolP = symbol_find_or_make (name);
332 *p = c;
333 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
334 {
6ce8b369 335 as_bad (_("symbol `%s' is already defined"), S_GET_NAME (symbolP));
252b5132 336 ignore_rest_of_line ();
13ae64f3 337 return NULL;
252b5132
RH
338 }
339 if (S_GET_VALUE (symbolP) != 0)
340 {
ab9da554 341 if (S_GET_VALUE (symbolP) != (valueT) size)
252b5132 342 {
a0ea3e1d
AM
343 as_warn (_("length of .comm \"%s\" is already %ld; not changed to %ld"),
344 S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP),
345 (long) size);
252b5132
RH
346 }
347 }
348 know (symbolP->sy_frag == &zero_address_frag);
349 if (*input_line_pointer != ',')
350 have_align = 0;
351 else
352 {
353 have_align = 1;
354 input_line_pointer++;
355 SKIP_WHITESPACE ();
356 }
357 if (! have_align || *input_line_pointer != '"')
358 {
359 if (! have_align)
360 temp = 0;
361 else
362 {
a0ea3e1d
AM
363 temp = get_absolute_expr (&exp);
364 if (!exp.X_unsigned)
252b5132
RH
365 {
366 temp = 0;
6ce8b369 367 as_warn (_("common alignment negative; 0 assumed"));
252b5132
RH
368 }
369 }
49309057 370 if (symbol_get_obj (symbolP)->local)
252b5132
RH
371 {
372 segT old_sec;
373 int old_subsec;
374 char *pfrag;
375 int align;
376
377 /* allocate_bss: */
378 old_sec = now_seg;
379 old_subsec = now_subseg;
380 if (temp)
381 {
382 /* convert to a power of 2 alignment */
383 for (align = 0; (temp & 1) == 0; temp >>= 1, ++align);
384 if (temp != 1)
385 {
6ce8b369 386 as_bad (_("common alignment not a power of 2"));
252b5132 387 ignore_rest_of_line ();
13ae64f3 388 return NULL;
252b5132
RH
389 }
390 }
391 else
392 align = 0;
393 record_alignment (bss_section, align);
394 subseg_set (bss_section, 0);
395 if (align)
396 frag_align (align, 0, 0);
397 if (S_GET_SEGMENT (symbolP) == bss_section)
49309057
ILT
398 symbol_get_frag (symbolP)->fr_symbol = 0;
399 symbol_set_frag (symbolP, frag_now);
252b5132
RH
400 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
401 (offsetT) size, (char *) 0);
402 *pfrag = 0;
403 S_SET_SIZE (symbolP, size);
404 S_SET_SEGMENT (symbolP, bss_section);
405 S_CLEAR_EXTERNAL (symbolP);
406 subseg_set (old_sec, old_subsec);
407 }
408 else
409 {
410 allocate_common:
411 S_SET_VALUE (symbolP, (valueT) size);
412 S_SET_ALIGN (symbolP, temp);
413 S_SET_EXTERNAL (symbolP);
414 S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
415 }
416 }
417 else
418 {
419 input_line_pointer++;
420 /* @@ Some use the dot, some don't. Can we get some consistency?? */
421 if (*input_line_pointer == '.')
422 input_line_pointer++;
423 /* @@ Some say data, some say bss. */
424 if (strncmp (input_line_pointer, "bss\"", 4)
425 && strncmp (input_line_pointer, "data\"", 5))
426 {
427 while (*--input_line_pointer != '"')
428 ;
429 input_line_pointer--;
430 goto bad_common_segment;
431 }
432 while (*input_line_pointer++ != '"')
433 ;
434 goto allocate_common;
435 }
436
49309057 437 symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
252b5132
RH
438
439 demand_empty_rest_of_line ();
13ae64f3 440 return symbolP;
252b5132
RH
441
442 {
443 bad_common_segment:
444 p = input_line_pointer;
445 while (*p && *p != '\n')
446 p++;
447 c = *p;
448 *p = '\0';
449 as_bad (_("bad .common segment %s"), input_line_pointer + 1);
450 *p = c;
451 input_line_pointer = p;
452 ignore_rest_of_line ();
13ae64f3 453 return NULL;
252b5132
RH
454 }
455}
456
13ae64f3
JJ
457void
458obj_elf_common (is_common)
459 int is_common;
460{
461 elf_common (is_common);
462}
463
464static void
465obj_elf_tls_common (ignore)
466 int ignore ATTRIBUTE_UNUSED;
467{
468 symbolS *symbolP = elf_common (0);
469
470 if (symbolP)
471 symbol_get_bfdsym (symbolP)->flags |= BSF_THREAD_LOCAL;
472}
473
252b5132
RH
474static void
475obj_elf_local (ignore)
ab9da554 476 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
477{
478 char *name;
479 int c;
480 symbolS *symbolP;
481
482 do
483 {
484 name = input_line_pointer;
485 c = get_symbol_end ();
486 symbolP = symbol_find_or_make (name);
487 *input_line_pointer = c;
488 SKIP_WHITESPACE ();
489 S_CLEAR_EXTERNAL (symbolP);
49309057 490 symbol_get_obj (symbolP)->local = 1;
252b5132
RH
491 if (c == ',')
492 {
493 input_line_pointer++;
494 SKIP_WHITESPACE ();
495 if (*input_line_pointer == '\n')
496 c = '\n';
497 }
498 }
499 while (c == ',');
500 demand_empty_rest_of_line ();
501}
502
503static void
504obj_elf_weak (ignore)
ab9da554 505 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
506{
507 char *name;
508 int c;
509 symbolS *symbolP;
510
511 do
512 {
513 name = input_line_pointer;
514 c = get_symbol_end ();
515 symbolP = symbol_find_or_make (name);
516 *input_line_pointer = c;
517 SKIP_WHITESPACE ();
518 S_SET_WEAK (symbolP);
49309057 519 symbol_get_obj (symbolP)->local = 1;
252b5132
RH
520 if (c == ',')
521 {
522 input_line_pointer++;
523 SKIP_WHITESPACE ();
524 if (*input_line_pointer == '\n')
525 c = '\n';
526 }
527 }
528 while (c == ',');
529 demand_empty_rest_of_line ();
530}
531
2e13b764
NC
532static void
533obj_elf_visibility (visibility)
534 int visibility;
535{
536 char *name;
537 int c;
538 symbolS *symbolP;
539 asymbol *bfdsym;
540 elf_symbol_type *elfsym;
541
542 do
543 {
544 name = input_line_pointer;
545 c = get_symbol_end ();
546 symbolP = symbol_find_or_make (name);
547 *input_line_pointer = c;
fa306131 548
2e13b764 549 SKIP_WHITESPACE ();
fa306131 550
2e13b764
NC
551 bfdsym = symbol_get_bfdsym (symbolP);
552 elfsym = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym);
fa306131 553
2e13b764 554 assert (elfsym);
fa306131 555
20e420c2
RH
556 elfsym->internal_elf_sym.st_other &= ~3;
557 elfsym->internal_elf_sym.st_other |= visibility;
fa306131 558
2e13b764
NC
559 if (c == ',')
560 {
561 input_line_pointer ++;
fa306131 562
2e13b764 563 SKIP_WHITESPACE ();
fa306131 564
2e13b764
NC
565 if (*input_line_pointer == '\n')
566 c = '\n';
567 }
568 }
569 while (c == ',');
fa306131 570
2e13b764
NC
571 demand_empty_rest_of_line ();
572}
573
252b5132
RH
574static segT previous_section;
575static int previous_subsection;
576
9de8d8f1
RH
577struct section_stack
578{
579 struct section_stack *next;
580 segT seg, prev_seg;
581 int subseg, prev_subseg;
582};
583
584static struct section_stack *section_stack;
585
252b5132
RH
586/* Handle the .section pseudo-op. This code supports two different
587 syntaxes.
588
589 The first is found on Solaris, and looks like
590 .section ".sec1",#alloc,#execinstr,#write
591 Here the names after '#' are the SHF_* flags to turn on for the
592 section. I'm not sure how it determines the SHT_* type (BFD
593 doesn't really give us control over the type, anyhow).
594
595 The second format is found on UnixWare, and probably most SVR4
596 machines, and looks like
597 .section .sec1,"a",@progbits
598 The quoted string may contain any combination of a, w, x, and
599 represents the SHF_* flags to turn on for the section. The string
600 beginning with '@' can be progbits or nobits. There should be
601 other possibilities, but I don't know what they are. In any case,
602 BFD doesn't really let us set the section type. */
603
cca86cc8 604void
d2dab548 605obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push)
060adf0e
AM
606 const char *name;
607 int type;
608 int attr;
609 int entsize;
aa1f4858 610 const char *group_name;
d2dab548 611 int linkonce;
060adf0e 612 int push;
252b5132 613{
742f45cf 614 asection *old_sec;
252b5132 615 segT sec;
742f45cf 616 flagword flags;
2f89ff8d
L
617 int def_type;
618 int def_attr;
252b5132
RH
619
620#ifdef md_flush_pending_output
621 md_flush_pending_output ();
622#endif
623
9de8d8f1
RH
624 /* Switch to the section, creating it if necessary. */
625 if (push)
626 {
627 struct section_stack *elt;
628 elt = xmalloc (sizeof (struct section_stack));
629 elt->next = section_stack;
630 elt->seg = now_seg;
631 elt->prev_seg = previous_section;
632 elt->subseg = now_subseg;
633 elt->prev_subseg = previous_subsection;
634 section_stack = elt;
635 }
636 previous_section = now_seg;
637 previous_subsection = now_subseg;
638
742f45cf 639 old_sec = bfd_get_section_by_name (stdoutput, name);
9de8d8f1
RH
640 sec = subseg_new (name, 0);
641
2f89ff8d
L
642 if (_bfd_elf_get_sec_type_attr (stdoutput, name, &def_type,
643 &def_attr))
644 {
645 if (type == SHT_NULL)
646 type = def_type;
647 else if (type != def_type)
648 {
649 if (old_sec == NULL
650 /* FIXME: gcc, as of 2002-10-22, will emit
7ed1d346 651
2f89ff8d 652 .section .init_array,"aw",@progbits
7ed1d346 653
2f89ff8d
L
654 for __attribute__ ((section (".init_array"))).
655 "@progbits" is incorrect. */
656 && def_type != SHT_INIT_ARRAY
657 && def_type != SHT_FINI_ARRAY
658 && def_type != SHT_PREINIT_ARRAY)
659 {
660 /* We allow to specify any type for a .note section. */
661 if (def_type != SHT_NOTE)
662 as_warn (_("setting incorrect section type for %s"),
663 name);
664 }
665 else
666 {
667 as_warn (_("ignoring incorrect section type for %s"),
742f45cf 668 name);
2f89ff8d
L
669 type = def_type;
670 }
671 }
672
673 if (old_sec == NULL && (attr &~ def_attr) != 0)
674 {
675 /* As a GNU extension, we permit a .note section to be
676 allocatable. If the linker sees an allocateable .note
677 section, it will create a PT_NOTE segment in the output
678 file. */
679 if (strcmp (name, ".note") != 0 || attr != SHF_ALLOC)
680 as_warn (_("setting incorrect section attributes for %s"),
681 name);
682 }
683 attr |= def_attr;
2f89ff8d 684 }
742f45cf 685
3cddba1e
L
686 if (type != SHT_NULL)
687 elf_section_type (sec) = type;
688 if (attr != 0)
689 elf_section_flags (sec) = attr;
8e8c182c 690
742f45cf
AM
691 /* Convert ELF type and flags to BFD flags. */
692 flags = (SEC_RELOC
693 | ((attr & SHF_WRITE) ? 0 : SEC_READONLY)
694 | ((attr & SHF_ALLOC) ? SEC_ALLOC : 0)
695 | (((attr & SHF_ALLOC) && type != SHT_NOBITS) ? SEC_LOAD : 0)
f5fa8ca2
JJ
696 | ((attr & SHF_EXECINSTR) ? SEC_CODE : 0)
697 | ((attr & SHF_MERGE) ? SEC_MERGE : 0)
13ae64f3
JJ
698 | ((attr & SHF_STRINGS) ? SEC_STRINGS : 0)
699 | ((attr & SHF_TLS) ? SEC_THREAD_LOCAL : 0));
9de8d8f1 700#ifdef md_elf_section_flags
742f45cf 701 flags = md_elf_section_flags (flags, attr, type);
9de8d8f1
RH
702#endif
703
742f45cf
AM
704 if (old_sec == NULL)
705 {
706 symbolS *secsym;
707
9de8d8f1
RH
708 /* Prevent SEC_HAS_CONTENTS from being inadvertently set. */
709 if (type == SHT_NOBITS)
710 seg_info (sec)->bss = 1;
711
68bfbfcc
AM
712 if (linkonce)
713 flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
9de8d8f1 714 bfd_set_section_flags (stdoutput, sec, flags);
f5fa8ca2
JJ
715 if (flags & SEC_MERGE)
716 sec->entsize = entsize;
aa1f4858 717 elf_group_name (sec) = group_name;
9de8d8f1
RH
718
719 /* Add a symbol for this section to the symbol table. */
720 secsym = symbol_find (name);
721 if (secsym != NULL)
722 symbol_set_bfdsym (secsym, sec->symbol);
723 else
724 symbol_table_insert (section_symbol (sec));
725 }
742f45cf
AM
726 else if (attr != 0)
727 {
728 /* If section attributes are specified the second time we see a
729 particular section, then check that they are the same as we
730 saw the first time. */
d2dab548
AM
731 if (((old_sec->flags ^ flags)
732 & (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
733 | SEC_EXCLUDE | SEC_SORT_ENTRIES | SEC_MERGE | SEC_STRINGS
68bfbfcc
AM
734 | SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD
735 | SEC_THREAD_LOCAL)))
6ce8b369 736 as_warn (_("ignoring changed section attributes for %s"), name);
d2dab548 737 if ((flags & SEC_MERGE) && old_sec->entsize != (unsigned) entsize)
6ce8b369 738 as_warn (_("ignoring changed section entity size for %s"), name);
d2dab548
AM
739 if ((attr & SHF_GROUP) != 0
740 && strcmp (elf_group_name (old_sec), group_name) != 0)
060adf0e 741 as_warn (_("ignoring new section group for %s"), name);
742f45cf 742 }
9de8d8f1
RH
743
744#ifdef md_elf_section_change_hook
742f45cf 745 md_elf_section_change_hook ();
9de8d8f1
RH
746#endif
747}
748
8d28c9d7 749static int
9de8d8f1
RH
750obj_elf_parse_section_letters (str, len)
751 char *str;
752 size_t len;
753{
754 int attr = 0;
755
756 while (len > 0)
757 {
758 switch (*str)
759 {
760 case 'a':
761 attr |= SHF_ALLOC;
762 break;
763 case 'w':
764 attr |= SHF_WRITE;
765 break;
766 case 'x':
767 attr |= SHF_EXECINSTR;
768 break;
9469ddf0 769 case 'M':
f5fa8ca2
JJ
770 attr |= SHF_MERGE;
771 break;
9469ddf0 772 case 'S':
f5fa8ca2
JJ
773 attr |= SHF_STRINGS;
774 break;
060adf0e
AM
775 case 'G':
776 attr |= SHF_GROUP;
777 break;
13ae64f3
JJ
778 case 'T':
779 attr |= SHF_TLS;
780 break;
34105363
L
781 /* Compatibility. */
782 case 'm':
783 if (*(str - 1) == 'a')
784 {
785 attr |= SHF_MERGE;
786 if (len > 1 && str[1] == 's')
787 {
788 attr |= SHF_STRINGS;
789 str++, len--;
790 }
791 break;
792 }
9de8d8f1
RH
793 default:
794 {
13ae64f3 795 char *bad_msg = _("unrecognized .section attribute: want a,w,x,M,S,G,T");
9de8d8f1
RH
796#ifdef md_elf_section_letter
797 int md_attr = md_elf_section_letter (*str, &bad_msg);
798 if (md_attr >= 0)
799 attr |= md_attr;
800 else
801#endif
711ef82f 802 as_fatal ("%s", bad_msg);
9de8d8f1
RH
803 }
804 break;
805 }
806 str++, len--;
807 }
808
809 return attr;
810}
811
8d28c9d7 812static int
9de8d8f1
RH
813obj_elf_section_word (str, len)
814 char *str;
815 size_t len;
816{
817 if (len == 5 && strncmp (str, "write", 5) == 0)
818 return SHF_WRITE;
819 if (len == 5 && strncmp (str, "alloc", 5) == 0)
820 return SHF_ALLOC;
821 if (len == 9 && strncmp (str, "execinstr", 9) == 0)
822 return SHF_EXECINSTR;
b9734f35
JJ
823 if (len == 3 && strncmp (str, "tls", 3) == 0)
824 return SHF_TLS;
9de8d8f1
RH
825
826#ifdef md_elf_section_word
827 {
828 int md_attr = md_elf_section_word (str, len);
829 if (md_attr >= 0)
830 return md_attr;
831 }
832#endif
833
6ce8b369 834 as_warn (_("unrecognized section attribute"));
9de8d8f1
RH
835 return 0;
836}
837
8d28c9d7 838static int
9de8d8f1
RH
839obj_elf_section_type (str, len)
840 char *str;
841 size_t len;
842{
843 if (len == 8 && strncmp (str, "progbits", 8) == 0)
844 return SHT_PROGBITS;
845 if (len == 6 && strncmp (str, "nobits", 6) == 0)
846 return SHT_NOBITS;
34f70875
L
847 if (len == 4 && strncmp (str, "note", 4) == 0)
848 return SHT_NOTE;
9de8d8f1
RH
849
850#ifdef md_elf_section_type
851 {
852 int md_type = md_elf_section_type (str, len);
853 if (md_type >= 0)
854 return md_type;
855 }
856#endif
857
6ce8b369 858 as_warn (_("unrecognized section type"));
9de8d8f1
RH
859 return 0;
860}
861
6ce8b369
AM
862/* Get name of section. */
863static char *
864obj_elf_section_name ()
865{
866 char *name;
867
868 SKIP_WHITESPACE ();
869 if (*input_line_pointer == '"')
870 {
871 int dummy;
872
873 name = demand_copy_C_string (&dummy);
874 if (name == NULL)
875 {
876 ignore_rest_of_line ();
877 return NULL;
878 }
879 }
880 else
881 {
882 char *end = input_line_pointer;
883
884 while (0 == strchr ("\n\t,; ", *end))
885 end++;
886 if (end == input_line_pointer)
887 {
888 as_warn (_("missing name"));
889 ignore_rest_of_line ();
890 return NULL;
891 }
892
893 name = xmalloc (end - input_line_pointer + 1);
894 memcpy (name, input_line_pointer, end - input_line_pointer);
895 name[end - input_line_pointer] = '\0';
612d7b83
L
896#ifdef tc_canonicalize_section_name
897 name = tc_canonicalize_section_name (name);
898#endif
6ce8b369
AM
899 input_line_pointer = end;
900 }
901 SKIP_WHITESPACE ();
902 return name;
903}
904
9de8d8f1
RH
905void
906obj_elf_section (push)
907 int push;
908{
aa1f4858 909 char *name, *group_name, *beg;
9de8d8f1 910 int type, attr, dummy;
f5fa8ca2 911 int entsize;
d2dab548 912 int linkonce;
9de8d8f1 913
5b93d8bb 914#ifndef TC_I370
252b5132
RH
915 if (flag_mri)
916 {
917 char mri_type;
918
9de8d8f1 919#ifdef md_flush_pending_output
60bcf0fa 920 md_flush_pending_output ();
9de8d8f1
RH
921#endif
922
252b5132
RH
923 previous_section = now_seg;
924 previous_subsection = now_subseg;
925
926 s_mri_sect (&mri_type);
927
928#ifdef md_elf_section_change_hook
929 md_elf_section_change_hook ();
930#endif
931
932 return;
933 }
5b93d8bb 934#endif /* ! defined (TC_I370) */
252b5132 935
6ce8b369
AM
936 name = obj_elf_section_name ();
937 if (name == NULL)
938 return;
252b5132
RH
939 type = SHT_NULL;
940 attr = 0;
aa1f4858 941 group_name = NULL;
f5fa8ca2 942 entsize = 0;
d2dab548 943 linkonce = 0;
252b5132
RH
944
945 if (*input_line_pointer == ',')
946 {
947 /* Skip the comma. */
948 ++input_line_pointer;
252b5132
RH
949 SKIP_WHITESPACE ();
950
951 if (*input_line_pointer == '"')
952 {
9de8d8f1
RH
953 beg = demand_copy_C_string (&dummy);
954 if (beg == NULL)
252b5132 955 {
9de8d8f1
RH
956 ignore_rest_of_line ();
957 return;
252b5132 958 }
9de8d8f1 959 attr |= obj_elf_parse_section_letters (beg, strlen (beg));
252b5132
RH
960
961 SKIP_WHITESPACE ();
962 if (*input_line_pointer == ',')
963 {
9de8d8f1 964 char c;
060adf0e
AM
965 char *save = input_line_pointer;
966
252b5132
RH
967 ++input_line_pointer;
968 SKIP_WHITESPACE ();
9de8d8f1
RH
969 c = *input_line_pointer;
970 if (c == '"')
252b5132 971 {
9de8d8f1
RH
972 beg = demand_copy_C_string (&dummy);
973 if (beg == NULL)
252b5132 974 {
9de8d8f1
RH
975 ignore_rest_of_line ();
976 return;
252b5132 977 }
9de8d8f1 978 type = obj_elf_section_type (beg, strlen (beg));
9de8d8f1
RH
979 }
980 else if (c == '@' || c == '%')
981 {
982 beg = ++input_line_pointer;
983 c = get_symbol_end ();
984 *input_line_pointer = c;
985 type = obj_elf_section_type (beg, input_line_pointer - beg);
252b5132 986 }
060adf0e
AM
987 else
988 input_line_pointer = save;
252b5132 989 }
f5fa8ca2
JJ
990
991 SKIP_WHITESPACE ();
6ce8b369 992 if ((attr & SHF_MERGE) != 0 && *input_line_pointer == ',')
f5fa8ca2
JJ
993 {
994 ++input_line_pointer;
995 SKIP_WHITESPACE ();
996 entsize = get_absolute_expression ();
6ce8b369 997 SKIP_WHITESPACE ();
f5fa8ca2
JJ
998 if (entsize < 0)
999 {
6ce8b369 1000 as_warn (_("invalid merge entity size"));
f5fa8ca2
JJ
1001 attr &= ~SHF_MERGE;
1002 entsize = 0;
1003 }
1004 }
6ce8b369
AM
1005 else if ((attr & SHF_MERGE) != 0)
1006 {
1007 as_warn (_("entity size for SHF_MERGE not specified"));
1008 attr &= ~SHF_MERGE;
1009 }
060adf0e
AM
1010
1011 if ((attr & SHF_GROUP) != 0 && *input_line_pointer == ',')
1012 {
1013 ++input_line_pointer;
aa1f4858
AM
1014 group_name = obj_elf_section_name ();
1015 if (group_name == NULL)
060adf0e 1016 attr &= ~SHF_GROUP;
d2dab548
AM
1017 else if (strncmp (input_line_pointer, ",comdat", 7) == 0)
1018 {
1019 input_line_pointer += 7;
1020 linkonce = 1;
1021 }
1022 else if (strncmp (name, ".gnu.linkonce", 13) == 0)
1023 linkonce = 1;
060adf0e
AM
1024 }
1025 else if ((attr & SHF_GROUP) != 0)
1026 {
1027 as_warn (_("group name for SHF_GROUP not specified"));
1028 attr &= ~SHF_GROUP;
1029 }
252b5132
RH
1030 }
1031 else
1032 {
1033 do
1034 {
9de8d8f1
RH
1035 char c;
1036
252b5132
RH
1037 SKIP_WHITESPACE ();
1038 if (*input_line_pointer != '#')
1039 {
6ce8b369 1040 as_warn (_("character following name is not '#'"));
252b5132
RH
1041 ignore_rest_of_line ();
1042 return;
1043 }
9de8d8f1
RH
1044 beg = ++input_line_pointer;
1045 c = get_symbol_end ();
1046 *input_line_pointer = c;
1047
1048 attr |= obj_elf_section_word (beg, input_line_pointer - beg);
1049
252b5132
RH
1050 SKIP_WHITESPACE ();
1051 }
1052 while (*input_line_pointer++ == ',');
1053 --input_line_pointer;
1054 }
1055 }
1056
252b5132 1057 demand_empty_rest_of_line ();
9de8d8f1 1058
d2dab548 1059 obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push);
252b5132
RH
1060}
1061
1062/* Change to the .data section. */
1063
16b93d88 1064void
252b5132
RH
1065obj_elf_data (i)
1066 int i;
1067{
1068#ifdef md_flush_pending_output
1069 md_flush_pending_output ();
1070#endif
1071
1072 previous_section = now_seg;
1073 previous_subsection = now_subseg;
1074 s_data (i);
1075
1076#ifdef md_elf_section_change_hook
1077 md_elf_section_change_hook ();
1078#endif
1079}
1080
1081/* Change to the .text section. */
1082
16b93d88 1083void
252b5132
RH
1084obj_elf_text (i)
1085 int i;
1086{
1087#ifdef md_flush_pending_output
1088 md_flush_pending_output ();
1089#endif
1090
1091 previous_section = now_seg;
1092 previous_subsection = now_subseg;
1093 s_text (i);
1094
1095#ifdef md_elf_section_change_hook
1096 md_elf_section_change_hook ();
1097#endif
1098}
1099
1100static void
1101obj_elf_subsection (ignore)
ab9da554 1102 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1103{
1104 register int temp;
1105
1106#ifdef md_flush_pending_output
1107 md_flush_pending_output ();
1108#endif
1109
1110 previous_section = now_seg;
1111 previous_subsection = now_subseg;
1112
1113 temp = get_absolute_expression ();
1114 subseg_set (now_seg, (subsegT) temp);
1115 demand_empty_rest_of_line ();
1116
1117#ifdef md_elf_section_change_hook
1118 md_elf_section_change_hook ();
1119#endif
1120}
1121
1122/* This can be called from the processor backends if they change
1123 sections. */
1124
1125void
1126obj_elf_section_change_hook ()
1127{
1128 previous_section = now_seg;
1129 previous_subsection = now_subseg;
1130}
1131
1132void
1133obj_elf_previous (ignore)
ab9da554 1134 int ignore ATTRIBUTE_UNUSED;
252b5132 1135{
9de8d8f1
RH
1136 segT new_section;
1137 int new_subsection;
1138
252b5132
RH
1139 if (previous_section == 0)
1140 {
6ce8b369 1141 as_warn (_(".previous without corresponding .section; ignored"));
252b5132
RH
1142 return;
1143 }
1144
1145#ifdef md_flush_pending_output
1146 md_flush_pending_output ();
1147#endif
1148
9de8d8f1
RH
1149 new_section = previous_section;
1150 new_subsection = previous_subsection;
1151 previous_section = now_seg;
1152 previous_subsection = now_subseg;
1153 subseg_set (new_section, new_subsection);
1154
1155#ifdef md_elf_section_change_hook
1156 md_elf_section_change_hook ();
1157#endif
1158}
1159
1160static void
1161obj_elf_popsection (xxx)
ab9da554 1162 int xxx ATTRIBUTE_UNUSED;
9de8d8f1
RH
1163{
1164 struct section_stack *top = section_stack;
1165
1166 if (top == NULL)
1167 {
6ce8b369 1168 as_warn (_(".popsection without corresponding .pushsection; ignored"));
9de8d8f1
RH
1169 return;
1170 }
1171
1172#ifdef md_flush_pending_output
1173 md_flush_pending_output ();
1174#endif
1175
1176 section_stack = top->next;
1177 previous_section = top->prev_seg;
1178 previous_subsection = top->prev_subseg;
1179 subseg_set (top->seg, top->subseg);
1180 free (top);
252b5132
RH
1181
1182#ifdef md_elf_section_change_hook
1183 md_elf_section_change_hook ();
1184#endif
1185}
1186
1187static void
1188obj_elf_line (ignore)
ab9da554 1189 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1190{
1191 /* Assume delimiter is part of expression. BSD4.2 as fails with
bf514e21 1192 delightful bug, so we are not being incompatible here. */
252b5132
RH
1193 new_logical_line ((char *) NULL, (int) (get_absolute_expression ()));
1194 demand_empty_rest_of_line ();
1195}
1196
1197/* This handles the .symver pseudo-op, which is used to specify a
1198 symbol version. The syntax is ``.symver NAME,SYMVERNAME''.
1199 SYMVERNAME may contain ELF_VER_CHR ('@') characters. This
1200 pseudo-op causes the assembler to emit a symbol named SYMVERNAME
1201 with the same value as the symbol NAME. */
1202
1203static void
1204obj_elf_symver (ignore)
ab9da554 1205 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1206{
1207 char *name;
1208 char c;
468cced8 1209 char old_lexat;
252b5132
RH
1210 symbolS *sym;
1211
1212 name = input_line_pointer;
1213 c = get_symbol_end ();
1214
1215 sym = symbol_find_or_make (name);
1216
1217 *input_line_pointer = c;
1218
252b5132
RH
1219 SKIP_WHITESPACE ();
1220 if (*input_line_pointer != ',')
1221 {
1222 as_bad (_("expected comma after name in .symver"));
1223 ignore_rest_of_line ();
1224 return;
1225 }
1226
1227 ++input_line_pointer;
eba874d8 1228 SKIP_WHITESPACE ();
252b5132 1229 name = input_line_pointer;
468cced8
AM
1230
1231 /* Temporarily include '@' in symbol names. */
1232 old_lexat = lex_type[(unsigned char) '@'];
1233 lex_type[(unsigned char) '@'] |= LEX_NAME;
1234 c = get_symbol_end ();
1235 lex_type[(unsigned char) '@'] = old_lexat;
252b5132 1236
339681c0
L
1237 if (symbol_get_obj (sym)->versioned_name == NULL)
1238 {
1239 symbol_get_obj (sym)->versioned_name = xstrdup (name);
252b5132 1240
339681c0 1241 *input_line_pointer = c;
252b5132 1242
6f620856
L
1243 if (strchr (symbol_get_obj (sym)->versioned_name,
1244 ELF_VER_CHR) == NULL)
339681c0
L
1245 {
1246 as_bad (_("missing version name in `%s' for symbol `%s'"),
1247 symbol_get_obj (sym)->versioned_name,
1248 S_GET_NAME (sym));
1249 ignore_rest_of_line ();
1250 return;
1251 }
1252 }
1253 else
252b5132 1254 {
339681c0
L
1255 if (strcmp (symbol_get_obj (sym)->versioned_name, name))
1256 {
1257 as_bad (_("multiple versions [`%s'|`%s'] for symbol `%s'"),
1258 name, symbol_get_obj (sym)->versioned_name,
1259 S_GET_NAME (sym));
1260 ignore_rest_of_line ();
1261 return;
1262 }
1263
1264 *input_line_pointer = c;
252b5132
RH
1265 }
1266
1267 demand_empty_rest_of_line ();
1268}
1269
1270/* This handles the .vtable_inherit pseudo-op, which is used to indicate
1271 to the linker the hierarchy in which a particular table resides. The
1272 syntax is ".vtable_inherit CHILDNAME, PARENTNAME". */
1273
904a31bf 1274struct fix *
252b5132 1275obj_elf_vtable_inherit (ignore)
ab9da554 1276 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1277{
1278 char *cname, *pname;
1279 symbolS *csym, *psym;
1280 char c, bad = 0;
1281
1282 if (*input_line_pointer == '#')
1283 ++input_line_pointer;
1284
1285 cname = input_line_pointer;
1286 c = get_symbol_end ();
1287 csym = symbol_find (cname);
1288
1289 /* GCFIXME: should check that we don't have two .vtable_inherits for
1290 the same child symbol. Also, we can currently only do this if the
1291 child symbol is already exists and is placed in a fragment. */
1292
49309057 1293 if (csym == NULL || symbol_get_frag (csym) == NULL)
252b5132
RH
1294 {
1295 as_bad ("expected `%s' to have already been set for .vtable_inherit",
1296 cname);
1297 bad = 1;
1298 }
1299
1300 *input_line_pointer = c;
1301
1302 SKIP_WHITESPACE ();
1303 if (*input_line_pointer != ',')
1304 {
1305 as_bad ("expected comma after name in .vtable_inherit");
1306 ignore_rest_of_line ();
904a31bf 1307 return NULL;
252b5132
RH
1308 }
1309
1310 ++input_line_pointer;
1311 SKIP_WHITESPACE ();
1312
1313 if (*input_line_pointer == '#')
1314 ++input_line_pointer;
1315
1316 if (input_line_pointer[0] == '0'
1317 && (input_line_pointer[1] == '\0'
3882b010 1318 || ISSPACE (input_line_pointer[1])))
252b5132
RH
1319 {
1320 psym = section_symbol (absolute_section);
1321 ++input_line_pointer;
1322 }
1323 else
1324 {
1325 pname = input_line_pointer;
1326 c = get_symbol_end ();
1327 psym = symbol_find_or_make (pname);
1328 *input_line_pointer = c;
1329 }
1330
1331 demand_empty_rest_of_line ();
1332
1333 if (bad)
904a31bf 1334 return NULL;
252b5132 1335
49309057 1336 assert (symbol_get_value_expression (csym)->X_op == O_constant);
904a31bf
AM
1337 return fix_new (symbol_get_frag (csym),
1338 symbol_get_value_expression (csym)->X_add_number,
1339 0, psym, 0, 0, BFD_RELOC_VTABLE_INHERIT);
252b5132 1340}
fa306131 1341
252b5132
RH
1342/* This handles the .vtable_entry pseudo-op, which is used to indicate
1343 to the linker that a vtable slot was used. The syntax is
1344 ".vtable_entry tablename, offset". */
1345
904a31bf 1346struct fix *
252b5132 1347obj_elf_vtable_entry (ignore)
ab9da554 1348 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1349{
1350 char *name;
1351 symbolS *sym;
1352 offsetT offset;
1353 char c;
1354
1355 if (*input_line_pointer == '#')
1356 ++input_line_pointer;
1357
1358 name = input_line_pointer;
1359 c = get_symbol_end ();
1360 sym = symbol_find_or_make (name);
1361 *input_line_pointer = c;
1362
1363 SKIP_WHITESPACE ();
1364 if (*input_line_pointer != ',')
1365 {
1366 as_bad ("expected comma after name in .vtable_entry");
1367 ignore_rest_of_line ();
904a31bf 1368 return NULL;
252b5132
RH
1369 }
1370
1371 ++input_line_pointer;
1372 if (*input_line_pointer == '#')
1373 ++input_line_pointer;
1374
1375 offset = get_absolute_expression ();
1376
252b5132 1377 demand_empty_rest_of_line ();
904a31bf
AM
1378
1379 return fix_new (frag_now, frag_now_fix (), 0, sym, offset, 0,
1380 BFD_RELOC_VTABLE_ENTRY);
252b5132
RH
1381}
1382
1383void
4c63da97 1384elf_obj_read_begin_hook ()
252b5132
RH
1385{
1386#ifdef NEED_ECOFF_DEBUG
1387 if (ECOFF_DEBUGGING)
1388 ecoff_read_begin_hook ();
1389#endif
1390}
1391
1392void
4c63da97 1393elf_obj_symbol_new_hook (symbolP)
252b5132
RH
1394 symbolS *symbolP;
1395{
49309057
ILT
1396 struct elf_obj_sy *sy_obj;
1397
1398 sy_obj = symbol_get_obj (symbolP);
1399 sy_obj->size = NULL;
1400 sy_obj->versioned_name = NULL;
252b5132
RH
1401
1402#ifdef NEED_ECOFF_DEBUG
1403 if (ECOFF_DEBUGGING)
1404 ecoff_symbol_new_hook (symbolP);
1405#endif
1406}
1407
8fd3e36b
AM
1408/* When setting one symbol equal to another, by default we probably
1409 want them to have the same "size", whatever it means in the current
1410 context. */
1411
1412void
1413elf_copy_symbol_attributes (dest, src)
1414 symbolS *dest, *src;
1415{
060adf0e
AM
1416 struct elf_obj_sy *srcelf = symbol_get_obj (src);
1417 struct elf_obj_sy *destelf = symbol_get_obj (dest);
1418 if (srcelf->size)
1419 {
1420 if (destelf->size == NULL)
1421 destelf->size =
1422 (expressionS *) xmalloc (sizeof (expressionS));
1423 *destelf->size = *srcelf->size;
1424 }
1425 else
1426 {
1427 if (destelf->size != NULL)
1428 free (destelf->size);
1429 destelf->size = NULL;
1430 }
1431 S_SET_SIZE (dest, S_GET_SIZE (src));
26eb4093
JJ
1432 /* Don't copy visibility. */
1433 S_SET_OTHER (dest, (ELF_ST_VISIBILITY (S_GET_OTHER (dest))
1434 | (S_GET_OTHER (src) & ~ELF_ST_VISIBILITY (-1))));
8fd3e36b
AM
1435}
1436
252b5132
RH
1437void
1438obj_elf_version (ignore)
ab9da554 1439 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1440{
1441 char *name;
1442 unsigned int c;
252b5132
RH
1443 char *p;
1444 asection *seg = now_seg;
1445 subsegT subseg = now_subseg;
1446 Elf_Internal_Note i_note;
1447 Elf_External_Note e_note;
1448 asection *note_secp = (asection *) NULL;
e4afe742 1449 int len;
252b5132
RH
1450
1451 SKIP_WHITESPACE ();
1452 if (*input_line_pointer == '\"')
1453 {
bf514e21 1454 ++input_line_pointer; /* -> 1st char of string. */
252b5132
RH
1455 name = input_line_pointer;
1456
1457 while (is_a_char (c = next_char_of_string ()))
1458 ;
1459 c = *input_line_pointer;
1460 *input_line_pointer = '\0';
1461 *(input_line_pointer - 1) = '\0';
1462 *input_line_pointer = c;
1463
1464 /* create the .note section */
1465
1466 note_secp = subseg_new (".note", 0);
1467 bfd_set_section_flags (stdoutput,
1468 note_secp,
1469 SEC_HAS_CONTENTS | SEC_READONLY);
1470
1471 /* process the version string */
1472
1473 len = strlen (name);
1474
1475 i_note.namesz = ((len + 1) + 3) & ~3; /* round this to word boundary */
1476 i_note.descsz = 0; /* no description */
1477 i_note.type = NT_VERSION;
1478 p = frag_more (sizeof (e_note.namesz));
e4afe742 1479 md_number_to_chars (p, (valueT) i_note.namesz, sizeof (e_note.namesz));
252b5132 1480 p = frag_more (sizeof (e_note.descsz));
e4afe742 1481 md_number_to_chars (p, (valueT) i_note.descsz, sizeof (e_note.descsz));
252b5132 1482 p = frag_more (sizeof (e_note.type));
e4afe742
AM
1483 md_number_to_chars (p, (valueT) i_note.type, sizeof (e_note.type));
1484 p = frag_more (len + 1);
1485 strcpy (p, name);
252b5132 1486
252b5132
RH
1487 frag_align (2, 0, 0);
1488
1489 subseg_set (seg, subseg);
1490 }
1491 else
1492 {
6ce8b369 1493 as_bad (_("expected quoted string"));
252b5132
RH
1494 }
1495 demand_empty_rest_of_line ();
1496}
1497
1498static void
1499obj_elf_size (ignore)
ab9da554 1500 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1501{
1502 char *name = input_line_pointer;
1503 char c = get_symbol_end ();
1504 char *p;
1505 expressionS exp;
1506 symbolS *sym;
1507
1508 p = input_line_pointer;
1509 *p = c;
1510 SKIP_WHITESPACE ();
1511 if (*input_line_pointer != ',')
1512 {
1513 *p = 0;
1514 as_bad (_("expected comma after name `%s' in .size directive"), name);
1515 *p = c;
1516 ignore_rest_of_line ();
1517 return;
1518 }
1519 input_line_pointer++;
1520 expression (&exp);
1521 if (exp.X_op == O_absent)
1522 {
1523 as_bad (_("missing expression in .size directive"));
1524 exp.X_op = O_constant;
1525 exp.X_add_number = 0;
1526 }
1527 *p = 0;
1528 sym = symbol_find_or_make (name);
1529 *p = c;
1530 if (exp.X_op == O_constant)
c538998c
JJ
1531 {
1532 S_SET_SIZE (sym, exp.X_add_number);
1533 if (symbol_get_obj (sym)->size)
1534 {
1535 xfree (symbol_get_obj (sym)->size);
1536 symbol_get_obj (sym)->size = NULL;
1537 }
1538 }
252b5132
RH
1539 else
1540 {
49309057
ILT
1541 symbol_get_obj (sym)->size =
1542 (expressionS *) xmalloc (sizeof (expressionS));
1543 *symbol_get_obj (sym)->size = exp;
252b5132
RH
1544 }
1545 demand_empty_rest_of_line ();
1546}
1547
1548/* Handle the ELF .type pseudo-op. This sets the type of a symbol.
aa8c34c3 1549 There are five syntaxes:
fa306131 1550
252b5132
RH
1551 The first (used on Solaris) is
1552 .type SYM,#function
1553 The second (used on UnixWare) is
1554 .type SYM,@function
1555 The third (reportedly to be used on Irix 6.0) is
1556 .type SYM STT_FUNC
1557 The fourth (used on NetBSD/Arm and Linux/ARM) is
1558 .type SYM,%function
aa8c34c3
JE
1559 The fifth (used on SVR4/860) is
1560 .type SYM,"function"
252b5132
RH
1561 */
1562
1563static void
1564obj_elf_type (ignore)
ab9da554 1565 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1566{
1567 char *name;
1568 char c;
1569 int type;
1570 const char *typename;
1571 symbolS *sym;
904a31bf 1572 elf_symbol_type *elfsym;
252b5132
RH
1573
1574 name = input_line_pointer;
1575 c = get_symbol_end ();
1576 sym = symbol_find_or_make (name);
904a31bf 1577 elfsym = (elf_symbol_type *) symbol_get_bfdsym (sym);
252b5132
RH
1578 *input_line_pointer = c;
1579
1580 SKIP_WHITESPACE ();
1581 if (*input_line_pointer == ',')
1582 ++input_line_pointer;
1583
1584 SKIP_WHITESPACE ();
1585 if ( *input_line_pointer == '#'
1586 || *input_line_pointer == '@'
aa8c34c3 1587 || *input_line_pointer == '"'
252b5132
RH
1588 || *input_line_pointer == '%')
1589 ++input_line_pointer;
1590
1591 typename = input_line_pointer;
1592 c = get_symbol_end ();
1593
1594 type = 0;
1595 if (strcmp (typename, "function") == 0
1596 || strcmp (typename, "STT_FUNC") == 0)
1597 type = BSF_FUNCTION;
1598 else if (strcmp (typename, "object") == 0
1599 || strcmp (typename, "STT_OBJECT") == 0)
1600 type = BSF_OBJECT;
b9734f35
JJ
1601 else if (strcmp (typename, "tls_object") == 0
1602 || strcmp (typename, "STT_TLS") == 0)
1603 type = BSF_OBJECT | BSF_THREAD_LOCAL;
e7b9a8c1
L
1604 else if (strcmp (typename, "notype") == 0
1605 || strcmp (typename, "STT_NOTYPE") == 0)
1606 ;
904a31bf
AM
1607#ifdef md_elf_symbol_type
1608 else if ((type = md_elf_symbol_type (typename, sym, elfsym)) != -1)
1609 ;
1610#endif
252b5132 1611 else
6ce8b369 1612 as_bad (_("unrecognized symbol type \"%s\""), typename);
252b5132
RH
1613
1614 *input_line_pointer = c;
1615
aa8c34c3
JE
1616 if (*input_line_pointer == '"')
1617 ++input_line_pointer;
1618
904a31bf 1619 elfsym->symbol.flags |= type;
252b5132
RH
1620
1621 demand_empty_rest_of_line ();
1622}
1623
1624static void
1625obj_elf_ident (ignore)
ab9da554 1626 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1627{
1628 static segT comment_section;
1629 segT old_section = now_seg;
1630 int old_subsection = now_subseg;
1631
5f91fe03
ILT
1632#ifdef md_flush_pending_output
1633 md_flush_pending_output ();
1634#endif
1635
252b5132
RH
1636 if (!comment_section)
1637 {
1638 char *p;
1639 comment_section = subseg_new (".comment", 0);
1640 bfd_set_section_flags (stdoutput, comment_section,
1641 SEC_READONLY | SEC_HAS_CONTENTS);
1642 p = frag_more (1);
1643 *p = 0;
1644 }
1645 else
1646 subseg_set (comment_section, 0);
1647 stringer (1);
1648 subseg_set (old_section, old_subsection);
1649}
1650
1651#ifdef INIT_STAB_SECTION
1652
1653/* The first entry in a .stabs section is special. */
1654
1655void
1656obj_elf_init_stab_section (seg)
1657 segT seg;
1658{
1659 char *file;
1660 char *p;
1661 char *stabstr_name;
1662 unsigned int stroff;
1663
1664 /* Force the section to align to a longword boundary. Without this,
1665 UnixWare ar crashes. */
1666 bfd_set_section_alignment (stdoutput, seg, 2);
1667
bf514e21 1668 /* Make space for this first symbol. */
252b5132 1669 p = frag_more (12);
bf514e21 1670 /* Zero it out. */
252b5132
RH
1671 memset (p, 0, 12);
1672 as_where (&file, (unsigned int *) NULL);
f91fafbd 1673 stabstr_name = (char *) xmalloc (strlen (segment_name (seg)) + 4);
252b5132
RH
1674 strcpy (stabstr_name, segment_name (seg));
1675 strcat (stabstr_name, "str");
1676 stroff = get_stab_string_offset (file, stabstr_name);
1677 know (stroff == 1);
1678 md_number_to_chars (p, stroff, 4);
1679 seg_info (seg)->stabu.p = p;
1680}
1681
1682#endif
1683
1684/* Fill in the counts in the first entry in a .stabs section. */
1685
1686static void
1687adjust_stab_sections (abfd, sec, xxx)
1688 bfd *abfd;
1689 asection *sec;
ab9da554 1690 PTR xxx ATTRIBUTE_UNUSED;
252b5132
RH
1691{
1692 char *name;
1693 asection *strsec;
1694 char *p;
1695 int strsz, nsyms;
1696
1697 if (strncmp (".stab", sec->name, 5))
1698 return;
1699 if (!strcmp ("str", sec->name + strlen (sec->name) - 3))
1700 return;
1701
1702 name = (char *) alloca (strlen (sec->name) + 4);
1703 strcpy (name, sec->name);
1704 strcat (name, "str");
1705 strsec = bfd_get_section_by_name (abfd, name);
1706 if (strsec)
1707 strsz = bfd_section_size (abfd, strsec);
1708 else
1709 strsz = 0;
1710 nsyms = bfd_section_size (abfd, sec) / 12 - 1;
1711
1712 p = seg_info (sec)->stabu.p;
1713 assert (p != 0);
1714
1715 bfd_h_put_16 (abfd, (bfd_vma) nsyms, (bfd_byte *) p + 6);
1716 bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8);
1717}
1718
1719#ifdef NEED_ECOFF_DEBUG
1720
1721/* This function is called by the ECOFF code. It is supposed to
1722 record the external symbol information so that the backend can
1723 write it out correctly. The ELF backend doesn't actually handle
1724 this at the moment, so we do it ourselves. We save the information
1725 in the symbol. */
1726
1727void
1728elf_ecoff_set_ext (sym, ext)
1729 symbolS *sym;
1730 struct ecoff_extr *ext;
1731{
49309057 1732 symbol_get_bfdsym (sym)->udata.p = (PTR) ext;
252b5132
RH
1733}
1734
1735/* This function is called by bfd_ecoff_debug_externals. It is
1736 supposed to *EXT to the external symbol information, and return
1737 whether the symbol should be used at all. */
1738
b34976b6 1739static bfd_boolean
252b5132
RH
1740elf_get_extr (sym, ext)
1741 asymbol *sym;
1742 EXTR *ext;
1743{
1744 if (sym->udata.p == NULL)
b34976b6 1745 return FALSE;
252b5132 1746 *ext = *(EXTR *) sym->udata.p;
b34976b6 1747 return TRUE;
252b5132
RH
1748}
1749
1750/* This function is called by bfd_ecoff_debug_externals. It has
1751 nothing to do for ELF. */
1752
1753/*ARGSUSED*/
1754static void
1755elf_set_index (sym, indx)
5f91fe03
ILT
1756 asymbol *sym ATTRIBUTE_UNUSED;
1757 bfd_size_type indx ATTRIBUTE_UNUSED;
252b5132
RH
1758{
1759}
1760
1761#endif /* NEED_ECOFF_DEBUG */
1762
1763void
1764elf_frob_symbol (symp, puntp)
1765 symbolS *symp;
1766 int *puntp;
1767{
49309057
ILT
1768 struct elf_obj_sy *sy_obj;
1769
252b5132
RH
1770#ifdef NEED_ECOFF_DEBUG
1771 if (ECOFF_DEBUGGING)
1772 ecoff_frob_symbol (symp);
1773#endif
1774
49309057
ILT
1775 sy_obj = symbol_get_obj (symp);
1776
1777 if (sy_obj->size != NULL)
252b5132 1778 {
49309057 1779 switch (sy_obj->size->X_op)
252b5132
RH
1780 {
1781 case O_subtract:
1782 S_SET_SIZE (symp,
49309057
ILT
1783 (S_GET_VALUE (sy_obj->size->X_add_symbol)
1784 + sy_obj->size->X_add_number
1785 - S_GET_VALUE (sy_obj->size->X_op_symbol)));
252b5132
RH
1786 break;
1787 case O_constant:
1788 S_SET_SIZE (symp,
49309057
ILT
1789 (S_GET_VALUE (sy_obj->size->X_add_symbol)
1790 + sy_obj->size->X_add_number));
252b5132
RH
1791 break;
1792 default:
1793 as_bad (_(".size expression too complicated to fix up"));
1794 break;
1795 }
49309057
ILT
1796 free (sy_obj->size);
1797 sy_obj->size = NULL;
252b5132
RH
1798 }
1799
49309057 1800 if (sy_obj->versioned_name != NULL)
252b5132 1801 {
79082ff0
L
1802 char *p;
1803
1804 p = strchr (sy_obj->versioned_name, ELF_VER_CHR);
1805 know (p != NULL);
1806
252b5132
RH
1807 /* This symbol was given a new name with the .symver directive.
1808
1809 If this is an external reference, just rename the symbol to
1810 include the version string. This will make the relocs be
1811 against the correct versioned symbol.
1812
1813 If this is a definition, add an alias. FIXME: Using an alias
1814 will permit the debugging information to refer to the right
1815 symbol. However, it's not clear whether it is the best
1816 approach. */
1817
1818 if (! S_IS_DEFINED (symp))
1819 {
252b5132
RH
1820 /* Verify that the name isn't using the @@ syntax--this is
1821 reserved for definitions of the default version to link
1822 against. */
252b5132
RH
1823 if (p[1] == ELF_VER_CHR)
1824 {
1825 as_bad (_("invalid attempt to declare external version name as default in symbol `%s'"),
49309057 1826 sy_obj->versioned_name);
b34976b6 1827 *puntp = TRUE;
252b5132 1828 }
49309057 1829 S_SET_NAME (symp, sy_obj->versioned_name);
252b5132
RH
1830 }
1831 else
1832 {
79082ff0
L
1833 if (p [1] == ELF_VER_CHR && p [2] == ELF_VER_CHR)
1834 {
1835 size_t l;
1836
1837 /* The @@@ syntax is a special case. It renames the
1838 symbol name to versioned_name with one `@' removed. */
1839 l = strlen (&p[3]) + 1;
1840 memmove (&p [2], &p[3], l);
1841 S_SET_NAME (symp, sy_obj->versioned_name);
1842 }
1843 else
1844 {
1845 symbolS *symp2;
252b5132 1846
79082ff0
L
1847 /* FIXME: Creating a new symbol here is risky. We're
1848 in the final loop over the symbol table. We can
1849 get away with it only because the symbol goes to
1850 the end of the list, where the loop will still see
1851 it. It would probably be better to do this in
1852 obj_frob_file_before_adjust. */
252b5132 1853
79082ff0 1854 symp2 = symbol_find_or_make (sy_obj->versioned_name);
252b5132 1855
79082ff0 1856 /* Now we act as though we saw symp2 = sym. */
252b5132 1857
79082ff0 1858 S_SET_SEGMENT (symp2, S_GET_SEGMENT (symp));
252b5132 1859
79082ff0
L
1860 /* Subtracting out the frag address here is a hack
1861 because we are in the middle of the final loop. */
1862 S_SET_VALUE (symp2,
1863 (S_GET_VALUE (symp)
1864 - symbol_get_frag (symp)->fr_address));
252b5132 1865
79082ff0 1866 symbol_set_frag (symp2, symbol_get_frag (symp));
252b5132 1867
79082ff0
L
1868 /* This will copy over the size information. */
1869 copy_symbol_attributes (symp2, symp);
252b5132 1870
26eb4093
JJ
1871 S_SET_OTHER (symp2, S_GET_OTHER (symp));
1872
79082ff0
L
1873 if (S_IS_WEAK (symp))
1874 S_SET_WEAK (symp2);
252b5132 1875
79082ff0
L
1876 if (S_IS_EXTERNAL (symp))
1877 S_SET_EXTERNAL (symp2);
1878 }
252b5132
RH
1879 }
1880 }
1881
1882 /* Double check weak symbols. */
49309057 1883 if (S_IS_WEAK (symp))
252b5132
RH
1884 {
1885 if (S_IS_COMMON (symp))
6ce8b369 1886 as_bad (_("symbol `%s' can not be both weak and common"),
252b5132
RH
1887 S_GET_NAME (symp));
1888 }
1889
1890#ifdef TC_MIPS
1891 /* The Irix 5 and 6 assemblers set the type of any common symbol and
1892 any undefined non-function symbol to STT_OBJECT. We try to be
1893 compatible, since newer Irix 5 and 6 linkers care. However, we
1894 only set undefined symbols to be STT_OBJECT if we are on Irix,
1895 because that is the only time gcc will generate the necessary
1896 .global directives to mark functions. */
1897
1898 if (S_IS_COMMON (symp))
49309057 1899 symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
252b5132
RH
1900
1901 if (strstr (TARGET_OS, "irix") != NULL
49309057
ILT
1902 && ! S_IS_DEFINED (symp)
1903 && (symbol_get_bfdsym (symp)->flags & BSF_FUNCTION) == 0)
1904 symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
252b5132
RH
1905#endif
1906
c5e54cc2
ILT
1907#if 0 /* TC_PPC */
1908 /* If TC_PPC is defined, we used to force the type of a symbol to be
1909 BSF_OBJECT if it was otherwise unset. This was required by some
1910 version of VxWorks. Thomas de Lellis <tdel@windriver.com> says
1911 that this is no longer needed, so it is now commented out. */
49309057
ILT
1912 if ((symbol_get_bfdsym (symp)->flags
1913 & (BSF_FUNCTION | BSF_FILE | BSF_SECTION_SYM)) == 0
252b5132 1914 && S_IS_DEFINED (symp))
49309057 1915 symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
252b5132
RH
1916#endif
1917}
1918
060adf0e
AM
1919struct group_list
1920{
1921 asection **head; /* Section lists. */
1922 unsigned int *elt_count; /* Number of sections in each list. */
1923 unsigned int num_group; /* Number of lists. */
1924};
1925
1926/* Called via bfd_map_over_sections. If SEC is a member of a group,
1927 add it to a list of sections belonging to the group. INF is a
1928 pointer to a struct group_list, which is where we store the head of
1929 each list. */
1930
1931static void
1932build_group_lists (abfd, sec, inf)
1933 bfd *abfd ATTRIBUTE_UNUSED;
1934 asection *sec;
1935 PTR inf;
1936{
1937 struct group_list *list = (struct group_list *) inf;
aa1f4858 1938 const char *group_name = elf_group_name (sec);
060adf0e
AM
1939 unsigned int i;
1940
1941 if (group_name == NULL)
1942 return;
1943
1944 /* If this group already has a list, add the section to the head of
1945 the list. */
1946 for (i = 0; i < list->num_group; i++)
1947 {
aa1f4858 1948 if (strcmp (group_name, elf_group_name (list->head[i])) == 0)
060adf0e 1949 {
aa1f4858 1950 elf_next_in_group (sec) = list->head[i];
060adf0e
AM
1951 list->head[i] = sec;
1952 list->elt_count[i] += 1;
1953 return;
1954 }
1955 }
1956
1957 /* New group. Make the arrays bigger in chunks to minimize calls to
1958 realloc. */
1959 i = list->num_group;
1960 if ((i & 127) == 0)
1961 {
1962 unsigned int newsize = i + 128;
1963 list->head = xrealloc (list->head, newsize * sizeof (*list->head));
1964 list->elt_count = xrealloc (list->elt_count,
1965 newsize * sizeof (*list->elt_count));
1966 }
1967 list->head[i] = sec;
1968 list->elt_count[i] = 1;
1969 list->num_group += 1;
1970}
1971
252b5132
RH
1972void
1973elf_frob_file ()
1974{
060adf0e
AM
1975 struct group_list list;
1976 unsigned int i;
1977
252b5132
RH
1978 bfd_map_over_sections (stdoutput, adjust_stab_sections, (PTR) 0);
1979
060adf0e
AM
1980 /* Go find section groups. */
1981 list.num_group = 0;
1982 list.head = NULL;
1983 list.elt_count = NULL;
1984 bfd_map_over_sections (stdoutput, build_group_lists, (PTR) &list);
1985
1986 /* Make the SHT_GROUP sections that describe each section group. We
1987 can't set up the section contents here yet, because elf section
1988 indices have yet to be calculated. elf.c:set_group_contents does
1989 the rest of the work. */
1990 for (i = 0; i < list.num_group; i++)
1991 {
aa1f4858 1992 const char *group_name = elf_group_name (list.head[i]);
9758f3fc 1993 const char *sec_name;
060adf0e
AM
1994 asection *s;
1995 flagword flags;
9758f3fc
AM
1996 struct symbol *sy;
1997 int has_sym;
060adf0e 1998
060adf0e 1999 flags = SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_GROUP;
d2dab548 2000 for (s = list.head[i]; s != NULL; s = elf_next_in_group (s))
68bfbfcc 2001 if ((s->flags ^ flags) & SEC_LINK_ONCE)
d2dab548
AM
2002 {
2003 flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
2004 if (s != list.head[i])
2005 {
2006 as_warn (_("assuming all members of group `%s' are COMDAT"),
2007 group_name);
2008 break;
2009 }
2010 }
2011
9758f3fc
AM
2012 sec_name = group_name;
2013 sy = symbol_find_exact (group_name);
2014 has_sym = 0;
2015 if (sy != NULL
2016 && (sy == symbol_lastP
2017 || (sy->sy_next != NULL
2018 && sy->sy_next->sy_previous == sy)))
2019 {
2020 has_sym = 1;
2021 sec_name = ".group";
2022 }
2023 s = subseg_force_new (sec_name, 0);
060adf0e
AM
2024 if (s == NULL
2025 || !bfd_set_section_flags (stdoutput, s, flags)
2026 || !bfd_set_section_alignment (stdoutput, s, 2))
2027 {
2028 as_fatal (_("can't create group: %s"),
2029 bfd_errmsg (bfd_get_error ()));
2030 }
2f89ff8d 2031 elf_section_type (s) = SHT_GROUP;
060adf0e 2032
aa1f4858
AM
2033 /* Pass a pointer to the first section in this group. */
2034 elf_next_in_group (s) = list.head[i];
9758f3fc
AM
2035 if (has_sym)
2036 elf_group_id (s) = sy->bsym;
060adf0e
AM
2037
2038 s->_raw_size = 4 * (list.elt_count[i] + 1);
2039 s->contents = frag_more (s->_raw_size);
2040 frag_now->fr_fix = frag_now_fix_octets ();
2041 }
2042
252b5132
RH
2043#ifdef elf_tc_final_processing
2044 elf_tc_final_processing ();
2045#endif
2046}
2047
4a1805b1 2048/* It removes any unneeded versioned symbols from the symbol table. */
339681c0
L
2049
2050void
2051elf_frob_file_before_adjust ()
2052{
2053 if (symbol_rootP)
2054 {
2055 symbolS *symp;
2056
2057 for (symp = symbol_rootP; symp; symp = symbol_next (symp))
00e6e13d 2058 if (!S_IS_DEFINED (symp))
79082ff0 2059 {
00e6e13d 2060 if (symbol_get_obj (symp)->versioned_name)
79082ff0
L
2061 {
2062 char *p;
2063
2064 /* The @@@ syntax is a special case. If the symbol is
2065 not defined, 2 `@'s will be removed from the
2066 versioned_name. */
2067
2068 p = strchr (symbol_get_obj (symp)->versioned_name,
2069 ELF_VER_CHR);
2070 know (p != NULL);
2071 if (p [1] == ELF_VER_CHR && p [2] == ELF_VER_CHR)
2072 {
2073 size_t l = strlen (&p[3]) + 1;
2074 memmove (&p [1], &p[3], l);
2075 }
2076 if (symbol_used_p (symp) == 0
2077 && symbol_used_in_reloc_p (symp) == 0)
2078 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2079 }
00e6e13d
JJ
2080
2081 /* If there was .weak foo, but foo was neither defined nor
2082 used anywhere, remove it. */
2083
2084 else if (S_IS_WEAK (symp)
2085 && symbol_used_p (symp) == 0
2086 && symbol_used_in_reloc_p (symp) == 0)
2087 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
79082ff0 2088 }
339681c0
L
2089 }
2090}
2091
252b5132
RH
2092/* It is required that we let write_relocs have the opportunity to
2093 optimize away fixups before output has begun, since it is possible
2094 to eliminate all fixups for a section and thus we never should
2095 have generated the relocation section. */
2096
2097void
2098elf_frob_file_after_relocs ()
2099{
2100#ifdef NEED_ECOFF_DEBUG
2101 if (ECOFF_DEBUGGING)
2102 /* Generate the ECOFF debugging information. */
2103 {
2104 const struct ecoff_debug_swap *debug_swap;
2105 struct ecoff_debug_info debug;
2106 char *buf;
2107 asection *sec;
2108
2109 debug_swap
2110 = get_elf_backend_data (stdoutput)->elf_backend_ecoff_debug_swap;
2111 know (debug_swap != (const struct ecoff_debug_swap *) NULL);
2112 ecoff_build_debug (&debug.symbolic_header, &buf, debug_swap);
2113
2114 /* Set up the pointers in debug. */
2115#define SET(ptr, offset, type) \
2116 debug.ptr = (type) (buf + debug.symbolic_header.offset)
2117
2118 SET (line, cbLineOffset, unsigned char *);
2119 SET (external_dnr, cbDnOffset, PTR);
2120 SET (external_pdr, cbPdOffset, PTR);
2121 SET (external_sym, cbSymOffset, PTR);
2122 SET (external_opt, cbOptOffset, PTR);
2123 SET (external_aux, cbAuxOffset, union aux_ext *);
2124 SET (ss, cbSsOffset, char *);
2125 SET (external_fdr, cbFdOffset, PTR);
2126 SET (external_rfd, cbRfdOffset, PTR);
2127 /* ssext and external_ext are set up just below. */
2128
2129#undef SET
2130
2131 /* Set up the external symbols. */
2132 debug.ssext = debug.ssext_end = NULL;
2133 debug.external_ext = debug.external_ext_end = NULL;
b34976b6 2134 if (! bfd_ecoff_debug_externals (stdoutput, &debug, debug_swap, TRUE,
252b5132 2135 elf_get_extr, elf_set_index))
6ce8b369 2136 as_fatal (_("failed to set up debugging information: %s"),
252b5132
RH
2137 bfd_errmsg (bfd_get_error ()));
2138
2139 sec = bfd_get_section_by_name (stdoutput, ".mdebug");
2140 assert (sec != NULL);
2141
b34976b6 2142 know (!stdoutput->output_has_begun);
252b5132
RH
2143
2144 /* We set the size of the section, call bfd_set_section_contents
2145 to force the ELF backend to allocate a file position, and then
2146 write out the data. FIXME: Is this really the best way to do
2147 this? */
2148 sec->_raw_size = bfd_ecoff_debug_size (stdoutput, &debug, debug_swap);
2149
5f91fe03
ILT
2150 /* Pass BUF to bfd_set_section_contents because this will
2151 eventually become a call to fwrite, and ISO C prohibits
2152 passing a NULL pointer to a stdio function even if the
2153 pointer will not be used. */
2154 if (! bfd_set_section_contents (stdoutput, sec, (PTR) buf,
252b5132 2155 (file_ptr) 0, (bfd_size_type) 0))
6ce8b369 2156 as_fatal (_("can't start writing .mdebug section: %s"),
252b5132
RH
2157 bfd_errmsg (bfd_get_error ()));
2158
b34976b6 2159 know (stdoutput->output_has_begun);
252b5132
RH
2160 know (sec->filepos != 0);
2161
2162 if (! bfd_ecoff_write_debug (stdoutput, &debug, debug_swap,
2163 sec->filepos))
6ce8b369 2164 as_fatal (_("could not write .mdebug section: %s"),
252b5132
RH
2165 bfd_errmsg (bfd_get_error ()));
2166 }
2167#endif /* NEED_ECOFF_DEBUG */
2168}
2169
2170#ifdef SCO_ELF
2171
2172/* Heavily plagarized from obj_elf_version. The idea is to emit the
2173 SCO specific identifier in the .notes section to satisfy the SCO
2174 linker.
2175
2176 This looks more complicated than it really is. As opposed to the
2177 "obvious" solution, this should handle the cross dev cases
2178 correctly. (i.e, hosting on a 64 bit big endian processor, but
2179 generating SCO Elf code) Efficiency isn't a concern, as there
2180 should be exactly one of these sections per object module.
2181
2182 SCO OpenServer 5 identifies it's ELF modules with a standard ELF
2183 .note section.
2184
fa306131
AM
2185 int_32 namesz = 4 ; Name size
2186 int_32 descsz = 12 ; Descriptive information
2187 int_32 type = 1 ;
2188 char name[4] = "SCO" ; Originator name ALWAYS SCO + NULL
252b5132
RH
2189 int_32 version = (major ver # << 16) | version of tools ;
2190 int_32 source = (tool_id << 16 ) | 1 ;
2191 int_32 info = 0 ; These are set by the SCO tools, but we
fa306131 2192 don't know enough about the source
252b5132
RH
2193 environment to set them. SCO ld currently
2194 ignores them, and recommends we set them
2195 to zero. */
2196
2197#define SCO_MAJOR_VERSION 0x1
2198#define SCO_MINOR_VERSION 0x1
2199
2200void
2201sco_id ()
2202{
2203
2204 char *name;
2205 unsigned int c;
2206 char ch;
2207 char *p;
2208 asection *seg = now_seg;
2209 subsegT subseg = now_subseg;
2210 Elf_Internal_Note i_note;
2211 Elf_External_Note e_note;
2212 asection *note_secp = (asection *) NULL;
2213 int i, len;
2214
2215 /* create the .note section */
2216
2217 note_secp = subseg_new (".note", 0);
2218 bfd_set_section_flags (stdoutput,
2219 note_secp,
2220 SEC_HAS_CONTENTS | SEC_READONLY);
2221
2222 /* process the version string */
2223
fa306131 2224 i_note.namesz = 4;
252b5132
RH
2225 i_note.descsz = 12; /* 12 descriptive bytes */
2226 i_note.type = NT_VERSION; /* Contains a version string */
2227
2228 p = frag_more (sizeof (i_note.namesz));
2229 md_number_to_chars (p, (valueT) i_note.namesz, 4);
2230
2231 p = frag_more (sizeof (i_note.descsz));
2232 md_number_to_chars (p, (valueT) i_note.descsz, 4);
2233
2234 p = frag_more (sizeof (i_note.type));
2235 md_number_to_chars (p, (valueT) i_note.type, 4);
2236
2237 p = frag_more (4);
fa306131 2238 strcpy (p, "SCO");
252b5132
RH
2239
2240 /* Note: this is the version number of the ELF we're representing */
2241 p = frag_more (4);
2242 md_number_to_chars (p, (SCO_MAJOR_VERSION << 16) | (SCO_MINOR_VERSION), 4);
2243
2244 /* Here, we pick a magic number for ourselves (yes, I "registered"
2245 it with SCO. The bottom bit shows that we are compat with the
2246 SCO ABI. */
2247 p = frag_more (4);
2248 md_number_to_chars (p, 0x4c520000 | 0x0001, 4);
2249
2250 /* If we knew (or cared) what the source language options were, we'd
2251 fill them in here. SCO has given us permission to ignore these
2252 and just set them to zero. */
2253 p = frag_more (4);
2254 md_number_to_chars (p, 0x0000, 4);
fa306131 2255
252b5132
RH
2256 frag_align (2, 0, 0);
2257
2258 /* We probably can't restore the current segment, for there likely
2259 isn't one yet... */
2260 if (seg && subseg)
2261 subseg_set (seg, subseg);
2262
2263}
2264
2265#endif /* SCO_ELF */
2266
5110c57e
HPN
2267static int
2268elf_separate_stab_sections ()
2269{
2270#ifdef NEED_ECOFF_DEBUG
2271 return (!ECOFF_DEBUGGING);
2272#else
2273 return 1;
2274#endif
2275}
2276
2277static void
2278elf_init_stab_section (seg)
2279 segT seg;
2280{
2281#ifdef NEED_ECOFF_DEBUG
2282 if (!ECOFF_DEBUGGING)
2283#endif
2284 obj_elf_init_stab_section (seg);
2285}
2286
252b5132
RH
2287const struct format_ops elf_format_ops =
2288{
2289 bfd_target_elf_flavour,
4c63da97
AM
2290 0, /* dfl_leading_underscore */
2291 1, /* emit_section_symbols */
5110c57e
HPN
2292 elf_begin,
2293 elf_file_symbol,
252b5132
RH
2294 elf_frob_symbol,
2295 elf_frob_file,
339681c0 2296 elf_frob_file_before_adjust,
a161fe53 2297 0, /* obj_frob_file_before_fix */
252b5132
RH
2298 elf_frob_file_after_relocs,
2299 elf_s_get_size, elf_s_set_size,
2300 elf_s_get_align, elf_s_set_align,
4c63da97 2301 elf_s_get_other,
5110c57e 2302 elf_s_set_other,
4c63da97 2303 0, /* s_get_desc */
5110c57e
HPN
2304 0, /* s_set_desc */
2305 0, /* s_get_type */
2306 0, /* s_set_type */
252b5132
RH
2307 elf_copy_symbol_attributes,
2308#ifdef NEED_ECOFF_DEBUG
2309 ecoff_generate_asm_lineno,
2310 ecoff_stab,
2311#else
4c63da97
AM
2312 0, /* generate_asm_lineno */
2313 0, /* process_stab */
252b5132 2314#endif
5110c57e
HPN
2315 elf_separate_stab_sections,
2316 elf_init_stab_section,
252b5132
RH
2317 elf_sec_sym_ok_for_reloc,
2318 elf_pop_insert,
2319#ifdef NEED_ECOFF_DEBUG
2320 elf_ecoff_set_ext,
2321#else
4c63da97 2322 0, /* ecoff_set_ext */
252b5132 2323#endif
4c63da97 2324 elf_obj_read_begin_hook,
5110c57e 2325 elf_obj_symbol_new_hook
252b5132 2326};
This page took 0.309663 seconds and 4 git commands to generate.