1 /* ELF object file format
2 Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
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.
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.
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
22 #define OBJ_HEADER "obj-elf.h"
24 #include "safe-ctype.h"
27 #include "struc-symbol.h"
28 #include "dwarf2dbg.h"
30 #ifndef ECOFF_DEBUGGING
31 #define ECOFF_DEBUGGING 0
33 #define NEED_ECOFF_DEBUG
36 #ifdef NEED_ECOFF_DEBUG
41 #include "elf/alpha.h"
56 static bfd_vma elf_s_get_size PARAMS ((symbolS *));
57 static void elf_s_set_size PARAMS ((symbolS *, bfd_vma));
58 static bfd_vma elf_s_get_align PARAMS ((symbolS *));
59 static void elf_s_set_align PARAMS ((symbolS *, bfd_vma));
60 static void elf_s_set_other PARAMS ((symbolS *, int));
61 static int elf_sec_sym_ok_for_reloc PARAMS ((asection *));
62 static void adjust_stab_sections PARAMS ((bfd *, asection *, PTR));
63 static void build_group_lists PARAMS ((bfd *, asection *, PTR));
64 static int elf_separate_stab_sections PARAMS ((void));
65 static void elf_init_stab_section PARAMS ((segT));
66 static symbolS *elf_common PARAMS ((int));
68 #ifdef NEED_ECOFF_DEBUG
69 static bfd_boolean elf_get_extr PARAMS ((asymbol *, EXTR *));
70 static void elf_set_index PARAMS ((asymbol *, bfd_size_type));
73 static void obj_elf_line PARAMS ((int));
74 void obj_elf_version PARAMS ((int));
75 static void obj_elf_size PARAMS ((int));
76 static void obj_elf_type PARAMS ((int));
77 static void obj_elf_ident PARAMS ((int));
78 static void obj_elf_weak PARAMS ((int));
79 static void obj_elf_local PARAMS ((int));
80 static void obj_elf_visibility PARAMS ((int));
81 static int obj_elf_parse_section_letters PARAMS ((char *, size_t));
82 static int obj_elf_section_word PARAMS ((char *, size_t));
83 static char *obj_elf_section_name PARAMS ((void));
84 static int obj_elf_section_type PARAMS ((char *, size_t));
85 static void obj_elf_symver PARAMS ((int));
86 static void obj_elf_subsection PARAMS ((int));
87 static void obj_elf_popsection PARAMS ((int));
88 static void obj_elf_tls_common PARAMS ((int));
90 static const pseudo_typeS elf_pseudo_table[] =
92 {"comm", obj_elf_common, 0},
93 {"common", obj_elf_common, 1},
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},
101 {"pushsection", obj_elf_section, 1},
102 {"popsection", obj_elf_popsection, 0},
103 {"size", obj_elf_size, 0},
104 {"type", obj_elf_type, 0},
105 {"version", obj_elf_version, 0},
106 {"weak", obj_elf_weak, 0},
108 /* These define symbol visibility. */
109 {"internal", obj_elf_visibility, STV_INTERNAL},
110 {"hidden", obj_elf_visibility, STV_HIDDEN},
111 {"protected", obj_elf_visibility, STV_PROTECTED},
113 /* These are used for stabs-in-elf configurations. */
114 {"line", obj_elf_line, 0},
116 /* This is a GNU extension to handle symbol versions. */
117 {"symver", obj_elf_symver, 0},
119 /* A GNU extension to change subsection only. */
120 {"subsection", obj_elf_subsection, 0},
122 /* These are GNU extensions to aid in garbage collecting C++ vtables. */
123 {"vtable_inherit", (void (*) PARAMS ((int))) &obj_elf_vtable_inherit, 0},
124 {"vtable_entry", (void (*) PARAMS ((int))) &obj_elf_vtable_entry, 0},
126 /* These are used for dwarf. */
130 /* These are used for dwarf2. */
131 { "file", (void (*) PARAMS ((int))) dwarf2_directive_file, 0 },
132 { "loc", dwarf2_directive_loc, 0 },
134 /* We need to trap the section changing calls to handle .previous. */
135 {"data", obj_elf_data, 0},
136 {"text", obj_elf_text, 0},
138 {"tls_common", obj_elf_tls_common, 0},
144 static const pseudo_typeS ecoff_debug_pseudo_table[] =
146 #ifdef NEED_ECOFF_DEBUG
147 /* COFF style debugging information for ECOFF. .ln is not used; .loc
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 },
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 },
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 },
173 /* Other ECOFF directives. */
174 { "extern", ecoff_directive_extern, 0 },
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 },
186 {NULL, NULL, 0} /* end sentinel */
190 #include "aout/aout64.h"
192 /* This is called when the assembler starts. */
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,
209 pop_insert (elf_pseudo_table);
211 pop_insert (ecoff_debug_pseudo_table);
218 return S_GET_SIZE (sym);
222 elf_s_set_size (sym, sz)
226 S_SET_SIZE (sym, sz);
230 elf_s_get_align (sym)
233 return S_GET_ALIGN (sym);
237 elf_s_set_align (sym, align)
241 S_SET_ALIGN (sym, align);
245 elf_s_get_other (sym)
248 return elf_symbol (symbol_get_bfdsym (sym))->internal_elf_sym.st_other;
252 elf_s_set_other (sym, other)
256 S_SET_OTHER (sym, other);
260 elf_sec_sym_ok_for_reloc (sec)
263 return obj_sec_sym_ok_for_reloc (sec);
272 sym = symbol_new (s, absolute_section, (valueT) 0, (struct frag *) 0);
273 symbol_set_frag (sym, &zero_address_frag);
274 symbol_get_bfdsym (sym)->flags |= BSF_FILE;
276 if (symbol_rootP != sym)
278 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
279 symbol_insert (sym, symbol_rootP, &symbol_rootP, &symbol_lastP);
281 verify_symbol_chain (symbol_rootP, symbol_lastP);
285 #ifdef NEED_ECOFF_DEBUG
291 elf_common (is_common)
297 offsetT temp, size, sign;
302 if (flag_mri && is_common)
308 name = input_line_pointer;
309 c = get_symbol_end ();
310 /* just after name is now '\0' */
311 p = input_line_pointer;
314 if (*input_line_pointer != ',')
316 as_bad (_("expected comma after symbol-name"));
317 ignore_rest_of_line ();
320 input_line_pointer++; /* skip ',' */
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)
326 as_bad (_(".COMMon length (%ld) out of range, ignored."), (long) temp);
327 ignore_rest_of_line ();
331 symbolP = symbol_find_or_make (name);
333 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
335 as_bad (_("symbol `%s' is already defined"), S_GET_NAME (symbolP));
336 ignore_rest_of_line ();
339 if (S_GET_VALUE (symbolP) != 0)
341 if (S_GET_VALUE (symbolP) != (valueT) size)
343 as_warn (_("length of .comm \"%s\" is already %ld; not changed to %ld"),
344 S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP),
348 know (symbolP->sy_frag == &zero_address_frag);
349 if (*input_line_pointer != ',')
354 input_line_pointer++;
357 if (! have_align || *input_line_pointer != '"')
363 temp = get_absolute_expr (&exp);
367 as_warn (_("common alignment negative; 0 assumed"));
370 if (symbol_get_obj (symbolP)->local)
379 old_subsec = now_subseg;
382 /* convert to a power of 2 alignment */
383 for (align = 0; (temp & 1) == 0; temp >>= 1, ++align);
386 as_bad (_("common alignment not a power of 2"));
387 ignore_rest_of_line ();
393 record_alignment (bss_section, align);
394 subseg_set (bss_section, 0);
396 frag_align (align, 0, 0);
397 if (S_GET_SEGMENT (symbolP) == bss_section)
398 symbol_get_frag (symbolP)->fr_symbol = 0;
399 symbol_set_frag (symbolP, frag_now);
400 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
401 (offsetT) size, (char *) 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);
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);
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))
427 while (*--input_line_pointer != '"')
429 input_line_pointer--;
430 goto bad_common_segment;
432 while (*input_line_pointer++ != '"')
434 goto allocate_common;
437 symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
439 demand_empty_rest_of_line ();
444 p = input_line_pointer;
445 while (*p && *p != '\n')
449 as_bad (_("bad .common segment %s"), input_line_pointer + 1);
451 input_line_pointer = p;
452 ignore_rest_of_line ();
458 obj_elf_common (is_common)
461 elf_common (is_common);
465 obj_elf_tls_common (ignore)
466 int ignore ATTRIBUTE_UNUSED;
468 symbolS *symbolP = elf_common (0);
471 symbol_get_bfdsym (symbolP)->flags |= BSF_THREAD_LOCAL;
475 obj_elf_local (ignore)
476 int ignore ATTRIBUTE_UNUSED;
484 name = input_line_pointer;
485 c = get_symbol_end ();
486 symbolP = symbol_find_or_make (name);
487 *input_line_pointer = c;
489 S_CLEAR_EXTERNAL (symbolP);
490 symbol_get_obj (symbolP)->local = 1;
493 input_line_pointer++;
495 if (*input_line_pointer == '\n')
500 demand_empty_rest_of_line ();
504 obj_elf_weak (ignore)
505 int ignore ATTRIBUTE_UNUSED;
513 name = input_line_pointer;
514 c = get_symbol_end ();
515 symbolP = symbol_find_or_make (name);
516 *input_line_pointer = c;
518 S_SET_WEAK (symbolP);
519 symbol_get_obj (symbolP)->local = 1;
522 input_line_pointer++;
524 if (*input_line_pointer == '\n')
529 demand_empty_rest_of_line ();
533 obj_elf_visibility (visibility)
540 elf_symbol_type *elfsym;
544 name = input_line_pointer;
545 c = get_symbol_end ();
546 symbolP = symbol_find_or_make (name);
547 *input_line_pointer = c;
551 bfdsym = symbol_get_bfdsym (symbolP);
552 elfsym = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym);
556 elfsym->internal_elf_sym.st_other &= ~3;
557 elfsym->internal_elf_sym.st_other |= visibility;
561 input_line_pointer ++;
565 if (*input_line_pointer == '\n')
571 demand_empty_rest_of_line ();
574 static segT previous_section;
575 static int previous_subsection;
579 struct section_stack *next;
581 int subseg, prev_subseg;
584 static struct section_stack *section_stack;
586 /* Handle the .section pseudo-op. This code supports two different
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).
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. */
604 /* Certain named sections have particular defined types, listed on p.
606 struct special_section
613 static struct special_section const special_sections[] =
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 },
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 },
624 { ".fini", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
625 { ".init", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
627 { ".line", SHT_PROGBITS, 0 },
628 { ".note", SHT_NOTE, 0 },
629 { ".rodata", SHT_PROGBITS, SHF_ALLOC },
630 { ".rodata1", SHT_PROGBITS, SHF_ALLOC },
631 { ".tbss", SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
632 { ".tdata", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_TLS },
633 { ".text", SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
634 { ".init_array",SHT_INIT_ARRAY, SHF_ALLOC + SHF_WRITE },
635 { ".fini_array",SHT_FINI_ARRAY, SHF_ALLOC + SHF_WRITE },
636 { ".preinit_array",SHT_PREINIT_ARRAY, SHF_ALLOC + SHF_WRITE },
638 #ifdef ELF_TC_SPECIAL_SECTIONS
639 ELF_TC_SPECIAL_SECTIONS
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 */ },
662 obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push)
667 const char *group_name;
676 #ifdef md_flush_pending_output
677 md_flush_pending_output ();
680 /* Switch to the section, creating it if necessary. */
683 struct section_stack *elt;
684 elt = xmalloc (sizeof (struct section_stack));
685 elt->next = section_stack;
687 elt->prev_seg = previous_section;
688 elt->subseg = now_subseg;
689 elt->prev_subseg = previous_subsection;
692 previous_section = now_seg;
693 previous_subsection = now_subseg;
695 old_sec = bfd_get_section_by_name (stdoutput, name);
696 sec = subseg_new (name, 0);
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)
702 if (type == SHT_NULL)
703 type = special_sections[i].type;
704 else if (type != special_sections[i].type)
707 /* FIXME: gcc, as of 2002-10-22, will emit
709 .section .init_array,"aw",@progbits
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)
717 as_warn (_("setting incorrect section type for %s"), name);
721 as_warn (_("ignoring incorrect section type for %s"), name);
722 type = special_sections[i].type;
725 if ((attr &~ special_sections[i].attributes) != 0
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
732 if (strcmp (name, ".note") != 0
733 || attr != SHF_ALLOC)
734 as_warn (_("setting incorrect section attributes for %s"),
737 attr |= special_sections[i].attributes;
741 /* Convert ELF type and flags to BFD flags. */
743 | ((attr & SHF_WRITE) ? 0 : SEC_READONLY)
744 | ((attr & SHF_ALLOC) ? SEC_ALLOC : 0)
745 | (((attr & SHF_ALLOC) && type != SHT_NOBITS) ? SEC_LOAD : 0)
746 | ((attr & SHF_EXECINSTR) ? SEC_CODE : 0)
747 | ((attr & SHF_MERGE) ? SEC_MERGE : 0)
748 | ((attr & SHF_STRINGS) ? SEC_STRINGS : 0)
749 | ((attr & SHF_TLS) ? SEC_THREAD_LOCAL : 0));
750 #ifdef md_elf_section_flags
751 flags = md_elf_section_flags (flags, attr, type);
758 /* Prevent SEC_HAS_CONTENTS from being inadvertently set. */
759 if (type == SHT_NOBITS)
760 seg_info (sec)->bss = 1;
763 flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
764 bfd_set_section_flags (stdoutput, sec, flags);
765 if (flags & SEC_MERGE)
766 sec->entsize = entsize;
767 elf_group_name (sec) = group_name;
769 /* Add a symbol for this section to the symbol table. */
770 secsym = symbol_find (name);
772 symbol_set_bfdsym (secsym, sec->symbol);
774 symbol_table_insert (section_symbol (sec));
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. */
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
784 | SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD
785 | SEC_THREAD_LOCAL)))
786 as_warn (_("ignoring changed section attributes for %s"), name);
787 if ((flags & SEC_MERGE) && old_sec->entsize != (unsigned) entsize)
788 as_warn (_("ignoring changed section entity size for %s"), name);
789 if ((attr & SHF_GROUP) != 0
790 && strcmp (elf_group_name (old_sec), group_name) != 0)
791 as_warn (_("ignoring new section group for %s"), name);
794 #ifdef md_elf_section_change_hook
795 md_elf_section_change_hook ();
800 obj_elf_parse_section_letters (str, len)
817 attr |= SHF_EXECINSTR;
833 if (*(str - 1) == 'a')
836 if (len > 1 && str[1] == 's')
845 char *bad_msg = _("unrecognized .section attribute: want a,w,x,M,S,G,T");
846 #ifdef md_elf_section_letter
847 int md_attr = md_elf_section_letter (*str, &bad_msg);
852 as_fatal ("%s", bad_msg);
863 obj_elf_section_word (str, len)
867 if (len == 5 && strncmp (str, "write", 5) == 0)
869 if (len == 5 && strncmp (str, "alloc", 5) == 0)
871 if (len == 9 && strncmp (str, "execinstr", 9) == 0)
872 return SHF_EXECINSTR;
873 if (len == 3 && strncmp (str, "tls", 3) == 0)
876 #ifdef md_elf_section_word
878 int md_attr = md_elf_section_word (str, len);
884 as_warn (_("unrecognized section attribute"));
889 obj_elf_section_type (str, len)
893 if (len == 8 && strncmp (str, "progbits", 8) == 0)
895 if (len == 6 && strncmp (str, "nobits", 6) == 0)
898 #ifdef md_elf_section_type
900 int md_type = md_elf_section_type (str, len);
906 as_warn (_("unrecognized section type"));
910 /* Get name of section. */
912 obj_elf_section_name ()
917 if (*input_line_pointer == '"')
921 name = demand_copy_C_string (&dummy);
924 ignore_rest_of_line ();
930 char *end = input_line_pointer;
932 while (0 == strchr ("\n\t,; ", *end))
934 if (end == input_line_pointer)
936 as_warn (_("missing name"));
937 ignore_rest_of_line ();
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';
944 #ifdef tc_canonicalize_section_name
945 name = tc_canonicalize_section_name (name);
947 input_line_pointer = end;
954 obj_elf_section (push)
957 char *name, *group_name, *beg;
958 int type, attr, dummy;
967 #ifdef md_flush_pending_output
968 md_flush_pending_output ();
971 previous_section = now_seg;
972 previous_subsection = now_subseg;
974 s_mri_sect (&mri_type);
976 #ifdef md_elf_section_change_hook
977 md_elf_section_change_hook ();
982 #endif /* ! defined (TC_I370) */
984 name = obj_elf_section_name ();
993 if (*input_line_pointer == ',')
995 /* Skip the comma. */
996 ++input_line_pointer;
999 if (*input_line_pointer == '"')
1001 beg = demand_copy_C_string (&dummy);
1004 ignore_rest_of_line ();
1007 attr |= obj_elf_parse_section_letters (beg, strlen (beg));
1010 if (*input_line_pointer == ',')
1013 char *save = input_line_pointer;
1015 ++input_line_pointer;
1017 c = *input_line_pointer;
1020 beg = demand_copy_C_string (&dummy);
1023 ignore_rest_of_line ();
1026 type = obj_elf_section_type (beg, strlen (beg));
1028 else if (c == '@' || c == '%')
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);
1036 input_line_pointer = save;
1040 if ((attr & SHF_MERGE) != 0 && *input_line_pointer == ',')
1042 ++input_line_pointer;
1044 entsize = get_absolute_expression ();
1048 as_warn (_("invalid merge entity size"));
1053 else if ((attr & SHF_MERGE) != 0)
1055 as_warn (_("entity size for SHF_MERGE not specified"));
1059 if ((attr & SHF_GROUP) != 0 && *input_line_pointer == ',')
1061 ++input_line_pointer;
1062 group_name = obj_elf_section_name ();
1063 if (group_name == NULL)
1065 else if (strncmp (input_line_pointer, ",comdat", 7) == 0)
1067 input_line_pointer += 7;
1070 else if (strncmp (name, ".gnu.linkonce", 13) == 0)
1073 else if ((attr & SHF_GROUP) != 0)
1075 as_warn (_("group name for SHF_GROUP not specified"));
1086 if (*input_line_pointer != '#')
1088 as_warn (_("character following name is not '#'"));
1089 ignore_rest_of_line ();
1092 beg = ++input_line_pointer;
1093 c = get_symbol_end ();
1094 *input_line_pointer = c;
1096 attr |= obj_elf_section_word (beg, input_line_pointer - beg);
1100 while (*input_line_pointer++ == ',');
1101 --input_line_pointer;
1105 demand_empty_rest_of_line ();
1107 obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push);
1110 /* Change to the .data section. */
1116 #ifdef md_flush_pending_output
1117 md_flush_pending_output ();
1120 previous_section = now_seg;
1121 previous_subsection = now_subseg;
1124 #ifdef md_elf_section_change_hook
1125 md_elf_section_change_hook ();
1129 /* Change to the .text section. */
1135 #ifdef md_flush_pending_output
1136 md_flush_pending_output ();
1139 previous_section = now_seg;
1140 previous_subsection = now_subseg;
1143 #ifdef md_elf_section_change_hook
1144 md_elf_section_change_hook ();
1149 obj_elf_subsection (ignore)
1150 int ignore ATTRIBUTE_UNUSED;
1154 #ifdef md_flush_pending_output
1155 md_flush_pending_output ();
1158 previous_section = now_seg;
1159 previous_subsection = now_subseg;
1161 temp = get_absolute_expression ();
1162 subseg_set (now_seg, (subsegT) temp);
1163 demand_empty_rest_of_line ();
1165 #ifdef md_elf_section_change_hook
1166 md_elf_section_change_hook ();
1170 /* This can be called from the processor backends if they change
1174 obj_elf_section_change_hook ()
1176 previous_section = now_seg;
1177 previous_subsection = now_subseg;
1181 obj_elf_previous (ignore)
1182 int ignore ATTRIBUTE_UNUSED;
1187 if (previous_section == 0)
1189 as_warn (_(".previous without corresponding .section; ignored"));
1193 #ifdef md_flush_pending_output
1194 md_flush_pending_output ();
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);
1203 #ifdef md_elf_section_change_hook
1204 md_elf_section_change_hook ();
1209 obj_elf_popsection (xxx)
1210 int xxx ATTRIBUTE_UNUSED;
1212 struct section_stack *top = section_stack;
1216 as_warn (_(".popsection without corresponding .pushsection; ignored"));
1220 #ifdef md_flush_pending_output
1221 md_flush_pending_output ();
1224 section_stack = top->next;
1225 previous_section = top->prev_seg;
1226 previous_subsection = top->prev_subseg;
1227 subseg_set (top->seg, top->subseg);
1230 #ifdef md_elf_section_change_hook
1231 md_elf_section_change_hook ();
1236 obj_elf_line (ignore)
1237 int ignore ATTRIBUTE_UNUSED;
1239 /* Assume delimiter is part of expression. BSD4.2 as fails with
1240 delightful bug, so we are not being incompatible here. */
1241 new_logical_line ((char *) NULL, (int) (get_absolute_expression ()));
1242 demand_empty_rest_of_line ();
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. */
1252 obj_elf_symver (ignore)
1253 int ignore ATTRIBUTE_UNUSED;
1260 name = input_line_pointer;
1261 c = get_symbol_end ();
1263 sym = symbol_find_or_make (name);
1265 *input_line_pointer = c;
1268 if (*input_line_pointer != ',')
1270 as_bad (_("expected comma after name in .symver"));
1271 ignore_rest_of_line ();
1275 ++input_line_pointer;
1277 name = input_line_pointer;
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;
1285 if (symbol_get_obj (sym)->versioned_name == NULL)
1287 symbol_get_obj (sym)->versioned_name = xstrdup (name);
1289 *input_line_pointer = c;
1291 if (strchr (symbol_get_obj (sym)->versioned_name,
1292 ELF_VER_CHR) == NULL)
1294 as_bad (_("missing version name in `%s' for symbol `%s'"),
1295 symbol_get_obj (sym)->versioned_name,
1297 ignore_rest_of_line ();
1303 if (strcmp (symbol_get_obj (sym)->versioned_name, name))
1305 as_bad (_("multiple versions [`%s'|`%s'] for symbol `%s'"),
1306 name, symbol_get_obj (sym)->versioned_name,
1308 ignore_rest_of_line ();
1312 *input_line_pointer = c;
1315 demand_empty_rest_of_line ();
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". */
1323 obj_elf_vtable_inherit (ignore)
1324 int ignore ATTRIBUTE_UNUSED;
1326 char *cname, *pname;
1327 symbolS *csym, *psym;
1330 if (*input_line_pointer == '#')
1331 ++input_line_pointer;
1333 cname = input_line_pointer;
1334 c = get_symbol_end ();
1335 csym = symbol_find (cname);
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. */
1341 if (csym == NULL || symbol_get_frag (csym) == NULL)
1343 as_bad ("expected `%s' to have already been set for .vtable_inherit",
1348 *input_line_pointer = c;
1351 if (*input_line_pointer != ',')
1353 as_bad ("expected comma after name in .vtable_inherit");
1354 ignore_rest_of_line ();
1358 ++input_line_pointer;
1361 if (*input_line_pointer == '#')
1362 ++input_line_pointer;
1364 if (input_line_pointer[0] == '0'
1365 && (input_line_pointer[1] == '\0'
1366 || ISSPACE (input_line_pointer[1])))
1368 psym = section_symbol (absolute_section);
1369 ++input_line_pointer;
1373 pname = input_line_pointer;
1374 c = get_symbol_end ();
1375 psym = symbol_find_or_make (pname);
1376 *input_line_pointer = c;
1379 demand_empty_rest_of_line ();
1384 assert (symbol_get_value_expression (csym)->X_op == O_constant);
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);
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". */
1395 obj_elf_vtable_entry (ignore)
1396 int ignore ATTRIBUTE_UNUSED;
1403 if (*input_line_pointer == '#')
1404 ++input_line_pointer;
1406 name = input_line_pointer;
1407 c = get_symbol_end ();
1408 sym = symbol_find_or_make (name);
1409 *input_line_pointer = c;
1412 if (*input_line_pointer != ',')
1414 as_bad ("expected comma after name in .vtable_entry");
1415 ignore_rest_of_line ();
1419 ++input_line_pointer;
1420 if (*input_line_pointer == '#')
1421 ++input_line_pointer;
1423 offset = get_absolute_expression ();
1425 demand_empty_rest_of_line ();
1427 return fix_new (frag_now, frag_now_fix (), 0, sym, offset, 0,
1428 BFD_RELOC_VTABLE_ENTRY);
1432 elf_obj_read_begin_hook ()
1434 #ifdef NEED_ECOFF_DEBUG
1435 if (ECOFF_DEBUGGING)
1436 ecoff_read_begin_hook ();
1441 elf_obj_symbol_new_hook (symbolP)
1444 struct elf_obj_sy *sy_obj;
1446 sy_obj = symbol_get_obj (symbolP);
1447 sy_obj->size = NULL;
1448 sy_obj->versioned_name = NULL;
1450 #ifdef NEED_ECOFF_DEBUG
1451 if (ECOFF_DEBUGGING)
1452 ecoff_symbol_new_hook (symbolP);
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
1461 elf_copy_symbol_attributes (dest, src)
1462 symbolS *dest, *src;
1464 struct elf_obj_sy *srcelf = symbol_get_obj (src);
1465 struct elf_obj_sy *destelf = symbol_get_obj (dest);
1468 if (destelf->size == NULL)
1470 (expressionS *) xmalloc (sizeof (expressionS));
1471 *destelf->size = *srcelf->size;
1475 if (destelf->size != NULL)
1476 free (destelf->size);
1477 destelf->size = NULL;
1479 S_SET_SIZE (dest, S_GET_SIZE (src));
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))));
1486 obj_elf_version (ignore)
1487 int ignore ATTRIBUTE_UNUSED;
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;
1500 if (*input_line_pointer == '\"')
1502 ++input_line_pointer; /* -> 1st char of string. */
1503 name = input_line_pointer;
1505 while (is_a_char (c = next_char_of_string ()))
1507 c = *input_line_pointer;
1508 *input_line_pointer = '\0';
1509 *(input_line_pointer - 1) = '\0';
1510 *input_line_pointer = c;
1512 /* create the .note section */
1514 note_secp = subseg_new (".note", 0);
1515 bfd_set_section_flags (stdoutput,
1517 SEC_HAS_CONTENTS | SEC_READONLY);
1519 /* process the version string */
1521 len = strlen (name);
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));
1527 md_number_to_chars (p, (valueT) i_note.namesz, sizeof (e_note.namesz));
1528 p = frag_more (sizeof (e_note.descsz));
1529 md_number_to_chars (p, (valueT) i_note.descsz, sizeof (e_note.descsz));
1530 p = frag_more (sizeof (e_note.type));
1531 md_number_to_chars (p, (valueT) i_note.type, sizeof (e_note.type));
1532 p = frag_more (len + 1);
1535 frag_align (2, 0, 0);
1537 subseg_set (seg, subseg);
1541 as_bad (_("expected quoted string"));
1543 demand_empty_rest_of_line ();
1547 obj_elf_size (ignore)
1548 int ignore ATTRIBUTE_UNUSED;
1550 char *name = input_line_pointer;
1551 char c = get_symbol_end ();
1556 p = input_line_pointer;
1559 if (*input_line_pointer != ',')
1562 as_bad (_("expected comma after name `%s' in .size directive"), name);
1564 ignore_rest_of_line ();
1567 input_line_pointer++;
1569 if (exp.X_op == O_absent)
1571 as_bad (_("missing expression in .size directive"));
1572 exp.X_op = O_constant;
1573 exp.X_add_number = 0;
1576 sym = symbol_find_or_make (name);
1578 if (exp.X_op == O_constant)
1580 S_SET_SIZE (sym, exp.X_add_number);
1581 if (symbol_get_obj (sym)->size)
1583 xfree (symbol_get_obj (sym)->size);
1584 symbol_get_obj (sym)->size = NULL;
1589 symbol_get_obj (sym)->size =
1590 (expressionS *) xmalloc (sizeof (expressionS));
1591 *symbol_get_obj (sym)->size = exp;
1593 demand_empty_rest_of_line ();
1596 /* Handle the ELF .type pseudo-op. This sets the type of a symbol.
1597 There are five syntaxes:
1599 The first (used on Solaris) is
1601 The second (used on UnixWare) is
1603 The third (reportedly to be used on Irix 6.0) is
1605 The fourth (used on NetBSD/Arm and Linux/ARM) is
1607 The fifth (used on SVR4/860) is
1608 .type SYM,"function"
1612 obj_elf_type (ignore)
1613 int ignore ATTRIBUTE_UNUSED;
1618 const char *typename;
1620 elf_symbol_type *elfsym;
1622 name = input_line_pointer;
1623 c = get_symbol_end ();
1624 sym = symbol_find_or_make (name);
1625 elfsym = (elf_symbol_type *) symbol_get_bfdsym (sym);
1626 *input_line_pointer = c;
1629 if (*input_line_pointer == ',')
1630 ++input_line_pointer;
1633 if ( *input_line_pointer == '#'
1634 || *input_line_pointer == '@'
1635 || *input_line_pointer == '"'
1636 || *input_line_pointer == '%')
1637 ++input_line_pointer;
1639 typename = input_line_pointer;
1640 c = get_symbol_end ();
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)
1649 else if (strcmp (typename, "tls_object") == 0
1650 || strcmp (typename, "STT_TLS") == 0)
1651 type = BSF_OBJECT | BSF_THREAD_LOCAL;
1652 else if (strcmp (typename, "notype") == 0
1653 || strcmp (typename, "STT_NOTYPE") == 0)
1655 #ifdef md_elf_symbol_type
1656 else if ((type = md_elf_symbol_type (typename, sym, elfsym)) != -1)
1660 as_bad (_("unrecognized symbol type \"%s\""), typename);
1662 *input_line_pointer = c;
1664 if (*input_line_pointer == '"')
1665 ++input_line_pointer;
1667 elfsym->symbol.flags |= type;
1669 demand_empty_rest_of_line ();
1673 obj_elf_ident (ignore)
1674 int ignore ATTRIBUTE_UNUSED;
1676 static segT comment_section;
1677 segT old_section = now_seg;
1678 int old_subsection = now_subseg;
1680 #ifdef md_flush_pending_output
1681 md_flush_pending_output ();
1684 if (!comment_section)
1687 comment_section = subseg_new (".comment", 0);
1688 bfd_set_section_flags (stdoutput, comment_section,
1689 SEC_READONLY | SEC_HAS_CONTENTS);
1694 subseg_set (comment_section, 0);
1696 subseg_set (old_section, old_subsection);
1699 #ifdef INIT_STAB_SECTION
1701 /* The first entry in a .stabs section is special. */
1704 obj_elf_init_stab_section (seg)
1710 unsigned int stroff;
1712 /* Force the section to align to a longword boundary. Without this,
1713 UnixWare ar crashes. */
1714 bfd_set_section_alignment (stdoutput, seg, 2);
1716 /* Make space for this first symbol. */
1720 as_where (&file, (unsigned int *) NULL);
1721 stabstr_name = (char *) xmalloc (strlen (segment_name (seg)) + 4);
1722 strcpy (stabstr_name, segment_name (seg));
1723 strcat (stabstr_name, "str");
1724 stroff = get_stab_string_offset (file, stabstr_name);
1726 md_number_to_chars (p, stroff, 4);
1727 seg_info (seg)->stabu.p = p;
1732 /* Fill in the counts in the first entry in a .stabs section. */
1735 adjust_stab_sections (abfd, sec, xxx)
1738 PTR xxx ATTRIBUTE_UNUSED;
1745 if (strncmp (".stab", sec->name, 5))
1747 if (!strcmp ("str", sec->name + strlen (sec->name) - 3))
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);
1755 strsz = bfd_section_size (abfd, strsec);
1758 nsyms = bfd_section_size (abfd, sec) / 12 - 1;
1760 p = seg_info (sec)->stabu.p;
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);
1767 #ifdef NEED_ECOFF_DEBUG
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
1776 elf_ecoff_set_ext (sym, ext)
1778 struct ecoff_extr *ext;
1780 symbol_get_bfdsym (sym)->udata.p = (PTR) ext;
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. */
1788 elf_get_extr (sym, ext)
1792 if (sym->udata.p == NULL)
1794 *ext = *(EXTR *) sym->udata.p;
1798 /* This function is called by bfd_ecoff_debug_externals. It has
1799 nothing to do for ELF. */
1803 elf_set_index (sym, indx)
1804 asymbol *sym ATTRIBUTE_UNUSED;
1805 bfd_size_type indx ATTRIBUTE_UNUSED;
1809 #endif /* NEED_ECOFF_DEBUG */
1812 elf_frob_symbol (symp, puntp)
1816 struct elf_obj_sy *sy_obj;
1818 #ifdef NEED_ECOFF_DEBUG
1819 if (ECOFF_DEBUGGING)
1820 ecoff_frob_symbol (symp);
1823 sy_obj = symbol_get_obj (symp);
1825 if (sy_obj->size != NULL)
1827 switch (sy_obj->size->X_op)
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)));
1837 (S_GET_VALUE (sy_obj->size->X_add_symbol)
1838 + sy_obj->size->X_add_number));
1841 as_bad (_(".size expression too complicated to fix up"));
1844 free (sy_obj->size);
1845 sy_obj->size = NULL;
1848 if (sy_obj->versioned_name != NULL)
1852 p = strchr (sy_obj->versioned_name, ELF_VER_CHR);
1855 /* This symbol was given a new name with the .symver directive.
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.
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
1866 if (! S_IS_DEFINED (symp))
1868 /* Verify that the name isn't using the @@ syntax--this is
1869 reserved for definitions of the default version to link
1871 if (p[1] == ELF_VER_CHR)
1873 as_bad (_("invalid attempt to declare external version name as default in symbol `%s'"),
1874 sy_obj->versioned_name);
1877 S_SET_NAME (symp, sy_obj->versioned_name);
1881 if (p [1] == ELF_VER_CHR && p [2] == ELF_VER_CHR)
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);
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. */
1902 symp2 = symbol_find_or_make (sy_obj->versioned_name);
1904 /* Now we act as though we saw symp2 = sym. */
1906 S_SET_SEGMENT (symp2, S_GET_SEGMENT (symp));
1908 /* Subtracting out the frag address here is a hack
1909 because we are in the middle of the final loop. */
1912 - symbol_get_frag (symp)->fr_address));
1914 symbol_set_frag (symp2, symbol_get_frag (symp));
1916 /* This will copy over the size information. */
1917 copy_symbol_attributes (symp2, symp);
1919 S_SET_OTHER (symp2, S_GET_OTHER (symp));
1921 if (S_IS_WEAK (symp))
1924 if (S_IS_EXTERNAL (symp))
1925 S_SET_EXTERNAL (symp2);
1930 /* Double check weak symbols. */
1931 if (S_IS_WEAK (symp))
1933 if (S_IS_COMMON (symp))
1934 as_bad (_("symbol `%s' can not be both weak and common"),
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. */
1946 if (S_IS_COMMON (symp))
1947 symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
1949 if (strstr (TARGET_OS, "irix") != NULL
1950 && ! S_IS_DEFINED (symp)
1951 && (symbol_get_bfdsym (symp)->flags & BSF_FUNCTION) == 0)
1952 symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
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
1959 that this is no longer needed, so it is now commented out. */
1960 if ((symbol_get_bfdsym (symp)->flags
1961 & (BSF_FUNCTION | BSF_FILE | BSF_SECTION_SYM)) == 0
1962 && S_IS_DEFINED (symp))
1963 symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
1969 asection **head; /* Section lists. */
1970 unsigned int *elt_count; /* Number of sections in each list. */
1971 unsigned int num_group; /* Number of lists. */
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
1980 build_group_lists (abfd, sec, inf)
1981 bfd *abfd ATTRIBUTE_UNUSED;
1985 struct group_list *list = (struct group_list *) inf;
1986 const char *group_name = elf_group_name (sec);
1989 if (group_name == NULL)
1992 /* If this group already has a list, add the section to the head of
1994 for (i = 0; i < list->num_group; i++)
1996 if (strcmp (group_name, elf_group_name (list->head[i])) == 0)
1998 elf_next_in_group (sec) = list->head[i];
1999 list->head[i] = sec;
2000 list->elt_count[i] += 1;
2005 /* New group. Make the arrays bigger in chunks to minimize calls to
2007 i = list->num_group;
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));
2015 list->head[i] = sec;
2016 list->elt_count[i] = 1;
2017 list->num_group += 1;
2023 struct group_list list;
2026 bfd_map_over_sections (stdoutput, adjust_stab_sections, (PTR) 0);
2028 /* Go find section groups. */
2031 list.elt_count = NULL;
2032 bfd_map_over_sections (stdoutput, build_group_lists, (PTR) &list);
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++)
2040 const char *group_name = elf_group_name (list.head[i]);
2041 const char *sec_name;
2047 flags = SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_GROUP;
2048 for (s = list.head[i]; s != NULL; s = elf_next_in_group (s))
2049 if ((s->flags ^ flags) & SEC_LINK_ONCE)
2051 flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
2052 if (s != list.head[i])
2054 as_warn (_("assuming all members of group `%s' are COMDAT"),
2060 sec_name = group_name;
2061 sy = symbol_find_exact (group_name);
2064 && (sy == symbol_lastP
2065 || (sy->sy_next != NULL
2066 && sy->sy_next->sy_previous == sy)))
2069 sec_name = ".group";
2071 s = subseg_force_new (sec_name, 0);
2073 || !bfd_set_section_flags (stdoutput, s, flags)
2074 || !bfd_set_section_alignment (stdoutput, s, 2))
2076 as_fatal (_("can't create group: %s"),
2077 bfd_errmsg (bfd_get_error ()));
2080 /* Pass a pointer to the first section in this group. */
2081 elf_next_in_group (s) = list.head[i];
2083 elf_group_id (s) = sy->bsym;
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 ();
2090 #ifdef elf_tc_final_processing
2091 elf_tc_final_processing ();
2095 /* It removes any unneeded versioned symbols from the symbol table. */
2098 elf_frob_file_before_adjust ()
2104 for (symp = symbol_rootP; symp; symp = symbol_next (symp))
2105 if (!S_IS_DEFINED (symp))
2107 if (symbol_get_obj (symp)->versioned_name)
2111 /* The @@@ syntax is a special case. If the symbol is
2112 not defined, 2 `@'s will be removed from the
2115 p = strchr (symbol_get_obj (symp)->versioned_name,
2118 if (p [1] == ELF_VER_CHR && p [2] == ELF_VER_CHR)
2120 size_t l = strlen (&p[3]) + 1;
2121 memmove (&p [1], &p[3], l);
2123 if (symbol_used_p (symp) == 0
2124 && symbol_used_in_reloc_p (symp) == 0)
2125 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2128 /* If there was .weak foo, but foo was neither defined nor
2129 used anywhere, remove it. */
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);
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. */
2145 elf_frob_file_after_relocs ()
2147 #ifdef NEED_ECOFF_DEBUG
2148 if (ECOFF_DEBUGGING)
2149 /* Generate the ECOFF debugging information. */
2151 const struct ecoff_debug_swap *debug_swap;
2152 struct ecoff_debug_info debug;
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);
2161 /* Set up the pointers in debug. */
2162 #define SET(ptr, offset, type) \
2163 debug.ptr = (type) (buf + debug.symbolic_header.offset)
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. */
2178 /* Set up the external symbols. */
2179 debug.ssext = debug.ssext_end = NULL;
2180 debug.external_ext = debug.external_ext_end = NULL;
2181 if (! bfd_ecoff_debug_externals (stdoutput, &debug, debug_swap, TRUE,
2182 elf_get_extr, elf_set_index))
2183 as_fatal (_("failed to set up debugging information: %s"),
2184 bfd_errmsg (bfd_get_error ()));
2186 sec = bfd_get_section_by_name (stdoutput, ".mdebug");
2187 assert (sec != NULL);
2189 know (!stdoutput->output_has_begun);
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
2195 sec->_raw_size = bfd_ecoff_debug_size (stdoutput, &debug, debug_swap);
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,
2202 (file_ptr) 0, (bfd_size_type) 0))
2203 as_fatal (_("can't start writing .mdebug section: %s"),
2204 bfd_errmsg (bfd_get_error ()));
2206 know (stdoutput->output_has_begun);
2207 know (sec->filepos != 0);
2209 if (! bfd_ecoff_write_debug (stdoutput, &debug, debug_swap,
2211 as_fatal (_("could not write .mdebug section: %s"),
2212 bfd_errmsg (bfd_get_error ()));
2214 #endif /* NEED_ECOFF_DEBUG */
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
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.
2229 SCO OpenServer 5 identifies it's ELF modules with a standard ELF
2232 int_32 namesz = 4 ; Name size
2233 int_32 descsz = 12 ; Descriptive information
2235 char name[4] = "SCO" ; Originator name ALWAYS SCO + NULL
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
2239 don't know enough about the source
2240 environment to set them. SCO ld currently
2241 ignores them, and recommends we set them
2244 #define SCO_MAJOR_VERSION 0x1
2245 #define SCO_MINOR_VERSION 0x1
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;
2262 /* create the .note section */
2264 note_secp = subseg_new (".note", 0);
2265 bfd_set_section_flags (stdoutput,
2267 SEC_HAS_CONTENTS | SEC_READONLY);
2269 /* process the version string */
2272 i_note.descsz = 12; /* 12 descriptive bytes */
2273 i_note.type = NT_VERSION; /* Contains a version string */
2275 p = frag_more (sizeof (i_note.namesz));
2276 md_number_to_chars (p, (valueT) i_note.namesz, 4);
2278 p = frag_more (sizeof (i_note.descsz));
2279 md_number_to_chars (p, (valueT) i_note.descsz, 4);
2281 p = frag_more (sizeof (i_note.type));
2282 md_number_to_chars (p, (valueT) i_note.type, 4);
2287 /* Note: this is the version number of the ELF we're representing */
2289 md_number_to_chars (p, (SCO_MAJOR_VERSION << 16) | (SCO_MINOR_VERSION), 4);
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
2295 md_number_to_chars (p, 0x4c520000 | 0x0001, 4);
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. */
2301 md_number_to_chars (p, 0x0000, 4);
2303 frag_align (2, 0, 0);
2305 /* We probably can't restore the current segment, for there likely
2308 subseg_set (seg, subseg);
2312 #endif /* SCO_ELF */
2315 elf_separate_stab_sections ()
2317 #ifdef NEED_ECOFF_DEBUG
2318 return (!ECOFF_DEBUGGING);
2325 elf_init_stab_section (seg)
2328 #ifdef NEED_ECOFF_DEBUG
2329 if (!ECOFF_DEBUGGING)
2331 obj_elf_init_stab_section (seg);
2334 const struct format_ops elf_format_ops =
2336 bfd_target_elf_flavour,
2337 0, /* dfl_leading_underscore */
2338 1, /* emit_section_symbols */
2343 elf_frob_file_before_adjust,
2344 0, /* obj_frob_file_before_fix */
2345 elf_frob_file_after_relocs,
2346 elf_s_get_size, elf_s_set_size,
2347 elf_s_get_align, elf_s_set_align,
2354 elf_copy_symbol_attributes,
2355 #ifdef NEED_ECOFF_DEBUG
2356 ecoff_generate_asm_lineno,
2359 0, /* generate_asm_lineno */
2360 0, /* process_stab */
2362 elf_separate_stab_sections,
2363 elf_init_stab_section,
2364 elf_sec_sym_ok_for_reloc,
2366 #ifdef NEED_ECOFF_DEBUG
2369 0, /* ecoff_set_ext */
2371 elf_obj_read_begin_hook,
2372 elf_obj_symbol_new_hook