Include SEC_CODE so that code sections are assigned the LOAD attribute.
[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
604/* Certain named sections have particular defined types, listed on p.
605 4-19 of the ABI. */
606struct special_section
607{
608 const char *name;
609 int type;
610 int attributes;
611};
612
9de8d8f1 613static struct special_section const special_sections[] =
252b5132
RH
614{
615 { ".bss", SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
616 { ".comment", SHT_PROGBITS, 0 },
617 { ".data", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
618 { ".data1", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
619 { ".debug", SHT_PROGBITS, 0 },
db66b292
DA
620#if defined (TC_HPPA) && !defined (TE_LINUX) && TARGET_ARCH_SIZE == 64
621 { ".fini", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
622 { ".init", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
623#else
252b5132
RH
624 { ".fini", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
625 { ".init", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
db66b292 626#endif
252b5132
RH
627 { ".line", SHT_PROGBITS, 0 },
628 { ".note", SHT_NOTE, 0 },
629 { ".rodata", SHT_PROGBITS, SHF_ALLOC },
630 { ".rodata1", SHT_PROGBITS, SHF_ALLOC },
13ae64f3
JJ
631 { ".tbss", SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
632 { ".tdata", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
252b5132 633 { ".text", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
cc8a6dd0 634 { ".init_array",SHT_INIT_ARRAY, SHF_ALLOC + SHF_WRITE },
e9682144 635 { ".fini_array",SHT_FINI_ARRAY, SHF_ALLOC + SHF_WRITE },
cc8a6dd0 636 { ".preinit_array",SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_WRITE },
252b5132
RH
637
638#ifdef ELF_TC_SPECIAL_SECTIONS
639 ELF_TC_SPECIAL_SECTIONS
640#endif
641
642#if 0
643 /* The following section names are special, but they can not
644 reasonably appear in assembler code. Some of the attributes are
645 processor dependent. */
646 { ".dynamic", SHT_DYNAMIC, SHF_ALLOC /* + SHF_WRITE */ },
647 { ".dynstr", SHT_STRTAB, SHF_ALLOC },
648 { ".dynsym", SHT_DYNSYM, SHF_ALLOC },
649 { ".got", SHT_PROGBITS, 0 },
650 { ".hash", SHT_HASH, SHF_ALLOC },
651 { ".interp", SHT_PROGBITS, /* SHF_ALLOC */ },
652 { ".plt", SHT_PROGBITS, 0 },
653 { ".shstrtab",SHT_STRTAB, 0 },
654 { ".strtab", SHT_STRTAB, /* SHF_ALLOC */ },
655 { ".symtab", SHT_SYMTAB, /* SHF_ALLOC */ },
656#endif
657
658 { NULL, 0, 0 }
659};
660
cca86cc8 661void
d2dab548 662obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push)
060adf0e
AM
663 const char *name;
664 int type;
665 int attr;
666 int entsize;
aa1f4858 667 const char *group_name;
d2dab548 668 int linkonce;
060adf0e 669 int push;
252b5132 670{
742f45cf 671 asection *old_sec;
252b5132 672 segT sec;
742f45cf
AM
673 flagword flags;
674 int i;
252b5132
RH
675
676#ifdef md_flush_pending_output
677 md_flush_pending_output ();
678#endif
679
9de8d8f1
RH
680 /* Switch to the section, creating it if necessary. */
681 if (push)
682 {
683 struct section_stack *elt;
684 elt = xmalloc (sizeof (struct section_stack));
685 elt->next = section_stack;
686 elt->seg = now_seg;
687 elt->prev_seg = previous_section;
688 elt->subseg = now_subseg;
689 elt->prev_subseg = previous_subsection;
690 section_stack = elt;
691 }
692 previous_section = now_seg;
693 previous_subsection = now_subseg;
694
742f45cf 695 old_sec = bfd_get_section_by_name (stdoutput, name);
9de8d8f1
RH
696 sec = subseg_new (name, 0);
697
742f45cf
AM
698 /* See if this is one of the special sections. */
699 for (i = 0; special_sections[i].name != NULL; i++)
700 if (strcmp (name, special_sections[i].name) == 0)
701 {
702 if (type == SHT_NULL)
703 type = special_sections[i].type;
704 else if (type != special_sections[i].type)
705 {
7ed1d346
AM
706 if (old_sec == NULL
707 /* FIXME: gcc, as of 2002-10-22, will emit
708
709 .section .init_array,"aw",@progbits
710
711 for __attribute__ ((section (".init_array"))).
712 "@progbits" is incorrect. */
713 && special_sections[i].type != SHT_INIT_ARRAY
714 && special_sections[i].type != SHT_FINI_ARRAY
715 && special_sections[i].type != SHT_PREINIT_ARRAY)
9de8d8f1 716 {
6ce8b369 717 as_warn (_("setting incorrect section type for %s"), name);
742f45cf
AM
718 }
719 else
720 {
6ce8b369 721 as_warn (_("ignoring incorrect section type for %s"), name);
742f45cf 722 type = special_sections[i].type;
9de8d8f1 723 }
9de8d8f1 724 }
742f45cf
AM
725 if ((attr &~ special_sections[i].attributes) != 0
726 && old_sec == NULL)
727 {
728 /* As a GNU extension, we permit a .note section to be
729 allocatable. If the linker sees an allocateable .note
730 section, it will create a PT_NOTE segment in the output
731 file. */
732 if (strcmp (name, ".note") != 0
733 || attr != SHF_ALLOC)
6ce8b369 734 as_warn (_("setting incorrect section attributes for %s"),
742f45cf
AM
735 name);
736 }
737 attr |= special_sections[i].attributes;
738 break;
739 }
740
741 /* Convert ELF type and flags to BFD flags. */
742 flags = (SEC_RELOC
743 | ((attr & SHF_WRITE) ? 0 : SEC_READONLY)
744 | ((attr & SHF_ALLOC) ? SEC_ALLOC : 0)
745 | (((attr & SHF_ALLOC) && type != SHT_NOBITS) ? SEC_LOAD : 0)
f5fa8ca2
JJ
746 | ((attr & SHF_EXECINSTR) ? SEC_CODE : 0)
747 | ((attr & SHF_MERGE) ? SEC_MERGE : 0)
13ae64f3
JJ
748 | ((attr & SHF_STRINGS) ? SEC_STRINGS : 0)
749 | ((attr & SHF_TLS) ? SEC_THREAD_LOCAL : 0));
9de8d8f1 750#ifdef md_elf_section_flags
742f45cf 751 flags = md_elf_section_flags (flags, attr, type);
9de8d8f1
RH
752#endif
753
742f45cf
AM
754 if (old_sec == NULL)
755 {
756 symbolS *secsym;
757
9de8d8f1
RH
758 /* Prevent SEC_HAS_CONTENTS from being inadvertently set. */
759 if (type == SHT_NOBITS)
760 seg_info (sec)->bss = 1;
761
68bfbfcc
AM
762 if (linkonce)
763 flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
9de8d8f1 764 bfd_set_section_flags (stdoutput, sec, flags);
f5fa8ca2
JJ
765 if (flags & SEC_MERGE)
766 sec->entsize = entsize;
aa1f4858 767 elf_group_name (sec) = group_name;
9de8d8f1
RH
768
769 /* Add a symbol for this section to the symbol table. */
770 secsym = symbol_find (name);
771 if (secsym != NULL)
772 symbol_set_bfdsym (secsym, sec->symbol);
773 else
774 symbol_table_insert (section_symbol (sec));
775 }
742f45cf
AM
776 else if (attr != 0)
777 {
778 /* If section attributes are specified the second time we see a
779 particular section, then check that they are the same as we
780 saw the first time. */
d2dab548
AM
781 if (((old_sec->flags ^ flags)
782 & (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
783 | SEC_EXCLUDE | SEC_SORT_ENTRIES | SEC_MERGE | SEC_STRINGS
68bfbfcc
AM
784 | SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD
785 | SEC_THREAD_LOCAL)))
6ce8b369 786 as_warn (_("ignoring changed section attributes for %s"), name);
d2dab548 787 if ((flags & SEC_MERGE) && old_sec->entsize != (unsigned) entsize)
6ce8b369 788 as_warn (_("ignoring changed section entity size for %s"), name);
d2dab548
AM
789 if ((attr & SHF_GROUP) != 0
790 && strcmp (elf_group_name (old_sec), group_name) != 0)
060adf0e 791 as_warn (_("ignoring new section group for %s"), name);
742f45cf 792 }
9de8d8f1
RH
793
794#ifdef md_elf_section_change_hook
742f45cf 795 md_elf_section_change_hook ();
9de8d8f1
RH
796#endif
797}
798
8d28c9d7 799static int
9de8d8f1
RH
800obj_elf_parse_section_letters (str, len)
801 char *str;
802 size_t len;
803{
804 int attr = 0;
805
806 while (len > 0)
807 {
808 switch (*str)
809 {
810 case 'a':
811 attr |= SHF_ALLOC;
812 break;
813 case 'w':
814 attr |= SHF_WRITE;
815 break;
816 case 'x':
817 attr |= SHF_EXECINSTR;
818 break;
9469ddf0 819 case 'M':
f5fa8ca2
JJ
820 attr |= SHF_MERGE;
821 break;
9469ddf0 822 case 'S':
f5fa8ca2
JJ
823 attr |= SHF_STRINGS;
824 break;
060adf0e
AM
825 case 'G':
826 attr |= SHF_GROUP;
827 break;
13ae64f3
JJ
828 case 'T':
829 attr |= SHF_TLS;
830 break;
34105363
L
831 /* Compatibility. */
832 case 'm':
833 if (*(str - 1) == 'a')
834 {
835 attr |= SHF_MERGE;
836 if (len > 1 && str[1] == 's')
837 {
838 attr |= SHF_STRINGS;
839 str++, len--;
840 }
841 break;
842 }
9de8d8f1
RH
843 default:
844 {
13ae64f3 845 char *bad_msg = _("unrecognized .section attribute: want a,w,x,M,S,G,T");
9de8d8f1
RH
846#ifdef md_elf_section_letter
847 int md_attr = md_elf_section_letter (*str, &bad_msg);
848 if (md_attr >= 0)
849 attr |= md_attr;
850 else
851#endif
711ef82f 852 as_fatal ("%s", bad_msg);
9de8d8f1
RH
853 }
854 break;
855 }
856 str++, len--;
857 }
858
859 return attr;
860}
861
8d28c9d7 862static int
9de8d8f1
RH
863obj_elf_section_word (str, len)
864 char *str;
865 size_t len;
866{
867 if (len == 5 && strncmp (str, "write", 5) == 0)
868 return SHF_WRITE;
869 if (len == 5 && strncmp (str, "alloc", 5) == 0)
870 return SHF_ALLOC;
871 if (len == 9 && strncmp (str, "execinstr", 9) == 0)
872 return SHF_EXECINSTR;
b9734f35
JJ
873 if (len == 3 && strncmp (str, "tls", 3) == 0)
874 return SHF_TLS;
9de8d8f1
RH
875
876#ifdef md_elf_section_word
877 {
878 int md_attr = md_elf_section_word (str, len);
879 if (md_attr >= 0)
880 return md_attr;
881 }
882#endif
883
6ce8b369 884 as_warn (_("unrecognized section attribute"));
9de8d8f1
RH
885 return 0;
886}
887
8d28c9d7 888static int
9de8d8f1
RH
889obj_elf_section_type (str, len)
890 char *str;
891 size_t len;
892{
893 if (len == 8 && strncmp (str, "progbits", 8) == 0)
894 return SHT_PROGBITS;
895 if (len == 6 && strncmp (str, "nobits", 6) == 0)
896 return SHT_NOBITS;
897
898#ifdef md_elf_section_type
899 {
900 int md_type = md_elf_section_type (str, len);
901 if (md_type >= 0)
902 return md_type;
903 }
904#endif
905
6ce8b369 906 as_warn (_("unrecognized section type"));
9de8d8f1
RH
907 return 0;
908}
909
6ce8b369
AM
910/* Get name of section. */
911static char *
912obj_elf_section_name ()
913{
914 char *name;
915
916 SKIP_WHITESPACE ();
917 if (*input_line_pointer == '"')
918 {
919 int dummy;
920
921 name = demand_copy_C_string (&dummy);
922 if (name == NULL)
923 {
924 ignore_rest_of_line ();
925 return NULL;
926 }
927 }
928 else
929 {
930 char *end = input_line_pointer;
931
932 while (0 == strchr ("\n\t,; ", *end))
933 end++;
934 if (end == input_line_pointer)
935 {
936 as_warn (_("missing name"));
937 ignore_rest_of_line ();
938 return NULL;
939 }
940
941 name = xmalloc (end - input_line_pointer + 1);
942 memcpy (name, input_line_pointer, end - input_line_pointer);
943 name[end - input_line_pointer] = '\0';
612d7b83
L
944#ifdef tc_canonicalize_section_name
945 name = tc_canonicalize_section_name (name);
946#endif
6ce8b369
AM
947 input_line_pointer = end;
948 }
949 SKIP_WHITESPACE ();
950 return name;
951}
952
9de8d8f1
RH
953void
954obj_elf_section (push)
955 int push;
956{
aa1f4858 957 char *name, *group_name, *beg;
9de8d8f1 958 int type, attr, dummy;
f5fa8ca2 959 int entsize;
d2dab548 960 int linkonce;
9de8d8f1 961
5b93d8bb 962#ifndef TC_I370
252b5132
RH
963 if (flag_mri)
964 {
965 char mri_type;
966
9de8d8f1 967#ifdef md_flush_pending_output
60bcf0fa 968 md_flush_pending_output ();
9de8d8f1
RH
969#endif
970
252b5132
RH
971 previous_section = now_seg;
972 previous_subsection = now_subseg;
973
974 s_mri_sect (&mri_type);
975
976#ifdef md_elf_section_change_hook
977 md_elf_section_change_hook ();
978#endif
979
980 return;
981 }
5b93d8bb 982#endif /* ! defined (TC_I370) */
252b5132 983
6ce8b369
AM
984 name = obj_elf_section_name ();
985 if (name == NULL)
986 return;
252b5132
RH
987 type = SHT_NULL;
988 attr = 0;
aa1f4858 989 group_name = NULL;
f5fa8ca2 990 entsize = 0;
d2dab548 991 linkonce = 0;
252b5132
RH
992
993 if (*input_line_pointer == ',')
994 {
995 /* Skip the comma. */
996 ++input_line_pointer;
252b5132
RH
997 SKIP_WHITESPACE ();
998
999 if (*input_line_pointer == '"')
1000 {
9de8d8f1
RH
1001 beg = demand_copy_C_string (&dummy);
1002 if (beg == NULL)
252b5132 1003 {
9de8d8f1
RH
1004 ignore_rest_of_line ();
1005 return;
252b5132 1006 }
9de8d8f1 1007 attr |= obj_elf_parse_section_letters (beg, strlen (beg));
252b5132
RH
1008
1009 SKIP_WHITESPACE ();
1010 if (*input_line_pointer == ',')
1011 {
9de8d8f1 1012 char c;
060adf0e
AM
1013 char *save = input_line_pointer;
1014
252b5132
RH
1015 ++input_line_pointer;
1016 SKIP_WHITESPACE ();
9de8d8f1
RH
1017 c = *input_line_pointer;
1018 if (c == '"')
252b5132 1019 {
9de8d8f1
RH
1020 beg = demand_copy_C_string (&dummy);
1021 if (beg == NULL)
252b5132 1022 {
9de8d8f1
RH
1023 ignore_rest_of_line ();
1024 return;
252b5132 1025 }
9de8d8f1 1026 type = obj_elf_section_type (beg, strlen (beg));
9de8d8f1
RH
1027 }
1028 else if (c == '@' || c == '%')
1029 {
1030 beg = ++input_line_pointer;
1031 c = get_symbol_end ();
1032 *input_line_pointer = c;
1033 type = obj_elf_section_type (beg, input_line_pointer - beg);
252b5132 1034 }
060adf0e
AM
1035 else
1036 input_line_pointer = save;
252b5132 1037 }
f5fa8ca2
JJ
1038
1039 SKIP_WHITESPACE ();
6ce8b369 1040 if ((attr & SHF_MERGE) != 0 && *input_line_pointer == ',')
f5fa8ca2
JJ
1041 {
1042 ++input_line_pointer;
1043 SKIP_WHITESPACE ();
1044 entsize = get_absolute_expression ();
6ce8b369 1045 SKIP_WHITESPACE ();
f5fa8ca2
JJ
1046 if (entsize < 0)
1047 {
6ce8b369 1048 as_warn (_("invalid merge entity size"));
f5fa8ca2
JJ
1049 attr &= ~SHF_MERGE;
1050 entsize = 0;
1051 }
1052 }
6ce8b369
AM
1053 else if ((attr & SHF_MERGE) != 0)
1054 {
1055 as_warn (_("entity size for SHF_MERGE not specified"));
1056 attr &= ~SHF_MERGE;
1057 }
060adf0e
AM
1058
1059 if ((attr & SHF_GROUP) != 0 && *input_line_pointer == ',')
1060 {
1061 ++input_line_pointer;
aa1f4858
AM
1062 group_name = obj_elf_section_name ();
1063 if (group_name == NULL)
060adf0e 1064 attr &= ~SHF_GROUP;
d2dab548
AM
1065 else if (strncmp (input_line_pointer, ",comdat", 7) == 0)
1066 {
1067 input_line_pointer += 7;
1068 linkonce = 1;
1069 }
1070 else if (strncmp (name, ".gnu.linkonce", 13) == 0)
1071 linkonce = 1;
060adf0e
AM
1072 }
1073 else if ((attr & SHF_GROUP) != 0)
1074 {
1075 as_warn (_("group name for SHF_GROUP not specified"));
1076 attr &= ~SHF_GROUP;
1077 }
252b5132
RH
1078 }
1079 else
1080 {
1081 do
1082 {
9de8d8f1
RH
1083 char c;
1084
252b5132
RH
1085 SKIP_WHITESPACE ();
1086 if (*input_line_pointer != '#')
1087 {
6ce8b369 1088 as_warn (_("character following name is not '#'"));
252b5132
RH
1089 ignore_rest_of_line ();
1090 return;
1091 }
9de8d8f1
RH
1092 beg = ++input_line_pointer;
1093 c = get_symbol_end ();
1094 *input_line_pointer = c;
1095
1096 attr |= obj_elf_section_word (beg, input_line_pointer - beg);
1097
252b5132
RH
1098 SKIP_WHITESPACE ();
1099 }
1100 while (*input_line_pointer++ == ',');
1101 --input_line_pointer;
1102 }
1103 }
1104
252b5132 1105 demand_empty_rest_of_line ();
9de8d8f1 1106
d2dab548 1107 obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push);
252b5132
RH
1108}
1109
1110/* Change to the .data section. */
1111
16b93d88 1112void
252b5132
RH
1113obj_elf_data (i)
1114 int i;
1115{
1116#ifdef md_flush_pending_output
1117 md_flush_pending_output ();
1118#endif
1119
1120 previous_section = now_seg;
1121 previous_subsection = now_subseg;
1122 s_data (i);
1123
1124#ifdef md_elf_section_change_hook
1125 md_elf_section_change_hook ();
1126#endif
1127}
1128
1129/* Change to the .text section. */
1130
16b93d88 1131void
252b5132
RH
1132obj_elf_text (i)
1133 int i;
1134{
1135#ifdef md_flush_pending_output
1136 md_flush_pending_output ();
1137#endif
1138
1139 previous_section = now_seg;
1140 previous_subsection = now_subseg;
1141 s_text (i);
1142
1143#ifdef md_elf_section_change_hook
1144 md_elf_section_change_hook ();
1145#endif
1146}
1147
1148static void
1149obj_elf_subsection (ignore)
ab9da554 1150 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1151{
1152 register int temp;
1153
1154#ifdef md_flush_pending_output
1155 md_flush_pending_output ();
1156#endif
1157
1158 previous_section = now_seg;
1159 previous_subsection = now_subseg;
1160
1161 temp = get_absolute_expression ();
1162 subseg_set (now_seg, (subsegT) temp);
1163 demand_empty_rest_of_line ();
1164
1165#ifdef md_elf_section_change_hook
1166 md_elf_section_change_hook ();
1167#endif
1168}
1169
1170/* This can be called from the processor backends if they change
1171 sections. */
1172
1173void
1174obj_elf_section_change_hook ()
1175{
1176 previous_section = now_seg;
1177 previous_subsection = now_subseg;
1178}
1179
1180void
1181obj_elf_previous (ignore)
ab9da554 1182 int ignore ATTRIBUTE_UNUSED;
252b5132 1183{
9de8d8f1
RH
1184 segT new_section;
1185 int new_subsection;
1186
252b5132
RH
1187 if (previous_section == 0)
1188 {
6ce8b369 1189 as_warn (_(".previous without corresponding .section; ignored"));
252b5132
RH
1190 return;
1191 }
1192
1193#ifdef md_flush_pending_output
1194 md_flush_pending_output ();
1195#endif
1196
9de8d8f1
RH
1197 new_section = previous_section;
1198 new_subsection = previous_subsection;
1199 previous_section = now_seg;
1200 previous_subsection = now_subseg;
1201 subseg_set (new_section, new_subsection);
1202
1203#ifdef md_elf_section_change_hook
1204 md_elf_section_change_hook ();
1205#endif
1206}
1207
1208static void
1209obj_elf_popsection (xxx)
ab9da554 1210 int xxx ATTRIBUTE_UNUSED;
9de8d8f1
RH
1211{
1212 struct section_stack *top = section_stack;
1213
1214 if (top == NULL)
1215 {
6ce8b369 1216 as_warn (_(".popsection without corresponding .pushsection; ignored"));
9de8d8f1
RH
1217 return;
1218 }
1219
1220#ifdef md_flush_pending_output
1221 md_flush_pending_output ();
1222#endif
1223
1224 section_stack = top->next;
1225 previous_section = top->prev_seg;
1226 previous_subsection = top->prev_subseg;
1227 subseg_set (top->seg, top->subseg);
1228 free (top);
252b5132
RH
1229
1230#ifdef md_elf_section_change_hook
1231 md_elf_section_change_hook ();
1232#endif
1233}
1234
1235static void
1236obj_elf_line (ignore)
ab9da554 1237 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1238{
1239 /* Assume delimiter is part of expression. BSD4.2 as fails with
bf514e21 1240 delightful bug, so we are not being incompatible here. */
252b5132
RH
1241 new_logical_line ((char *) NULL, (int) (get_absolute_expression ()));
1242 demand_empty_rest_of_line ();
1243}
1244
1245/* This handles the .symver pseudo-op, which is used to specify a
1246 symbol version. The syntax is ``.symver NAME,SYMVERNAME''.
1247 SYMVERNAME may contain ELF_VER_CHR ('@') characters. This
1248 pseudo-op causes the assembler to emit a symbol named SYMVERNAME
1249 with the same value as the symbol NAME. */
1250
1251static void
1252obj_elf_symver (ignore)
ab9da554 1253 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1254{
1255 char *name;
1256 char c;
468cced8 1257 char old_lexat;
252b5132
RH
1258 symbolS *sym;
1259
1260 name = input_line_pointer;
1261 c = get_symbol_end ();
1262
1263 sym = symbol_find_or_make (name);
1264
1265 *input_line_pointer = c;
1266
252b5132
RH
1267 SKIP_WHITESPACE ();
1268 if (*input_line_pointer != ',')
1269 {
1270 as_bad (_("expected comma after name in .symver"));
1271 ignore_rest_of_line ();
1272 return;
1273 }
1274
1275 ++input_line_pointer;
eba874d8 1276 SKIP_WHITESPACE ();
252b5132 1277 name = input_line_pointer;
468cced8
AM
1278
1279 /* Temporarily include '@' in symbol names. */
1280 old_lexat = lex_type[(unsigned char) '@'];
1281 lex_type[(unsigned char) '@'] |= LEX_NAME;
1282 c = get_symbol_end ();
1283 lex_type[(unsigned char) '@'] = old_lexat;
252b5132 1284
339681c0
L
1285 if (symbol_get_obj (sym)->versioned_name == NULL)
1286 {
1287 symbol_get_obj (sym)->versioned_name = xstrdup (name);
252b5132 1288
339681c0 1289 *input_line_pointer = c;
252b5132 1290
6f620856
L
1291 if (strchr (symbol_get_obj (sym)->versioned_name,
1292 ELF_VER_CHR) == NULL)
339681c0
L
1293 {
1294 as_bad (_("missing version name in `%s' for symbol `%s'"),
1295 symbol_get_obj (sym)->versioned_name,
1296 S_GET_NAME (sym));
1297 ignore_rest_of_line ();
1298 return;
1299 }
1300 }
1301 else
252b5132 1302 {
339681c0
L
1303 if (strcmp (symbol_get_obj (sym)->versioned_name, name))
1304 {
1305 as_bad (_("multiple versions [`%s'|`%s'] for symbol `%s'"),
1306 name, symbol_get_obj (sym)->versioned_name,
1307 S_GET_NAME (sym));
1308 ignore_rest_of_line ();
1309 return;
1310 }
1311
1312 *input_line_pointer = c;
252b5132
RH
1313 }
1314
1315 demand_empty_rest_of_line ();
1316}
1317
1318/* This handles the .vtable_inherit pseudo-op, which is used to indicate
1319 to the linker the hierarchy in which a particular table resides. The
1320 syntax is ".vtable_inherit CHILDNAME, PARENTNAME". */
1321
904a31bf 1322struct fix *
252b5132 1323obj_elf_vtable_inherit (ignore)
ab9da554 1324 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1325{
1326 char *cname, *pname;
1327 symbolS *csym, *psym;
1328 char c, bad = 0;
1329
1330 if (*input_line_pointer == '#')
1331 ++input_line_pointer;
1332
1333 cname = input_line_pointer;
1334 c = get_symbol_end ();
1335 csym = symbol_find (cname);
1336
1337 /* GCFIXME: should check that we don't have two .vtable_inherits for
1338 the same child symbol. Also, we can currently only do this if the
1339 child symbol is already exists and is placed in a fragment. */
1340
49309057 1341 if (csym == NULL || symbol_get_frag (csym) == NULL)
252b5132
RH
1342 {
1343 as_bad ("expected `%s' to have already been set for .vtable_inherit",
1344 cname);
1345 bad = 1;
1346 }
1347
1348 *input_line_pointer = c;
1349
1350 SKIP_WHITESPACE ();
1351 if (*input_line_pointer != ',')
1352 {
1353 as_bad ("expected comma after name in .vtable_inherit");
1354 ignore_rest_of_line ();
904a31bf 1355 return NULL;
252b5132
RH
1356 }
1357
1358 ++input_line_pointer;
1359 SKIP_WHITESPACE ();
1360
1361 if (*input_line_pointer == '#')
1362 ++input_line_pointer;
1363
1364 if (input_line_pointer[0] == '0'
1365 && (input_line_pointer[1] == '\0'
3882b010 1366 || ISSPACE (input_line_pointer[1])))
252b5132
RH
1367 {
1368 psym = section_symbol (absolute_section);
1369 ++input_line_pointer;
1370 }
1371 else
1372 {
1373 pname = input_line_pointer;
1374 c = get_symbol_end ();
1375 psym = symbol_find_or_make (pname);
1376 *input_line_pointer = c;
1377 }
1378
1379 demand_empty_rest_of_line ();
1380
1381 if (bad)
904a31bf 1382 return NULL;
252b5132 1383
49309057 1384 assert (symbol_get_value_expression (csym)->X_op == O_constant);
904a31bf
AM
1385 return fix_new (symbol_get_frag (csym),
1386 symbol_get_value_expression (csym)->X_add_number,
1387 0, psym, 0, 0, BFD_RELOC_VTABLE_INHERIT);
252b5132 1388}
fa306131 1389
252b5132
RH
1390/* This handles the .vtable_entry pseudo-op, which is used to indicate
1391 to the linker that a vtable slot was used. The syntax is
1392 ".vtable_entry tablename, offset". */
1393
904a31bf 1394struct fix *
252b5132 1395obj_elf_vtable_entry (ignore)
ab9da554 1396 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1397{
1398 char *name;
1399 symbolS *sym;
1400 offsetT offset;
1401 char c;
1402
1403 if (*input_line_pointer == '#')
1404 ++input_line_pointer;
1405
1406 name = input_line_pointer;
1407 c = get_symbol_end ();
1408 sym = symbol_find_or_make (name);
1409 *input_line_pointer = c;
1410
1411 SKIP_WHITESPACE ();
1412 if (*input_line_pointer != ',')
1413 {
1414 as_bad ("expected comma after name in .vtable_entry");
1415 ignore_rest_of_line ();
904a31bf 1416 return NULL;
252b5132
RH
1417 }
1418
1419 ++input_line_pointer;
1420 if (*input_line_pointer == '#')
1421 ++input_line_pointer;
1422
1423 offset = get_absolute_expression ();
1424
252b5132 1425 demand_empty_rest_of_line ();
904a31bf
AM
1426
1427 return fix_new (frag_now, frag_now_fix (), 0, sym, offset, 0,
1428 BFD_RELOC_VTABLE_ENTRY);
252b5132
RH
1429}
1430
1431void
4c63da97 1432elf_obj_read_begin_hook ()
252b5132
RH
1433{
1434#ifdef NEED_ECOFF_DEBUG
1435 if (ECOFF_DEBUGGING)
1436 ecoff_read_begin_hook ();
1437#endif
1438}
1439
1440void
4c63da97 1441elf_obj_symbol_new_hook (symbolP)
252b5132
RH
1442 symbolS *symbolP;
1443{
49309057
ILT
1444 struct elf_obj_sy *sy_obj;
1445
1446 sy_obj = symbol_get_obj (symbolP);
1447 sy_obj->size = NULL;
1448 sy_obj->versioned_name = NULL;
252b5132
RH
1449
1450#ifdef NEED_ECOFF_DEBUG
1451 if (ECOFF_DEBUGGING)
1452 ecoff_symbol_new_hook (symbolP);
1453#endif
1454}
1455
8fd3e36b
AM
1456/* When setting one symbol equal to another, by default we probably
1457 want them to have the same "size", whatever it means in the current
1458 context. */
1459
1460void
1461elf_copy_symbol_attributes (dest, src)
1462 symbolS *dest, *src;
1463{
060adf0e
AM
1464 struct elf_obj_sy *srcelf = symbol_get_obj (src);
1465 struct elf_obj_sy *destelf = symbol_get_obj (dest);
1466 if (srcelf->size)
1467 {
1468 if (destelf->size == NULL)
1469 destelf->size =
1470 (expressionS *) xmalloc (sizeof (expressionS));
1471 *destelf->size = *srcelf->size;
1472 }
1473 else
1474 {
1475 if (destelf->size != NULL)
1476 free (destelf->size);
1477 destelf->size = NULL;
1478 }
1479 S_SET_SIZE (dest, S_GET_SIZE (src));
26eb4093
JJ
1480 /* Don't copy visibility. */
1481 S_SET_OTHER (dest, (ELF_ST_VISIBILITY (S_GET_OTHER (dest))
1482 | (S_GET_OTHER (src) & ~ELF_ST_VISIBILITY (-1))));
8fd3e36b
AM
1483}
1484
252b5132
RH
1485void
1486obj_elf_version (ignore)
ab9da554 1487 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1488{
1489 char *name;
1490 unsigned int c;
252b5132
RH
1491 char *p;
1492 asection *seg = now_seg;
1493 subsegT subseg = now_subseg;
1494 Elf_Internal_Note i_note;
1495 Elf_External_Note e_note;
1496 asection *note_secp = (asection *) NULL;
e4afe742 1497 int len;
252b5132
RH
1498
1499 SKIP_WHITESPACE ();
1500 if (*input_line_pointer == '\"')
1501 {
bf514e21 1502 ++input_line_pointer; /* -> 1st char of string. */
252b5132
RH
1503 name = input_line_pointer;
1504
1505 while (is_a_char (c = next_char_of_string ()))
1506 ;
1507 c = *input_line_pointer;
1508 *input_line_pointer = '\0';
1509 *(input_line_pointer - 1) = '\0';
1510 *input_line_pointer = c;
1511
1512 /* create the .note section */
1513
1514 note_secp = subseg_new (".note", 0);
1515 bfd_set_section_flags (stdoutput,
1516 note_secp,
1517 SEC_HAS_CONTENTS | SEC_READONLY);
1518
1519 /* process the version string */
1520
1521 len = strlen (name);
1522
1523 i_note.namesz = ((len + 1) + 3) & ~3; /* round this to word boundary */
1524 i_note.descsz = 0; /* no description */
1525 i_note.type = NT_VERSION;
1526 p = frag_more (sizeof (e_note.namesz));
e4afe742 1527 md_number_to_chars (p, (valueT) i_note.namesz, sizeof (e_note.namesz));
252b5132 1528 p = frag_more (sizeof (e_note.descsz));
e4afe742 1529 md_number_to_chars (p, (valueT) i_note.descsz, sizeof (e_note.descsz));
252b5132 1530 p = frag_more (sizeof (e_note.type));
e4afe742
AM
1531 md_number_to_chars (p, (valueT) i_note.type, sizeof (e_note.type));
1532 p = frag_more (len + 1);
1533 strcpy (p, name);
252b5132 1534
252b5132
RH
1535 frag_align (2, 0, 0);
1536
1537 subseg_set (seg, subseg);
1538 }
1539 else
1540 {
6ce8b369 1541 as_bad (_("expected quoted string"));
252b5132
RH
1542 }
1543 demand_empty_rest_of_line ();
1544}
1545
1546static void
1547obj_elf_size (ignore)
ab9da554 1548 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1549{
1550 char *name = input_line_pointer;
1551 char c = get_symbol_end ();
1552 char *p;
1553 expressionS exp;
1554 symbolS *sym;
1555
1556 p = input_line_pointer;
1557 *p = c;
1558 SKIP_WHITESPACE ();
1559 if (*input_line_pointer != ',')
1560 {
1561 *p = 0;
1562 as_bad (_("expected comma after name `%s' in .size directive"), name);
1563 *p = c;
1564 ignore_rest_of_line ();
1565 return;
1566 }
1567 input_line_pointer++;
1568 expression (&exp);
1569 if (exp.X_op == O_absent)
1570 {
1571 as_bad (_("missing expression in .size directive"));
1572 exp.X_op = O_constant;
1573 exp.X_add_number = 0;
1574 }
1575 *p = 0;
1576 sym = symbol_find_or_make (name);
1577 *p = c;
1578 if (exp.X_op == O_constant)
c538998c
JJ
1579 {
1580 S_SET_SIZE (sym, exp.X_add_number);
1581 if (symbol_get_obj (sym)->size)
1582 {
1583 xfree (symbol_get_obj (sym)->size);
1584 symbol_get_obj (sym)->size = NULL;
1585 }
1586 }
252b5132
RH
1587 else
1588 {
49309057
ILT
1589 symbol_get_obj (sym)->size =
1590 (expressionS *) xmalloc (sizeof (expressionS));
1591 *symbol_get_obj (sym)->size = exp;
252b5132
RH
1592 }
1593 demand_empty_rest_of_line ();
1594}
1595
1596/* Handle the ELF .type pseudo-op. This sets the type of a symbol.
aa8c34c3 1597 There are five syntaxes:
fa306131 1598
252b5132
RH
1599 The first (used on Solaris) is
1600 .type SYM,#function
1601 The second (used on UnixWare) is
1602 .type SYM,@function
1603 The third (reportedly to be used on Irix 6.0) is
1604 .type SYM STT_FUNC
1605 The fourth (used on NetBSD/Arm and Linux/ARM) is
1606 .type SYM,%function
aa8c34c3
JE
1607 The fifth (used on SVR4/860) is
1608 .type SYM,"function"
252b5132
RH
1609 */
1610
1611static void
1612obj_elf_type (ignore)
ab9da554 1613 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1614{
1615 char *name;
1616 char c;
1617 int type;
1618 const char *typename;
1619 symbolS *sym;
904a31bf 1620 elf_symbol_type *elfsym;
252b5132
RH
1621
1622 name = input_line_pointer;
1623 c = get_symbol_end ();
1624 sym = symbol_find_or_make (name);
904a31bf 1625 elfsym = (elf_symbol_type *) symbol_get_bfdsym (sym);
252b5132
RH
1626 *input_line_pointer = c;
1627
1628 SKIP_WHITESPACE ();
1629 if (*input_line_pointer == ',')
1630 ++input_line_pointer;
1631
1632 SKIP_WHITESPACE ();
1633 if ( *input_line_pointer == '#'
1634 || *input_line_pointer == '@'
aa8c34c3 1635 || *input_line_pointer == '"'
252b5132
RH
1636 || *input_line_pointer == '%')
1637 ++input_line_pointer;
1638
1639 typename = input_line_pointer;
1640 c = get_symbol_end ();
1641
1642 type = 0;
1643 if (strcmp (typename, "function") == 0
1644 || strcmp (typename, "STT_FUNC") == 0)
1645 type = BSF_FUNCTION;
1646 else if (strcmp (typename, "object") == 0
1647 || strcmp (typename, "STT_OBJECT") == 0)
1648 type = BSF_OBJECT;
b9734f35
JJ
1649 else if (strcmp (typename, "tls_object") == 0
1650 || strcmp (typename, "STT_TLS") == 0)
1651 type = BSF_OBJECT | BSF_THREAD_LOCAL;
e7b9a8c1
L
1652 else if (strcmp (typename, "notype") == 0
1653 || strcmp (typename, "STT_NOTYPE") == 0)
1654 ;
904a31bf
AM
1655#ifdef md_elf_symbol_type
1656 else if ((type = md_elf_symbol_type (typename, sym, elfsym)) != -1)
1657 ;
1658#endif
252b5132 1659 else
6ce8b369 1660 as_bad (_("unrecognized symbol type \"%s\""), typename);
252b5132
RH
1661
1662 *input_line_pointer = c;
1663
aa8c34c3
JE
1664 if (*input_line_pointer == '"')
1665 ++input_line_pointer;
1666
904a31bf 1667 elfsym->symbol.flags |= type;
252b5132
RH
1668
1669 demand_empty_rest_of_line ();
1670}
1671
1672static void
1673obj_elf_ident (ignore)
ab9da554 1674 int ignore ATTRIBUTE_UNUSED;
252b5132
RH
1675{
1676 static segT comment_section;
1677 segT old_section = now_seg;
1678 int old_subsection = now_subseg;
1679
5f91fe03
ILT
1680#ifdef md_flush_pending_output
1681 md_flush_pending_output ();
1682#endif
1683
252b5132
RH
1684 if (!comment_section)
1685 {
1686 char *p;
1687 comment_section = subseg_new (".comment", 0);
1688 bfd_set_section_flags (stdoutput, comment_section,
1689 SEC_READONLY | SEC_HAS_CONTENTS);
1690 p = frag_more (1);
1691 *p = 0;
1692 }
1693 else
1694 subseg_set (comment_section, 0);
1695 stringer (1);
1696 subseg_set (old_section, old_subsection);
1697}
1698
1699#ifdef INIT_STAB_SECTION
1700
1701/* The first entry in a .stabs section is special. */
1702
1703void
1704obj_elf_init_stab_section (seg)
1705 segT seg;
1706{
1707 char *file;
1708 char *p;
1709 char *stabstr_name;
1710 unsigned int stroff;
1711
1712 /* Force the section to align to a longword boundary. Without this,
1713 UnixWare ar crashes. */
1714 bfd_set_section_alignment (stdoutput, seg, 2);
1715
bf514e21 1716 /* Make space for this first symbol. */
252b5132 1717 p = frag_more (12);
bf514e21 1718 /* Zero it out. */
252b5132
RH
1719 memset (p, 0, 12);
1720 as_where (&file, (unsigned int *) NULL);
f91fafbd 1721 stabstr_name = (char *) xmalloc (strlen (segment_name (seg)) + 4);
252b5132
RH
1722 strcpy (stabstr_name, segment_name (seg));
1723 strcat (stabstr_name, "str");
1724 stroff = get_stab_string_offset (file, stabstr_name);
1725 know (stroff == 1);
1726 md_number_to_chars (p, stroff, 4);
1727 seg_info (seg)->stabu.p = p;
1728}
1729
1730#endif
1731
1732/* Fill in the counts in the first entry in a .stabs section. */
1733
1734static void
1735adjust_stab_sections (abfd, sec, xxx)
1736 bfd *abfd;
1737 asection *sec;
ab9da554 1738 PTR xxx ATTRIBUTE_UNUSED;
252b5132
RH
1739{
1740 char *name;
1741 asection *strsec;
1742 char *p;
1743 int strsz, nsyms;
1744
1745 if (strncmp (".stab", sec->name, 5))
1746 return;
1747 if (!strcmp ("str", sec->name + strlen (sec->name) - 3))
1748 return;
1749
1750 name = (char *) alloca (strlen (sec->name) + 4);
1751 strcpy (name, sec->name);
1752 strcat (name, "str");
1753 strsec = bfd_get_section_by_name (abfd, name);
1754 if (strsec)
1755 strsz = bfd_section_size (abfd, strsec);
1756 else
1757 strsz = 0;
1758 nsyms = bfd_section_size (abfd, sec) / 12 - 1;
1759
1760 p = seg_info (sec)->stabu.p;
1761 assert (p != 0);
1762
1763 bfd_h_put_16 (abfd, (bfd_vma) nsyms, (bfd_byte *) p + 6);
1764 bfd_h_put_32 (abfd, (bfd_vma) strsz, (bfd_byte *) p + 8);
1765}
1766
1767#ifdef NEED_ECOFF_DEBUG
1768
1769/* This function is called by the ECOFF code. It is supposed to
1770 record the external symbol information so that the backend can
1771 write it out correctly. The ELF backend doesn't actually handle
1772 this at the moment, so we do it ourselves. We save the information
1773 in the symbol. */
1774
1775void
1776elf_ecoff_set_ext (sym, ext)
1777 symbolS *sym;
1778 struct ecoff_extr *ext;
1779{
49309057 1780 symbol_get_bfdsym (sym)->udata.p = (PTR) ext;
252b5132
RH
1781}
1782
1783/* This function is called by bfd_ecoff_debug_externals. It is
1784 supposed to *EXT to the external symbol information, and return
1785 whether the symbol should be used at all. */
1786
b34976b6 1787static bfd_boolean
252b5132
RH
1788elf_get_extr (sym, ext)
1789 asymbol *sym;
1790 EXTR *ext;
1791{
1792 if (sym->udata.p == NULL)
b34976b6 1793 return FALSE;
252b5132 1794 *ext = *(EXTR *) sym->udata.p;
b34976b6 1795 return TRUE;
252b5132
RH
1796}
1797
1798/* This function is called by bfd_ecoff_debug_externals. It has
1799 nothing to do for ELF. */
1800
1801/*ARGSUSED*/
1802static void
1803elf_set_index (sym, indx)
5f91fe03
ILT
1804 asymbol *sym ATTRIBUTE_UNUSED;
1805 bfd_size_type indx ATTRIBUTE_UNUSED;
252b5132
RH
1806{
1807}
1808
1809#endif /* NEED_ECOFF_DEBUG */
1810
1811void
1812elf_frob_symbol (symp, puntp)
1813 symbolS *symp;
1814 int *puntp;
1815{
49309057
ILT
1816 struct elf_obj_sy *sy_obj;
1817
252b5132
RH
1818#ifdef NEED_ECOFF_DEBUG
1819 if (ECOFF_DEBUGGING)
1820 ecoff_frob_symbol (symp);
1821#endif
1822
49309057
ILT
1823 sy_obj = symbol_get_obj (symp);
1824
1825 if (sy_obj->size != NULL)
252b5132 1826 {
49309057 1827 switch (sy_obj->size->X_op)
252b5132
RH
1828 {
1829 case O_subtract:
1830 S_SET_SIZE (symp,
49309057
ILT
1831 (S_GET_VALUE (sy_obj->size->X_add_symbol)
1832 + sy_obj->size->X_add_number
1833 - S_GET_VALUE (sy_obj->size->X_op_symbol)));
252b5132
RH
1834 break;
1835 case O_constant:
1836 S_SET_SIZE (symp,
49309057
ILT
1837 (S_GET_VALUE (sy_obj->size->X_add_symbol)
1838 + sy_obj->size->X_add_number));
252b5132
RH
1839 break;
1840 default:
1841 as_bad (_(".size expression too complicated to fix up"));
1842 break;
1843 }
49309057
ILT
1844 free (sy_obj->size);
1845 sy_obj->size = NULL;
252b5132
RH
1846 }
1847
49309057 1848 if (sy_obj->versioned_name != NULL)
252b5132 1849 {
79082ff0
L
1850 char *p;
1851
1852 p = strchr (sy_obj->versioned_name, ELF_VER_CHR);
1853 know (p != NULL);
1854
252b5132
RH
1855 /* This symbol was given a new name with the .symver directive.
1856
1857 If this is an external reference, just rename the symbol to
1858 include the version string. This will make the relocs be
1859 against the correct versioned symbol.
1860
1861 If this is a definition, add an alias. FIXME: Using an alias
1862 will permit the debugging information to refer to the right
1863 symbol. However, it's not clear whether it is the best
1864 approach. */
1865
1866 if (! S_IS_DEFINED (symp))
1867 {
252b5132
RH
1868 /* Verify that the name isn't using the @@ syntax--this is
1869 reserved for definitions of the default version to link
1870 against. */
252b5132
RH
1871 if (p[1] == ELF_VER_CHR)
1872 {
1873 as_bad (_("invalid attempt to declare external version name as default in symbol `%s'"),
49309057 1874 sy_obj->versioned_name);
b34976b6 1875 *puntp = TRUE;
252b5132 1876 }
49309057 1877 S_SET_NAME (symp, sy_obj->versioned_name);
252b5132
RH
1878 }
1879 else
1880 {
79082ff0
L
1881 if (p [1] == ELF_VER_CHR && p [2] == ELF_VER_CHR)
1882 {
1883 size_t l;
1884
1885 /* The @@@ syntax is a special case. It renames the
1886 symbol name to versioned_name with one `@' removed. */
1887 l = strlen (&p[3]) + 1;
1888 memmove (&p [2], &p[3], l);
1889 S_SET_NAME (symp, sy_obj->versioned_name);
1890 }
1891 else
1892 {
1893 symbolS *symp2;
252b5132 1894
79082ff0
L
1895 /* FIXME: Creating a new symbol here is risky. We're
1896 in the final loop over the symbol table. We can
1897 get away with it only because the symbol goes to
1898 the end of the list, where the loop will still see
1899 it. It would probably be better to do this in
1900 obj_frob_file_before_adjust. */
252b5132 1901
79082ff0 1902 symp2 = symbol_find_or_make (sy_obj->versioned_name);
252b5132 1903
79082ff0 1904 /* Now we act as though we saw symp2 = sym. */
252b5132 1905
79082ff0 1906 S_SET_SEGMENT (symp2, S_GET_SEGMENT (symp));
252b5132 1907
79082ff0
L
1908 /* Subtracting out the frag address here is a hack
1909 because we are in the middle of the final loop. */
1910 S_SET_VALUE (symp2,
1911 (S_GET_VALUE (symp)
1912 - symbol_get_frag (symp)->fr_address));
252b5132 1913
79082ff0 1914 symbol_set_frag (symp2, symbol_get_frag (symp));
252b5132 1915
79082ff0
L
1916 /* This will copy over the size information. */
1917 copy_symbol_attributes (symp2, symp);
252b5132 1918
26eb4093
JJ
1919 S_SET_OTHER (symp2, S_GET_OTHER (symp));
1920
79082ff0
L
1921 if (S_IS_WEAK (symp))
1922 S_SET_WEAK (symp2);
252b5132 1923
79082ff0
L
1924 if (S_IS_EXTERNAL (symp))
1925 S_SET_EXTERNAL (symp2);
1926 }
252b5132
RH
1927 }
1928 }
1929
1930 /* Double check weak symbols. */
49309057 1931 if (S_IS_WEAK (symp))
252b5132
RH
1932 {
1933 if (S_IS_COMMON (symp))
6ce8b369 1934 as_bad (_("symbol `%s' can not be both weak and common"),
252b5132
RH
1935 S_GET_NAME (symp));
1936 }
1937
1938#ifdef TC_MIPS
1939 /* The Irix 5 and 6 assemblers set the type of any common symbol and
1940 any undefined non-function symbol to STT_OBJECT. We try to be
1941 compatible, since newer Irix 5 and 6 linkers care. However, we
1942 only set undefined symbols to be STT_OBJECT if we are on Irix,
1943 because that is the only time gcc will generate the necessary
1944 .global directives to mark functions. */
1945
1946 if (S_IS_COMMON (symp))
49309057 1947 symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
252b5132
RH
1948
1949 if (strstr (TARGET_OS, "irix") != NULL
49309057
ILT
1950 && ! S_IS_DEFINED (symp)
1951 && (symbol_get_bfdsym (symp)->flags & BSF_FUNCTION) == 0)
1952 symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
252b5132
RH
1953#endif
1954
c5e54cc2
ILT
1955#if 0 /* TC_PPC */
1956 /* If TC_PPC is defined, we used to force the type of a symbol to be
1957 BSF_OBJECT if it was otherwise unset. This was required by some
1958 version of VxWorks. Thomas de Lellis <tdel@windriver.com> says
1959 that this is no longer needed, so it is now commented out. */
49309057
ILT
1960 if ((symbol_get_bfdsym (symp)->flags
1961 & (BSF_FUNCTION | BSF_FILE | BSF_SECTION_SYM)) == 0
252b5132 1962 && S_IS_DEFINED (symp))
49309057 1963 symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
252b5132
RH
1964#endif
1965}
1966
060adf0e
AM
1967struct group_list
1968{
1969 asection **head; /* Section lists. */
1970 unsigned int *elt_count; /* Number of sections in each list. */
1971 unsigned int num_group; /* Number of lists. */
1972};
1973
1974/* Called via bfd_map_over_sections. If SEC is a member of a group,
1975 add it to a list of sections belonging to the group. INF is a
1976 pointer to a struct group_list, which is where we store the head of
1977 each list. */
1978
1979static void
1980build_group_lists (abfd, sec, inf)
1981 bfd *abfd ATTRIBUTE_UNUSED;
1982 asection *sec;
1983 PTR inf;
1984{
1985 struct group_list *list = (struct group_list *) inf;
aa1f4858 1986 const char *group_name = elf_group_name (sec);
060adf0e
AM
1987 unsigned int i;
1988
1989 if (group_name == NULL)
1990 return;
1991
1992 /* If this group already has a list, add the section to the head of
1993 the list. */
1994 for (i = 0; i < list->num_group; i++)
1995 {
aa1f4858 1996 if (strcmp (group_name, elf_group_name (list->head[i])) == 0)
060adf0e 1997 {
aa1f4858 1998 elf_next_in_group (sec) = list->head[i];
060adf0e
AM
1999 list->head[i] = sec;
2000 list->elt_count[i] += 1;
2001 return;
2002 }
2003 }
2004
2005 /* New group. Make the arrays bigger in chunks to minimize calls to
2006 realloc. */
2007 i = list->num_group;
2008 if ((i & 127) == 0)
2009 {
2010 unsigned int newsize = i + 128;
2011 list->head = xrealloc (list->head, newsize * sizeof (*list->head));
2012 list->elt_count = xrealloc (list->elt_count,
2013 newsize * sizeof (*list->elt_count));
2014 }
2015 list->head[i] = sec;
2016 list->elt_count[i] = 1;
2017 list->num_group += 1;
2018}
2019
252b5132
RH
2020void
2021elf_frob_file ()
2022{
060adf0e
AM
2023 struct group_list list;
2024 unsigned int i;
2025
252b5132
RH
2026 bfd_map_over_sections (stdoutput, adjust_stab_sections, (PTR) 0);
2027
060adf0e
AM
2028 /* Go find section groups. */
2029 list.num_group = 0;
2030 list.head = NULL;
2031 list.elt_count = NULL;
2032 bfd_map_over_sections (stdoutput, build_group_lists, (PTR) &list);
2033
2034 /* Make the SHT_GROUP sections that describe each section group. We
2035 can't set up the section contents here yet, because elf section
2036 indices have yet to be calculated. elf.c:set_group_contents does
2037 the rest of the work. */
2038 for (i = 0; i < list.num_group; i++)
2039 {
aa1f4858 2040 const char *group_name = elf_group_name (list.head[i]);
9758f3fc 2041 const char *sec_name;
060adf0e
AM
2042 asection *s;
2043 flagword flags;
9758f3fc
AM
2044 struct symbol *sy;
2045 int has_sym;
060adf0e 2046
060adf0e 2047 flags = SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_GROUP;
d2dab548 2048 for (s = list.head[i]; s != NULL; s = elf_next_in_group (s))
68bfbfcc 2049 if ((s->flags ^ flags) & SEC_LINK_ONCE)
d2dab548
AM
2050 {
2051 flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
2052 if (s != list.head[i])
2053 {
2054 as_warn (_("assuming all members of group `%s' are COMDAT"),
2055 group_name);
2056 break;
2057 }
2058 }
2059
9758f3fc
AM
2060 sec_name = group_name;
2061 sy = symbol_find_exact (group_name);
2062 has_sym = 0;
2063 if (sy != NULL
2064 && (sy == symbol_lastP
2065 || (sy->sy_next != NULL
2066 && sy->sy_next->sy_previous == sy)))
2067 {
2068 has_sym = 1;
2069 sec_name = ".group";
2070 }
2071 s = subseg_force_new (sec_name, 0);
060adf0e
AM
2072 if (s == NULL
2073 || !bfd_set_section_flags (stdoutput, s, flags)
2074 || !bfd_set_section_alignment (stdoutput, s, 2))
2075 {
2076 as_fatal (_("can't create group: %s"),
2077 bfd_errmsg (bfd_get_error ()));
2078 }
2079
aa1f4858
AM
2080 /* Pass a pointer to the first section in this group. */
2081 elf_next_in_group (s) = list.head[i];
9758f3fc
AM
2082 if (has_sym)
2083 elf_group_id (s) = sy->bsym;
060adf0e
AM
2084
2085 s->_raw_size = 4 * (list.elt_count[i] + 1);
2086 s->contents = frag_more (s->_raw_size);
2087 frag_now->fr_fix = frag_now_fix_octets ();
2088 }
2089
252b5132
RH
2090#ifdef elf_tc_final_processing
2091 elf_tc_final_processing ();
2092#endif
2093}
2094
4a1805b1 2095/* It removes any unneeded versioned symbols from the symbol table. */
339681c0
L
2096
2097void
2098elf_frob_file_before_adjust ()
2099{
2100 if (symbol_rootP)
2101 {
2102 symbolS *symp;
2103
2104 for (symp = symbol_rootP; symp; symp = symbol_next (symp))
00e6e13d 2105 if (!S_IS_DEFINED (symp))
79082ff0 2106 {
00e6e13d 2107 if (symbol_get_obj (symp)->versioned_name)
79082ff0
L
2108 {
2109 char *p;
2110
2111 /* The @@@ syntax is a special case. If the symbol is
2112 not defined, 2 `@'s will be removed from the
2113 versioned_name. */
2114
2115 p = strchr (symbol_get_obj (symp)->versioned_name,
2116 ELF_VER_CHR);
2117 know (p != NULL);
2118 if (p [1] == ELF_VER_CHR && p [2] == ELF_VER_CHR)
2119 {
2120 size_t l = strlen (&p[3]) + 1;
2121 memmove (&p [1], &p[3], l);
2122 }
2123 if (symbol_used_p (symp) == 0
2124 && symbol_used_in_reloc_p (symp) == 0)
2125 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2126 }
00e6e13d
JJ
2127
2128 /* If there was .weak foo, but foo was neither defined nor
2129 used anywhere, remove it. */
2130
2131 else if (S_IS_WEAK (symp)
2132 && symbol_used_p (symp) == 0
2133 && symbol_used_in_reloc_p (symp) == 0)
2134 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
79082ff0 2135 }
339681c0
L
2136 }
2137}
2138
252b5132
RH
2139/* It is required that we let write_relocs have the opportunity to
2140 optimize away fixups before output has begun, since it is possible
2141 to eliminate all fixups for a section and thus we never should
2142 have generated the relocation section. */
2143
2144void
2145elf_frob_file_after_relocs ()
2146{
2147#ifdef NEED_ECOFF_DEBUG
2148 if (ECOFF_DEBUGGING)
2149 /* Generate the ECOFF debugging information. */
2150 {
2151 const struct ecoff_debug_swap *debug_swap;
2152 struct ecoff_debug_info debug;
2153 char *buf;
2154 asection *sec;
2155
2156 debug_swap
2157 = get_elf_backend_data (stdoutput)->elf_backend_ecoff_debug_swap;
2158 know (debug_swap != (const struct ecoff_debug_swap *) NULL);
2159 ecoff_build_debug (&debug.symbolic_header, &buf, debug_swap);
2160
2161 /* Set up the pointers in debug. */
2162#define SET(ptr, offset, type) \
2163 debug.ptr = (type) (buf + debug.symbolic_header.offset)
2164
2165 SET (line, cbLineOffset, unsigned char *);
2166 SET (external_dnr, cbDnOffset, PTR);
2167 SET (external_pdr, cbPdOffset, PTR);
2168 SET (external_sym, cbSymOffset, PTR);
2169 SET (external_opt, cbOptOffset, PTR);
2170 SET (external_aux, cbAuxOffset, union aux_ext *);
2171 SET (ss, cbSsOffset, char *);
2172 SET (external_fdr, cbFdOffset, PTR);
2173 SET (external_rfd, cbRfdOffset, PTR);
2174 /* ssext and external_ext are set up just below. */
2175
2176#undef SET
2177
2178 /* Set up the external symbols. */
2179 debug.ssext = debug.ssext_end = NULL;
2180 debug.external_ext = debug.external_ext_end = NULL;
b34976b6 2181 if (! bfd_ecoff_debug_externals (stdoutput, &debug, debug_swap, TRUE,
252b5132 2182 elf_get_extr, elf_set_index))
6ce8b369 2183 as_fatal (_("failed to set up debugging information: %s"),
252b5132
RH
2184 bfd_errmsg (bfd_get_error ()));
2185
2186 sec = bfd_get_section_by_name (stdoutput, ".mdebug");
2187 assert (sec != NULL);
2188
b34976b6 2189 know (!stdoutput->output_has_begun);
252b5132
RH
2190
2191 /* We set the size of the section, call bfd_set_section_contents
2192 to force the ELF backend to allocate a file position, and then
2193 write out the data. FIXME: Is this really the best way to do
2194 this? */
2195 sec->_raw_size = bfd_ecoff_debug_size (stdoutput, &debug, debug_swap);
2196
5f91fe03
ILT
2197 /* Pass BUF to bfd_set_section_contents because this will
2198 eventually become a call to fwrite, and ISO C prohibits
2199 passing a NULL pointer to a stdio function even if the
2200 pointer will not be used. */
2201 if (! bfd_set_section_contents (stdoutput, sec, (PTR) buf,
252b5132 2202 (file_ptr) 0, (bfd_size_type) 0))
6ce8b369 2203 as_fatal (_("can't start writing .mdebug section: %s"),
252b5132
RH
2204 bfd_errmsg (bfd_get_error ()));
2205
b34976b6 2206 know (stdoutput->output_has_begun);
252b5132
RH
2207 know (sec->filepos != 0);
2208
2209 if (! bfd_ecoff_write_debug (stdoutput, &debug, debug_swap,
2210 sec->filepos))
6ce8b369 2211 as_fatal (_("could not write .mdebug section: %s"),
252b5132
RH
2212 bfd_errmsg (bfd_get_error ()));
2213 }
2214#endif /* NEED_ECOFF_DEBUG */
2215}
2216
2217#ifdef SCO_ELF
2218
2219/* Heavily plagarized from obj_elf_version. The idea is to emit the
2220 SCO specific identifier in the .notes section to satisfy the SCO
2221 linker.
2222
2223 This looks more complicated than it really is. As opposed to the
2224 "obvious" solution, this should handle the cross dev cases
2225 correctly. (i.e, hosting on a 64 bit big endian processor, but
2226 generating SCO Elf code) Efficiency isn't a concern, as there
2227 should be exactly one of these sections per object module.
2228
2229 SCO OpenServer 5 identifies it's ELF modules with a standard ELF
2230 .note section.
2231
fa306131
AM
2232 int_32 namesz = 4 ; Name size
2233 int_32 descsz = 12 ; Descriptive information
2234 int_32 type = 1 ;
2235 char name[4] = "SCO" ; Originator name ALWAYS SCO + NULL
252b5132
RH
2236 int_32 version = (major ver # << 16) | version of tools ;
2237 int_32 source = (tool_id << 16 ) | 1 ;
2238 int_32 info = 0 ; These are set by the SCO tools, but we
fa306131 2239 don't know enough about the source
252b5132
RH
2240 environment to set them. SCO ld currently
2241 ignores them, and recommends we set them
2242 to zero. */
2243
2244#define SCO_MAJOR_VERSION 0x1
2245#define SCO_MINOR_VERSION 0x1
2246
2247void
2248sco_id ()
2249{
2250
2251 char *name;
2252 unsigned int c;
2253 char ch;
2254 char *p;
2255 asection *seg = now_seg;
2256 subsegT subseg = now_subseg;
2257 Elf_Internal_Note i_note;
2258 Elf_External_Note e_note;
2259 asection *note_secp = (asection *) NULL;
2260 int i, len;
2261
2262 /* create the .note section */
2263
2264 note_secp = subseg_new (".note", 0);
2265 bfd_set_section_flags (stdoutput,
2266 note_secp,
2267 SEC_HAS_CONTENTS | SEC_READONLY);
2268
2269 /* process the version string */
2270
fa306131 2271 i_note.namesz = 4;
252b5132
RH
2272 i_note.descsz = 12; /* 12 descriptive bytes */
2273 i_note.type = NT_VERSION; /* Contains a version string */
2274
2275 p = frag_more (sizeof (i_note.namesz));
2276 md_number_to_chars (p, (valueT) i_note.namesz, 4);
2277
2278 p = frag_more (sizeof (i_note.descsz));
2279 md_number_to_chars (p, (valueT) i_note.descsz, 4);
2280
2281 p = frag_more (sizeof (i_note.type));
2282 md_number_to_chars (p, (valueT) i_note.type, 4);
2283
2284 p = frag_more (4);
fa306131 2285 strcpy (p, "SCO");
252b5132
RH
2286
2287 /* Note: this is the version number of the ELF we're representing */
2288 p = frag_more (4);
2289 md_number_to_chars (p, (SCO_MAJOR_VERSION << 16) | (SCO_MINOR_VERSION), 4);
2290
2291 /* Here, we pick a magic number for ourselves (yes, I "registered"
2292 it with SCO. The bottom bit shows that we are compat with the
2293 SCO ABI. */
2294 p = frag_more (4);
2295 md_number_to_chars (p, 0x4c520000 | 0x0001, 4);
2296
2297 /* If we knew (or cared) what the source language options were, we'd
2298 fill them in here. SCO has given us permission to ignore these
2299 and just set them to zero. */
2300 p = frag_more (4);
2301 md_number_to_chars (p, 0x0000, 4);
fa306131 2302
252b5132
RH
2303 frag_align (2, 0, 0);
2304
2305 /* We probably can't restore the current segment, for there likely
2306 isn't one yet... */
2307 if (seg && subseg)
2308 subseg_set (seg, subseg);
2309
2310}
2311
2312#endif /* SCO_ELF */
2313
5110c57e
HPN
2314static int
2315elf_separate_stab_sections ()
2316{
2317#ifdef NEED_ECOFF_DEBUG
2318 return (!ECOFF_DEBUGGING);
2319#else
2320 return 1;
2321#endif
2322}
2323
2324static void
2325elf_init_stab_section (seg)
2326 segT seg;
2327{
2328#ifdef NEED_ECOFF_DEBUG
2329 if (!ECOFF_DEBUGGING)
2330#endif
2331 obj_elf_init_stab_section (seg);
2332}
2333
252b5132
RH
2334const struct format_ops elf_format_ops =
2335{
2336 bfd_target_elf_flavour,
4c63da97
AM
2337 0, /* dfl_leading_underscore */
2338 1, /* emit_section_symbols */
5110c57e
HPN
2339 elf_begin,
2340 elf_file_symbol,
252b5132
RH
2341 elf_frob_symbol,
2342 elf_frob_file,
339681c0 2343 elf_frob_file_before_adjust,
a161fe53 2344 0, /* obj_frob_file_before_fix */
252b5132
RH
2345 elf_frob_file_after_relocs,
2346 elf_s_get_size, elf_s_set_size,
2347 elf_s_get_align, elf_s_set_align,
4c63da97 2348 elf_s_get_other,
5110c57e 2349 elf_s_set_other,
4c63da97 2350 0, /* s_get_desc */
5110c57e
HPN
2351 0, /* s_set_desc */
2352 0, /* s_get_type */
2353 0, /* s_set_type */
252b5132
RH
2354 elf_copy_symbol_attributes,
2355#ifdef NEED_ECOFF_DEBUG
2356 ecoff_generate_asm_lineno,
2357 ecoff_stab,
2358#else
4c63da97
AM
2359 0, /* generate_asm_lineno */
2360 0, /* process_stab */
252b5132 2361#endif
5110c57e
HPN
2362 elf_separate_stab_sections,
2363 elf_init_stab_section,
252b5132
RH
2364 elf_sec_sym_ok_for_reloc,
2365 elf_pop_insert,
2366#ifdef NEED_ECOFF_DEBUG
2367 elf_ecoff_set_ext,
2368#else
4c63da97 2369 0, /* ecoff_set_ext */
252b5132 2370#endif
4c63da97 2371 elf_obj_read_begin_hook,
5110c57e 2372 elf_obj_symbol_new_hook
252b5132 2373};
This page took 0.420666 seconds and 4 git commands to generate.