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. */
605 obj_elf_change_section (name
, type
, attr
, entsize
, group_name
, linkonce
, push
)
610 const char *group_name
;
617 const struct bfd_elf_special_section
*ssect
;
619 #ifdef md_flush_pending_output
620 md_flush_pending_output ();
623 /* Switch to the section, creating it if necessary. */
626 struct section_stack
*elt
;
627 elt
= xmalloc (sizeof (struct section_stack
));
628 elt
->next
= section_stack
;
630 elt
->prev_seg
= previous_section
;
631 elt
->subseg
= now_subseg
;
632 elt
->prev_subseg
= previous_subsection
;
635 previous_section
= now_seg
;
636 previous_subsection
= now_subseg
;
638 old_sec
= bfd_get_section_by_name (stdoutput
, name
);
639 sec
= subseg_new (name
, 0);
640 ssect
= _bfd_elf_get_sec_type_attr (stdoutput
, name
);
644 bfd_boolean override
= FALSE
;
646 if (type
== SHT_NULL
)
648 else if (type
!= ssect
->type
)
651 /* FIXME: gcc, as of 2002-10-22, will emit
653 .section .init_array,"aw",@progbits
655 for __attribute__ ((section (".init_array"))).
656 "@progbits" is incorrect. */
657 && ssect
->type
!= SHT_INIT_ARRAY
658 && ssect
->type
!= SHT_FINI_ARRAY
659 && ssect
->type
!= SHT_PREINIT_ARRAY
)
661 /* We allow to specify any type for a .note section. */
662 if (ssect
->type
!= SHT_NOTE
)
663 as_warn (_("setting incorrect section type for %s"),
668 as_warn (_("ignoring incorrect section type for %s"),
674 if (old_sec
== NULL
&& (attr
& ~ssect
->attr
) != 0)
676 /* As a GNU extension, we permit a .note section to be
677 allocatable. If the linker sees an allocatable .note
678 section, it will create a PT_NOTE segment in the output
679 file. We also allow "x" for .note.GNU-stack. */
680 if (ssect
->type
== SHT_NOTE
681 && (attr
== SHF_ALLOC
|| attr
== SHF_EXECINSTR
))
683 /* Allow different SHF_MERGE and SHF_STRINGS if we have
684 something like .rodata.str. */
685 else if (ssect
->suffix_length
== -2
686 && name
[ssect
->prefix_length
] == '.'
690 & ~SHF_STRINGS
) == 0)
692 /* .interp, .strtab and .symtab can have SHF_ALLOC. */
693 else if (attr
== SHF_ALLOC
694 && (strcmp (name
, ".interp") == 0
695 || strcmp (name
, ".strtab") == 0
696 || strcmp (name
, ".symtab") == 0))
700 as_warn (_("setting incorrect section attributes for %s"),
705 if (!override
&& old_sec
== NULL
)
709 if (type
!= SHT_NULL
)
710 elf_section_type (sec
) = type
;
712 elf_section_flags (sec
) = attr
;
714 /* Convert ELF type and flags to BFD flags. */
716 | ((attr
& SHF_WRITE
) ? 0 : SEC_READONLY
)
717 | ((attr
& SHF_ALLOC
) ? SEC_ALLOC
: 0)
718 | (((attr
& SHF_ALLOC
) && type
!= SHT_NOBITS
) ? SEC_LOAD
: 0)
719 | ((attr
& SHF_EXECINSTR
) ? SEC_CODE
: 0)
720 | ((attr
& SHF_MERGE
) ? SEC_MERGE
: 0)
721 | ((attr
& SHF_STRINGS
) ? SEC_STRINGS
: 0)
722 | ((attr
& SHF_TLS
) ? SEC_THREAD_LOCAL
: 0));
723 #ifdef md_elf_section_flags
724 flags
= md_elf_section_flags (flags
, attr
, type
);
731 /* Prevent SEC_HAS_CONTENTS from being inadvertently set. */
732 if (type
== SHT_NOBITS
)
733 seg_info (sec
)->bss
= 1;
736 flags
|= SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_DISCARD
;
737 bfd_set_section_flags (stdoutput
, sec
, flags
);
738 if (flags
& SEC_MERGE
)
739 sec
->entsize
= entsize
;
740 elf_group_name (sec
) = group_name
;
742 /* Add a symbol for this section to the symbol table. */
743 secsym
= symbol_find (name
);
745 symbol_set_bfdsym (secsym
, sec
->symbol
);
747 symbol_table_insert (section_symbol (sec
));
751 /* If section attributes are specified the second time we see a
752 particular section, then check that they are the same as we
753 saw the first time. */
754 if (((old_sec
->flags
^ flags
)
755 & (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
| SEC_CODE
756 | SEC_EXCLUDE
| SEC_SORT_ENTRIES
| SEC_MERGE
| SEC_STRINGS
757 | SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_DISCARD
758 | SEC_THREAD_LOCAL
)))
759 as_warn (_("ignoring changed section attributes for %s"), name
);
760 if ((flags
& SEC_MERGE
) && old_sec
->entsize
!= (unsigned) entsize
)
761 as_warn (_("ignoring changed section entity size for %s"), name
);
762 if ((attr
& SHF_GROUP
) != 0
763 && strcmp (elf_group_name (old_sec
), group_name
) != 0)
764 as_warn (_("ignoring new section group for %s"), name
);
767 #ifdef md_elf_section_change_hook
768 md_elf_section_change_hook ();
773 obj_elf_parse_section_letters (str
, len
)
790 attr
|= SHF_EXECINSTR
;
806 if (*(str
- 1) == 'a')
809 if (len
> 1 && str
[1] == 's')
818 char *bad_msg
= _("unrecognized .section attribute: want a,w,x,M,S,G,T");
819 #ifdef md_elf_section_letter
820 int md_attr
= md_elf_section_letter (*str
, &bad_msg
);
825 as_fatal ("%s", bad_msg
);
836 obj_elf_section_word (str
, len
)
840 if (len
== 5 && strncmp (str
, "write", 5) == 0)
842 if (len
== 5 && strncmp (str
, "alloc", 5) == 0)
844 if (len
== 9 && strncmp (str
, "execinstr", 9) == 0)
845 return SHF_EXECINSTR
;
846 if (len
== 3 && strncmp (str
, "tls", 3) == 0)
849 #ifdef md_elf_section_word
851 int md_attr
= md_elf_section_word (str
, len
);
857 as_warn (_("unrecognized section attribute"));
862 obj_elf_section_type (str
, len
)
866 if (len
== 8 && strncmp (str
, "progbits", 8) == 0)
868 if (len
== 6 && strncmp (str
, "nobits", 6) == 0)
870 if (len
== 4 && strncmp (str
, "note", 4) == 0)
873 #ifdef md_elf_section_type
875 int md_type
= md_elf_section_type (str
, len
);
881 as_warn (_("unrecognized section type"));
885 /* Get name of section. */
887 obj_elf_section_name ()
892 if (*input_line_pointer
== '"')
896 name
= demand_copy_C_string (&dummy
);
899 ignore_rest_of_line ();
905 char *end
= input_line_pointer
;
907 while (0 == strchr ("\n\t,; ", *end
))
909 if (end
== input_line_pointer
)
911 as_warn (_("missing name"));
912 ignore_rest_of_line ();
916 name
= xmalloc (end
- input_line_pointer
+ 1);
917 memcpy (name
, input_line_pointer
, end
- input_line_pointer
);
918 name
[end
- input_line_pointer
] = '\0';
919 #ifdef tc_canonicalize_section_name
920 name
= tc_canonicalize_section_name (name
);
922 input_line_pointer
= end
;
929 obj_elf_section (push
)
932 char *name
, *group_name
, *beg
;
933 int type
, attr
, dummy
;
942 #ifdef md_flush_pending_output
943 md_flush_pending_output ();
946 previous_section
= now_seg
;
947 previous_subsection
= now_subseg
;
949 s_mri_sect (&mri_type
);
951 #ifdef md_elf_section_change_hook
952 md_elf_section_change_hook ();
957 #endif /* ! defined (TC_I370) */
959 name
= obj_elf_section_name ();
968 if (*input_line_pointer
== ',')
970 /* Skip the comma. */
971 ++input_line_pointer
;
974 if (*input_line_pointer
== '"')
976 beg
= demand_copy_C_string (&dummy
);
979 ignore_rest_of_line ();
982 attr
|= obj_elf_parse_section_letters (beg
, strlen (beg
));
985 if (*input_line_pointer
== ',')
988 char *save
= input_line_pointer
;
990 ++input_line_pointer
;
992 c
= *input_line_pointer
;
995 beg
= demand_copy_C_string (&dummy
);
998 ignore_rest_of_line ();
1001 type
= obj_elf_section_type (beg
, strlen (beg
));
1003 else if (c
== '@' || c
== '%')
1005 beg
= ++input_line_pointer
;
1006 c
= get_symbol_end ();
1007 *input_line_pointer
= c
;
1008 type
= obj_elf_section_type (beg
, input_line_pointer
- beg
);
1011 input_line_pointer
= save
;
1015 if ((attr
& SHF_MERGE
) != 0 && *input_line_pointer
== ',')
1017 ++input_line_pointer
;
1019 entsize
= get_absolute_expression ();
1023 as_warn (_("invalid merge entity size"));
1028 else if ((attr
& SHF_MERGE
) != 0)
1030 as_warn (_("entity size for SHF_MERGE not specified"));
1034 if ((attr
& SHF_GROUP
) != 0 && *input_line_pointer
== ',')
1036 ++input_line_pointer
;
1037 group_name
= obj_elf_section_name ();
1038 if (group_name
== NULL
)
1040 else if (strncmp (input_line_pointer
, ",comdat", 7) == 0)
1042 input_line_pointer
+= 7;
1045 else if (strncmp (name
, ".gnu.linkonce", 13) == 0)
1048 else if ((attr
& SHF_GROUP
) != 0)
1050 as_warn (_("group name for SHF_GROUP not specified"));
1061 if (*input_line_pointer
!= '#')
1063 as_warn (_("character following name is not '#'"));
1064 ignore_rest_of_line ();
1067 beg
= ++input_line_pointer
;
1068 c
= get_symbol_end ();
1069 *input_line_pointer
= c
;
1071 attr
|= obj_elf_section_word (beg
, input_line_pointer
- beg
);
1075 while (*input_line_pointer
++ == ',');
1076 --input_line_pointer
;
1080 demand_empty_rest_of_line ();
1082 obj_elf_change_section (name
, type
, attr
, entsize
, group_name
, linkonce
, push
);
1085 /* Change to the .data section. */
1091 #ifdef md_flush_pending_output
1092 md_flush_pending_output ();
1095 previous_section
= now_seg
;
1096 previous_subsection
= now_subseg
;
1099 #ifdef md_elf_section_change_hook
1100 md_elf_section_change_hook ();
1104 /* Change to the .text section. */
1110 #ifdef md_flush_pending_output
1111 md_flush_pending_output ();
1114 previous_section
= now_seg
;
1115 previous_subsection
= now_subseg
;
1118 #ifdef md_elf_section_change_hook
1119 md_elf_section_change_hook ();
1124 obj_elf_subsection (ignore
)
1125 int ignore ATTRIBUTE_UNUSED
;
1129 #ifdef md_flush_pending_output
1130 md_flush_pending_output ();
1133 previous_section
= now_seg
;
1134 previous_subsection
= now_subseg
;
1136 temp
= get_absolute_expression ();
1137 subseg_set (now_seg
, (subsegT
) temp
);
1138 demand_empty_rest_of_line ();
1140 #ifdef md_elf_section_change_hook
1141 md_elf_section_change_hook ();
1145 /* This can be called from the processor backends if they change
1149 obj_elf_section_change_hook ()
1151 previous_section
= now_seg
;
1152 previous_subsection
= now_subseg
;
1156 obj_elf_previous (ignore
)
1157 int ignore ATTRIBUTE_UNUSED
;
1162 if (previous_section
== 0)
1164 as_warn (_(".previous without corresponding .section; ignored"));
1168 #ifdef md_flush_pending_output
1169 md_flush_pending_output ();
1172 new_section
= previous_section
;
1173 new_subsection
= previous_subsection
;
1174 previous_section
= now_seg
;
1175 previous_subsection
= now_subseg
;
1176 subseg_set (new_section
, new_subsection
);
1178 #ifdef md_elf_section_change_hook
1179 md_elf_section_change_hook ();
1184 obj_elf_popsection (xxx
)
1185 int xxx ATTRIBUTE_UNUSED
;
1187 struct section_stack
*top
= section_stack
;
1191 as_warn (_(".popsection without corresponding .pushsection; ignored"));
1195 #ifdef md_flush_pending_output
1196 md_flush_pending_output ();
1199 section_stack
= top
->next
;
1200 previous_section
= top
->prev_seg
;
1201 previous_subsection
= top
->prev_subseg
;
1202 subseg_set (top
->seg
, top
->subseg
);
1205 #ifdef md_elf_section_change_hook
1206 md_elf_section_change_hook ();
1211 obj_elf_line (ignore
)
1212 int ignore ATTRIBUTE_UNUSED
;
1214 /* Assume delimiter is part of expression. BSD4.2 as fails with
1215 delightful bug, so we are not being incompatible here. */
1216 new_logical_line ((char *) NULL
, (int) (get_absolute_expression ()));
1217 demand_empty_rest_of_line ();
1220 /* This handles the .symver pseudo-op, which is used to specify a
1221 symbol version. The syntax is ``.symver NAME,SYMVERNAME''.
1222 SYMVERNAME may contain ELF_VER_CHR ('@') characters. This
1223 pseudo-op causes the assembler to emit a symbol named SYMVERNAME
1224 with the same value as the symbol NAME. */
1227 obj_elf_symver (ignore
)
1228 int ignore ATTRIBUTE_UNUSED
;
1235 name
= input_line_pointer
;
1236 c
= get_symbol_end ();
1238 sym
= symbol_find_or_make (name
);
1240 *input_line_pointer
= c
;
1243 if (*input_line_pointer
!= ',')
1245 as_bad (_("expected comma after name in .symver"));
1246 ignore_rest_of_line ();
1250 ++input_line_pointer
;
1252 name
= input_line_pointer
;
1254 /* Temporarily include '@' in symbol names. */
1255 old_lexat
= lex_type
[(unsigned char) '@'];
1256 lex_type
[(unsigned char) '@'] |= LEX_NAME
;
1257 c
= get_symbol_end ();
1258 lex_type
[(unsigned char) '@'] = old_lexat
;
1260 if (symbol_get_obj (sym
)->versioned_name
== NULL
)
1262 symbol_get_obj (sym
)->versioned_name
= xstrdup (name
);
1264 *input_line_pointer
= c
;
1266 if (strchr (symbol_get_obj (sym
)->versioned_name
,
1267 ELF_VER_CHR
) == NULL
)
1269 as_bad (_("missing version name in `%s' for symbol `%s'"),
1270 symbol_get_obj (sym
)->versioned_name
,
1272 ignore_rest_of_line ();
1278 if (strcmp (symbol_get_obj (sym
)->versioned_name
, name
))
1280 as_bad (_("multiple versions [`%s'|`%s'] for symbol `%s'"),
1281 name
, symbol_get_obj (sym
)->versioned_name
,
1283 ignore_rest_of_line ();
1287 *input_line_pointer
= c
;
1290 demand_empty_rest_of_line ();
1293 /* This handles the .vtable_inherit pseudo-op, which is used to indicate
1294 to the linker the hierarchy in which a particular table resides. The
1295 syntax is ".vtable_inherit CHILDNAME, PARENTNAME". */
1298 obj_elf_vtable_inherit (ignore
)
1299 int ignore ATTRIBUTE_UNUSED
;
1301 char *cname
, *pname
;
1302 symbolS
*csym
, *psym
;
1305 if (*input_line_pointer
== '#')
1306 ++input_line_pointer
;
1308 cname
= input_line_pointer
;
1309 c
= get_symbol_end ();
1310 csym
= symbol_find (cname
);
1312 /* GCFIXME: should check that we don't have two .vtable_inherits for
1313 the same child symbol. Also, we can currently only do this if the
1314 child symbol is already exists and is placed in a fragment. */
1316 if (csym
== NULL
|| symbol_get_frag (csym
) == NULL
)
1318 as_bad ("expected `%s' to have already been set for .vtable_inherit",
1323 *input_line_pointer
= c
;
1326 if (*input_line_pointer
!= ',')
1328 as_bad ("expected comma after name in .vtable_inherit");
1329 ignore_rest_of_line ();
1333 ++input_line_pointer
;
1336 if (*input_line_pointer
== '#')
1337 ++input_line_pointer
;
1339 if (input_line_pointer
[0] == '0'
1340 && (input_line_pointer
[1] == '\0'
1341 || ISSPACE (input_line_pointer
[1])))
1343 psym
= section_symbol (absolute_section
);
1344 ++input_line_pointer
;
1348 pname
= input_line_pointer
;
1349 c
= get_symbol_end ();
1350 psym
= symbol_find_or_make (pname
);
1351 *input_line_pointer
= c
;
1354 demand_empty_rest_of_line ();
1359 assert (symbol_get_value_expression (csym
)->X_op
== O_constant
);
1360 return fix_new (symbol_get_frag (csym
),
1361 symbol_get_value_expression (csym
)->X_add_number
,
1362 0, psym
, 0, 0, BFD_RELOC_VTABLE_INHERIT
);
1365 /* This handles the .vtable_entry pseudo-op, which is used to indicate
1366 to the linker that a vtable slot was used. The syntax is
1367 ".vtable_entry tablename, offset". */
1370 obj_elf_vtable_entry (ignore
)
1371 int ignore ATTRIBUTE_UNUSED
;
1378 if (*input_line_pointer
== '#')
1379 ++input_line_pointer
;
1381 name
= input_line_pointer
;
1382 c
= get_symbol_end ();
1383 sym
= symbol_find_or_make (name
);
1384 *input_line_pointer
= c
;
1387 if (*input_line_pointer
!= ',')
1389 as_bad ("expected comma after name in .vtable_entry");
1390 ignore_rest_of_line ();
1394 ++input_line_pointer
;
1395 if (*input_line_pointer
== '#')
1396 ++input_line_pointer
;
1398 offset
= get_absolute_expression ();
1400 demand_empty_rest_of_line ();
1402 return fix_new (frag_now
, frag_now_fix (), 0, sym
, offset
, 0,
1403 BFD_RELOC_VTABLE_ENTRY
);
1407 elf_obj_read_begin_hook ()
1409 #ifdef NEED_ECOFF_DEBUG
1410 if (ECOFF_DEBUGGING
)
1411 ecoff_read_begin_hook ();
1416 elf_obj_symbol_new_hook (symbolP
)
1419 struct elf_obj_sy
*sy_obj
;
1421 sy_obj
= symbol_get_obj (symbolP
);
1422 sy_obj
->size
= NULL
;
1423 sy_obj
->versioned_name
= NULL
;
1425 #ifdef NEED_ECOFF_DEBUG
1426 if (ECOFF_DEBUGGING
)
1427 ecoff_symbol_new_hook (symbolP
);
1431 /* When setting one symbol equal to another, by default we probably
1432 want them to have the same "size", whatever it means in the current
1436 elf_copy_symbol_attributes (dest
, src
)
1437 symbolS
*dest
, *src
;
1439 struct elf_obj_sy
*srcelf
= symbol_get_obj (src
);
1440 struct elf_obj_sy
*destelf
= symbol_get_obj (dest
);
1443 if (destelf
->size
== NULL
)
1445 (expressionS
*) xmalloc (sizeof (expressionS
));
1446 *destelf
->size
= *srcelf
->size
;
1450 if (destelf
->size
!= NULL
)
1451 free (destelf
->size
);
1452 destelf
->size
= NULL
;
1454 S_SET_SIZE (dest
, S_GET_SIZE (src
));
1455 /* Don't copy visibility. */
1456 S_SET_OTHER (dest
, (ELF_ST_VISIBILITY (S_GET_OTHER (dest
))
1457 | (S_GET_OTHER (src
) & ~ELF_ST_VISIBILITY (-1))));
1461 obj_elf_version (ignore
)
1462 int ignore ATTRIBUTE_UNUSED
;
1467 asection
*seg
= now_seg
;
1468 subsegT subseg
= now_subseg
;
1469 Elf_Internal_Note i_note
;
1470 Elf_External_Note e_note
;
1471 asection
*note_secp
= (asection
*) NULL
;
1475 if (*input_line_pointer
== '\"')
1477 ++input_line_pointer
; /* -> 1st char of string. */
1478 name
= input_line_pointer
;
1480 while (is_a_char (c
= next_char_of_string ()))
1482 c
= *input_line_pointer
;
1483 *input_line_pointer
= '\0';
1484 *(input_line_pointer
- 1) = '\0';
1485 *input_line_pointer
= c
;
1487 /* create the .note section */
1489 note_secp
= subseg_new (".note", 0);
1490 bfd_set_section_flags (stdoutput
,
1492 SEC_HAS_CONTENTS
| SEC_READONLY
);
1494 /* process the version string */
1496 len
= strlen (name
);
1498 i_note
.namesz
= ((len
+ 1) + 3) & ~3; /* round this to word boundary */
1499 i_note
.descsz
= 0; /* no description */
1500 i_note
.type
= NT_VERSION
;
1501 p
= frag_more (sizeof (e_note
.namesz
));
1502 md_number_to_chars (p
, (valueT
) i_note
.namesz
, sizeof (e_note
.namesz
));
1503 p
= frag_more (sizeof (e_note
.descsz
));
1504 md_number_to_chars (p
, (valueT
) i_note
.descsz
, sizeof (e_note
.descsz
));
1505 p
= frag_more (sizeof (e_note
.type
));
1506 md_number_to_chars (p
, (valueT
) i_note
.type
, sizeof (e_note
.type
));
1507 p
= frag_more (len
+ 1);
1510 frag_align (2, 0, 0);
1512 subseg_set (seg
, subseg
);
1516 as_bad (_("expected quoted string"));
1518 demand_empty_rest_of_line ();
1522 obj_elf_size (ignore
)
1523 int ignore ATTRIBUTE_UNUSED
;
1525 char *name
= input_line_pointer
;
1526 char c
= get_symbol_end ();
1531 p
= input_line_pointer
;
1534 if (*input_line_pointer
!= ',')
1537 as_bad (_("expected comma after name `%s' in .size directive"), name
);
1539 ignore_rest_of_line ();
1542 input_line_pointer
++;
1544 if (exp
.X_op
== O_absent
)
1546 as_bad (_("missing expression in .size directive"));
1547 exp
.X_op
= O_constant
;
1548 exp
.X_add_number
= 0;
1551 sym
= symbol_find_or_make (name
);
1553 if (exp
.X_op
== O_constant
)
1555 S_SET_SIZE (sym
, exp
.X_add_number
);
1556 if (symbol_get_obj (sym
)->size
)
1558 xfree (symbol_get_obj (sym
)->size
);
1559 symbol_get_obj (sym
)->size
= NULL
;
1564 symbol_get_obj (sym
)->size
=
1565 (expressionS
*) xmalloc (sizeof (expressionS
));
1566 *symbol_get_obj (sym
)->size
= exp
;
1568 demand_empty_rest_of_line ();
1571 /* Handle the ELF .type pseudo-op. This sets the type of a symbol.
1572 There are five syntaxes:
1574 The first (used on Solaris) is
1576 The second (used on UnixWare) is
1578 The third (reportedly to be used on Irix 6.0) is
1580 The fourth (used on NetBSD/Arm and Linux/ARM) is
1582 The fifth (used on SVR4/860) is
1583 .type SYM,"function"
1587 obj_elf_type (ignore
)
1588 int ignore ATTRIBUTE_UNUSED
;
1593 const char *typename
;
1595 elf_symbol_type
*elfsym
;
1597 name
= input_line_pointer
;
1598 c
= get_symbol_end ();
1599 sym
= symbol_find_or_make (name
);
1600 elfsym
= (elf_symbol_type
*) symbol_get_bfdsym (sym
);
1601 *input_line_pointer
= c
;
1604 if (*input_line_pointer
== ',')
1605 ++input_line_pointer
;
1608 if ( *input_line_pointer
== '#'
1609 || *input_line_pointer
== '@'
1610 || *input_line_pointer
== '"'
1611 || *input_line_pointer
== '%')
1612 ++input_line_pointer
;
1614 typename
= input_line_pointer
;
1615 c
= get_symbol_end ();
1618 if (strcmp (typename
, "function") == 0
1619 || strcmp (typename
, "STT_FUNC") == 0)
1620 type
= BSF_FUNCTION
;
1621 else if (strcmp (typename
, "object") == 0
1622 || strcmp (typename
, "STT_OBJECT") == 0)
1624 else if (strcmp (typename
, "tls_object") == 0
1625 || strcmp (typename
, "STT_TLS") == 0)
1626 type
= BSF_OBJECT
| BSF_THREAD_LOCAL
;
1627 else if (strcmp (typename
, "notype") == 0
1628 || strcmp (typename
, "STT_NOTYPE") == 0)
1630 #ifdef md_elf_symbol_type
1631 else if ((type
= md_elf_symbol_type (typename
, sym
, elfsym
)) != -1)
1635 as_bad (_("unrecognized symbol type \"%s\""), typename
);
1637 *input_line_pointer
= c
;
1639 if (*input_line_pointer
== '"')
1640 ++input_line_pointer
;
1642 elfsym
->symbol
.flags
|= type
;
1644 demand_empty_rest_of_line ();
1648 obj_elf_ident (ignore
)
1649 int ignore ATTRIBUTE_UNUSED
;
1651 static segT comment_section
;
1652 segT old_section
= now_seg
;
1653 int old_subsection
= now_subseg
;
1655 #ifdef md_flush_pending_output
1656 md_flush_pending_output ();
1659 if (!comment_section
)
1662 comment_section
= subseg_new (".comment", 0);
1663 bfd_set_section_flags (stdoutput
, comment_section
,
1664 SEC_READONLY
| SEC_HAS_CONTENTS
);
1669 subseg_set (comment_section
, 0);
1671 subseg_set (old_section
, old_subsection
);
1674 #ifdef INIT_STAB_SECTION
1676 /* The first entry in a .stabs section is special. */
1679 obj_elf_init_stab_section (seg
)
1685 unsigned int stroff
;
1687 /* Force the section to align to a longword boundary. Without this,
1688 UnixWare ar crashes. */
1689 bfd_set_section_alignment (stdoutput
, seg
, 2);
1691 /* Make space for this first symbol. */
1695 as_where (&file
, (unsigned int *) NULL
);
1696 stabstr_name
= (char *) xmalloc (strlen (segment_name (seg
)) + 4);
1697 strcpy (stabstr_name
, segment_name (seg
));
1698 strcat (stabstr_name
, "str");
1699 stroff
= get_stab_string_offset (file
, stabstr_name
);
1701 md_number_to_chars (p
, stroff
, 4);
1702 seg_info (seg
)->stabu
.p
= p
;
1707 /* Fill in the counts in the first entry in a .stabs section. */
1710 adjust_stab_sections (abfd
, sec
, xxx
)
1713 PTR xxx ATTRIBUTE_UNUSED
;
1720 if (strncmp (".stab", sec
->name
, 5))
1722 if (!strcmp ("str", sec
->name
+ strlen (sec
->name
) - 3))
1725 name
= (char *) alloca (strlen (sec
->name
) + 4);
1726 strcpy (name
, sec
->name
);
1727 strcat (name
, "str");
1728 strsec
= bfd_get_section_by_name (abfd
, name
);
1730 strsz
= bfd_section_size (abfd
, strsec
);
1733 nsyms
= bfd_section_size (abfd
, sec
) / 12 - 1;
1735 p
= seg_info (sec
)->stabu
.p
;
1738 bfd_h_put_16 (abfd
, (bfd_vma
) nsyms
, (bfd_byte
*) p
+ 6);
1739 bfd_h_put_32 (abfd
, (bfd_vma
) strsz
, (bfd_byte
*) p
+ 8);
1742 #ifdef NEED_ECOFF_DEBUG
1744 /* This function is called by the ECOFF code. It is supposed to
1745 record the external symbol information so that the backend can
1746 write it out correctly. The ELF backend doesn't actually handle
1747 this at the moment, so we do it ourselves. We save the information
1751 elf_ecoff_set_ext (sym
, ext
)
1753 struct ecoff_extr
*ext
;
1755 symbol_get_bfdsym (sym
)->udata
.p
= (PTR
) ext
;
1758 /* This function is called by bfd_ecoff_debug_externals. It is
1759 supposed to *EXT to the external symbol information, and return
1760 whether the symbol should be used at all. */
1763 elf_get_extr (sym
, ext
)
1767 if (sym
->udata
.p
== NULL
)
1769 *ext
= *(EXTR
*) sym
->udata
.p
;
1773 /* This function is called by bfd_ecoff_debug_externals. It has
1774 nothing to do for ELF. */
1778 elf_set_index (sym
, indx
)
1779 asymbol
*sym ATTRIBUTE_UNUSED
;
1780 bfd_size_type indx ATTRIBUTE_UNUSED
;
1784 #endif /* NEED_ECOFF_DEBUG */
1787 elf_frob_symbol (symp
, puntp
)
1791 struct elf_obj_sy
*sy_obj
;
1793 #ifdef NEED_ECOFF_DEBUG
1794 if (ECOFF_DEBUGGING
)
1795 ecoff_frob_symbol (symp
);
1798 sy_obj
= symbol_get_obj (symp
);
1800 if (sy_obj
->size
!= NULL
)
1802 switch (sy_obj
->size
->X_op
)
1806 (S_GET_VALUE (sy_obj
->size
->X_add_symbol
)
1807 + sy_obj
->size
->X_add_number
1808 - S_GET_VALUE (sy_obj
->size
->X_op_symbol
)));
1812 (S_GET_VALUE (sy_obj
->size
->X_add_symbol
)
1813 + sy_obj
->size
->X_add_number
));
1816 as_bad (_(".size expression too complicated to fix up"));
1819 free (sy_obj
->size
);
1820 sy_obj
->size
= NULL
;
1823 if (sy_obj
->versioned_name
!= NULL
)
1827 p
= strchr (sy_obj
->versioned_name
, ELF_VER_CHR
);
1830 /* This symbol was given a new name with the .symver directive.
1832 If this is an external reference, just rename the symbol to
1833 include the version string. This will make the relocs be
1834 against the correct versioned symbol.
1836 If this is a definition, add an alias. FIXME: Using an alias
1837 will permit the debugging information to refer to the right
1838 symbol. However, it's not clear whether it is the best
1841 if (! S_IS_DEFINED (symp
))
1843 /* Verify that the name isn't using the @@ syntax--this is
1844 reserved for definitions of the default version to link
1846 if (p
[1] == ELF_VER_CHR
)
1848 as_bad (_("invalid attempt to declare external version name as default in symbol `%s'"),
1849 sy_obj
->versioned_name
);
1852 S_SET_NAME (symp
, sy_obj
->versioned_name
);
1856 if (p
[1] == ELF_VER_CHR
&& p
[2] == ELF_VER_CHR
)
1860 /* The @@@ syntax is a special case. It renames the
1861 symbol name to versioned_name with one `@' removed. */
1862 l
= strlen (&p
[3]) + 1;
1863 memmove (&p
[2], &p
[3], l
);
1864 S_SET_NAME (symp
, sy_obj
->versioned_name
);
1870 /* FIXME: Creating a new symbol here is risky. We're
1871 in the final loop over the symbol table. We can
1872 get away with it only because the symbol goes to
1873 the end of the list, where the loop will still see
1874 it. It would probably be better to do this in
1875 obj_frob_file_before_adjust. */
1877 symp2
= symbol_find_or_make (sy_obj
->versioned_name
);
1879 /* Now we act as though we saw symp2 = sym. */
1881 S_SET_SEGMENT (symp2
, S_GET_SEGMENT (symp
));
1883 /* Subtracting out the frag address here is a hack
1884 because we are in the middle of the final loop. */
1887 - symbol_get_frag (symp
)->fr_address
));
1889 symbol_set_frag (symp2
, symbol_get_frag (symp
));
1891 /* This will copy over the size information. */
1892 copy_symbol_attributes (symp2
, symp
);
1894 S_SET_OTHER (symp2
, S_GET_OTHER (symp
));
1896 if (S_IS_WEAK (symp
))
1899 if (S_IS_EXTERNAL (symp
))
1900 S_SET_EXTERNAL (symp2
);
1905 /* Double check weak symbols. */
1906 if (S_IS_WEAK (symp
))
1908 if (S_IS_COMMON (symp
))
1909 as_bad (_("symbol `%s' can not be both weak and common"),
1914 /* The Irix 5 and 6 assemblers set the type of any common symbol and
1915 any undefined non-function symbol to STT_OBJECT. We try to be
1916 compatible, since newer Irix 5 and 6 linkers care. However, we
1917 only set undefined symbols to be STT_OBJECT if we are on Irix,
1918 because that is the only time gcc will generate the necessary
1919 .global directives to mark functions. */
1921 if (S_IS_COMMON (symp
))
1922 symbol_get_bfdsym (symp
)->flags
|= BSF_OBJECT
;
1924 if (strstr (TARGET_OS
, "irix") != NULL
1925 && ! S_IS_DEFINED (symp
)
1926 && (symbol_get_bfdsym (symp
)->flags
& BSF_FUNCTION
) == 0)
1927 symbol_get_bfdsym (symp
)->flags
|= BSF_OBJECT
;
1931 /* If TC_PPC is defined, we used to force the type of a symbol to be
1932 BSF_OBJECT if it was otherwise unset. This was required by some
1933 version of VxWorks. Thomas de Lellis <tdel@windriver.com> says
1934 that this is no longer needed, so it is now commented out. */
1935 if ((symbol_get_bfdsym (symp
)->flags
1936 & (BSF_FUNCTION
| BSF_FILE
| BSF_SECTION_SYM
)) == 0
1937 && S_IS_DEFINED (symp
))
1938 symbol_get_bfdsym (symp
)->flags
|= BSF_OBJECT
;
1944 asection
**head
; /* Section lists. */
1945 unsigned int *elt_count
; /* Number of sections in each list. */
1946 unsigned int num_group
; /* Number of lists. */
1949 /* Called via bfd_map_over_sections. If SEC is a member of a group,
1950 add it to a list of sections belonging to the group. INF is a
1951 pointer to a struct group_list, which is where we store the head of
1955 build_group_lists (abfd
, sec
, inf
)
1956 bfd
*abfd ATTRIBUTE_UNUSED
;
1960 struct group_list
*list
= (struct group_list
*) inf
;
1961 const char *group_name
= elf_group_name (sec
);
1964 if (group_name
== NULL
)
1967 /* If this group already has a list, add the section to the head of
1969 for (i
= 0; i
< list
->num_group
; i
++)
1971 if (strcmp (group_name
, elf_group_name (list
->head
[i
])) == 0)
1973 elf_next_in_group (sec
) = list
->head
[i
];
1974 list
->head
[i
] = sec
;
1975 list
->elt_count
[i
] += 1;
1980 /* New group. Make the arrays bigger in chunks to minimize calls to
1982 i
= list
->num_group
;
1985 unsigned int newsize
= i
+ 128;
1986 list
->head
= xrealloc (list
->head
, newsize
* sizeof (*list
->head
));
1987 list
->elt_count
= xrealloc (list
->elt_count
,
1988 newsize
* sizeof (*list
->elt_count
));
1990 list
->head
[i
] = sec
;
1991 list
->elt_count
[i
] = 1;
1992 list
->num_group
+= 1;
1998 struct group_list list
;
2001 bfd_map_over_sections (stdoutput
, adjust_stab_sections
, (PTR
) 0);
2003 /* Go find section groups. */
2006 list
.elt_count
= NULL
;
2007 bfd_map_over_sections (stdoutput
, build_group_lists
, (PTR
) &list
);
2009 /* Make the SHT_GROUP sections that describe each section group. We
2010 can't set up the section contents here yet, because elf section
2011 indices have yet to be calculated. elf.c:set_group_contents does
2012 the rest of the work. */
2013 for (i
= 0; i
< list
.num_group
; i
++)
2015 const char *group_name
= elf_group_name (list
.head
[i
]);
2016 const char *sec_name
;
2022 flags
= SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
| SEC_GROUP
;
2023 for (s
= list
.head
[i
]; s
!= NULL
; s
= elf_next_in_group (s
))
2024 if ((s
->flags
^ flags
) & SEC_LINK_ONCE
)
2026 flags
|= SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_DISCARD
;
2027 if (s
!= list
.head
[i
])
2029 as_warn (_("assuming all members of group `%s' are COMDAT"),
2035 sec_name
= group_name
;
2036 sy
= symbol_find_exact (group_name
);
2039 && (sy
== symbol_lastP
2040 || (sy
->sy_next
!= NULL
2041 && sy
->sy_next
->sy_previous
== sy
)))
2044 sec_name
= ".group";
2046 s
= subseg_force_new (sec_name
, 0);
2048 || !bfd_set_section_flags (stdoutput
, s
, flags
)
2049 || !bfd_set_section_alignment (stdoutput
, s
, 2))
2051 as_fatal (_("can't create group: %s"),
2052 bfd_errmsg (bfd_get_error ()));
2054 elf_section_type (s
) = SHT_GROUP
;
2056 /* Pass a pointer to the first section in this group. */
2057 elf_next_in_group (s
) = list
.head
[i
];
2059 elf_group_id (s
) = sy
->bsym
;
2061 s
->_raw_size
= 4 * (list
.elt_count
[i
] + 1);
2062 s
->contents
= frag_more (s
->_raw_size
);
2063 frag_now
->fr_fix
= frag_now_fix_octets ();
2066 #ifdef elf_tc_final_processing
2067 elf_tc_final_processing ();
2071 /* It removes any unneeded versioned symbols from the symbol table. */
2074 elf_frob_file_before_adjust ()
2080 for (symp
= symbol_rootP
; symp
; symp
= symbol_next (symp
))
2081 if (!S_IS_DEFINED (symp
))
2083 if (symbol_get_obj (symp
)->versioned_name
)
2087 /* The @@@ syntax is a special case. If the symbol is
2088 not defined, 2 `@'s will be removed from the
2091 p
= strchr (symbol_get_obj (symp
)->versioned_name
,
2094 if (p
[1] == ELF_VER_CHR
&& p
[2] == ELF_VER_CHR
)
2096 size_t l
= strlen (&p
[3]) + 1;
2097 memmove (&p
[1], &p
[3], l
);
2099 if (symbol_used_p (symp
) == 0
2100 && symbol_used_in_reloc_p (symp
) == 0)
2101 symbol_remove (symp
, &symbol_rootP
, &symbol_lastP
);
2104 /* If there was .weak foo, but foo was neither defined nor
2105 used anywhere, remove it. */
2107 else if (S_IS_WEAK (symp
)
2108 && symbol_used_p (symp
) == 0
2109 && symbol_used_in_reloc_p (symp
) == 0)
2110 symbol_remove (symp
, &symbol_rootP
, &symbol_lastP
);
2115 /* It is required that we let write_relocs have the opportunity to
2116 optimize away fixups before output has begun, since it is possible
2117 to eliminate all fixups for a section and thus we never should
2118 have generated the relocation section. */
2121 elf_frob_file_after_relocs ()
2123 #ifdef NEED_ECOFF_DEBUG
2124 if (ECOFF_DEBUGGING
)
2125 /* Generate the ECOFF debugging information. */
2127 const struct ecoff_debug_swap
*debug_swap
;
2128 struct ecoff_debug_info debug
;
2133 = get_elf_backend_data (stdoutput
)->elf_backend_ecoff_debug_swap
;
2134 know (debug_swap
!= (const struct ecoff_debug_swap
*) NULL
);
2135 ecoff_build_debug (&debug
.symbolic_header
, &buf
, debug_swap
);
2137 /* Set up the pointers in debug. */
2138 #define SET(ptr, offset, type) \
2139 debug.ptr = (type) (buf + debug.symbolic_header.offset)
2141 SET (line
, cbLineOffset
, unsigned char *);
2142 SET (external_dnr
, cbDnOffset
, PTR
);
2143 SET (external_pdr
, cbPdOffset
, PTR
);
2144 SET (external_sym
, cbSymOffset
, PTR
);
2145 SET (external_opt
, cbOptOffset
, PTR
);
2146 SET (external_aux
, cbAuxOffset
, union aux_ext
*);
2147 SET (ss
, cbSsOffset
, char *);
2148 SET (external_fdr
, cbFdOffset
, PTR
);
2149 SET (external_rfd
, cbRfdOffset
, PTR
);
2150 /* ssext and external_ext are set up just below. */
2154 /* Set up the external symbols. */
2155 debug
.ssext
= debug
.ssext_end
= NULL
;
2156 debug
.external_ext
= debug
.external_ext_end
= NULL
;
2157 if (! bfd_ecoff_debug_externals (stdoutput
, &debug
, debug_swap
, TRUE
,
2158 elf_get_extr
, elf_set_index
))
2159 as_fatal (_("failed to set up debugging information: %s"),
2160 bfd_errmsg (bfd_get_error ()));
2162 sec
= bfd_get_section_by_name (stdoutput
, ".mdebug");
2163 assert (sec
!= NULL
);
2165 know (!stdoutput
->output_has_begun
);
2167 /* We set the size of the section, call bfd_set_section_contents
2168 to force the ELF backend to allocate a file position, and then
2169 write out the data. FIXME: Is this really the best way to do
2171 sec
->_raw_size
= bfd_ecoff_debug_size (stdoutput
, &debug
, debug_swap
);
2173 /* Pass BUF to bfd_set_section_contents because this will
2174 eventually become a call to fwrite, and ISO C prohibits
2175 passing a NULL pointer to a stdio function even if the
2176 pointer will not be used. */
2177 if (! bfd_set_section_contents (stdoutput
, sec
, (PTR
) buf
,
2178 (file_ptr
) 0, (bfd_size_type
) 0))
2179 as_fatal (_("can't start writing .mdebug section: %s"),
2180 bfd_errmsg (bfd_get_error ()));
2182 know (stdoutput
->output_has_begun
);
2183 know (sec
->filepos
!= 0);
2185 if (! bfd_ecoff_write_debug (stdoutput
, &debug
, debug_swap
,
2187 as_fatal (_("could not write .mdebug section: %s"),
2188 bfd_errmsg (bfd_get_error ()));
2190 #endif /* NEED_ECOFF_DEBUG */
2195 /* Heavily plagiarized from obj_elf_version. The idea is to emit the
2196 SCO specific identifier in the .notes section to satisfy the SCO
2199 This looks more complicated than it really is. As opposed to the
2200 "obvious" solution, this should handle the cross dev cases
2201 correctly. (i.e, hosting on a 64 bit big endian processor, but
2202 generating SCO Elf code) Efficiency isn't a concern, as there
2203 should be exactly one of these sections per object module.
2205 SCO OpenServer 5 identifies it's ELF modules with a standard ELF
2208 int_32 namesz = 4 ; Name size
2209 int_32 descsz = 12 ; Descriptive information
2211 char name[4] = "SCO" ; Originator name ALWAYS SCO + NULL
2212 int_32 version = (major ver # << 16) | version of tools ;
2213 int_32 source = (tool_id << 16 ) | 1 ;
2214 int_32 info = 0 ; These are set by the SCO tools, but we
2215 don't know enough about the source
2216 environment to set them. SCO ld currently
2217 ignores them, and recommends we set them
2220 #define SCO_MAJOR_VERSION 0x1
2221 #define SCO_MINOR_VERSION 0x1
2231 asection
*seg
= now_seg
;
2232 subsegT subseg
= now_subseg
;
2233 Elf_Internal_Note i_note
;
2234 Elf_External_Note e_note
;
2235 asection
*note_secp
= (asection
*) NULL
;
2238 /* create the .note section */
2240 note_secp
= subseg_new (".note", 0);
2241 bfd_set_section_flags (stdoutput
,
2243 SEC_HAS_CONTENTS
| SEC_READONLY
);
2245 /* process the version string */
2248 i_note
.descsz
= 12; /* 12 descriptive bytes */
2249 i_note
.type
= NT_VERSION
; /* Contains a version string */
2251 p
= frag_more (sizeof (i_note
.namesz
));
2252 md_number_to_chars (p
, (valueT
) i_note
.namesz
, 4);
2254 p
= frag_more (sizeof (i_note
.descsz
));
2255 md_number_to_chars (p
, (valueT
) i_note
.descsz
, 4);
2257 p
= frag_more (sizeof (i_note
.type
));
2258 md_number_to_chars (p
, (valueT
) i_note
.type
, 4);
2263 /* Note: this is the version number of the ELF we're representing */
2265 md_number_to_chars (p
, (SCO_MAJOR_VERSION
<< 16) | (SCO_MINOR_VERSION
), 4);
2267 /* Here, we pick a magic number for ourselves (yes, I "registered"
2268 it with SCO. The bottom bit shows that we are compat with the
2271 md_number_to_chars (p
, 0x4c520000 | 0x0001, 4);
2273 /* If we knew (or cared) what the source language options were, we'd
2274 fill them in here. SCO has given us permission to ignore these
2275 and just set them to zero. */
2277 md_number_to_chars (p
, 0x0000, 4);
2279 frag_align (2, 0, 0);
2281 /* We probably can't restore the current segment, for there likely
2284 subseg_set (seg
, subseg
);
2288 #endif /* SCO_ELF */
2291 elf_separate_stab_sections ()
2293 #ifdef NEED_ECOFF_DEBUG
2294 return (!ECOFF_DEBUGGING
);
2301 elf_init_stab_section (seg
)
2304 #ifdef NEED_ECOFF_DEBUG
2305 if (!ECOFF_DEBUGGING
)
2307 obj_elf_init_stab_section (seg
);
2310 const struct format_ops elf_format_ops
=
2312 bfd_target_elf_flavour
,
2313 0, /* dfl_leading_underscore */
2314 1, /* emit_section_symbols */
2319 elf_frob_file_before_adjust
,
2320 0, /* obj_frob_file_before_fix */
2321 elf_frob_file_after_relocs
,
2322 elf_s_get_size
, elf_s_set_size
,
2323 elf_s_get_align
, elf_s_set_align
,
2330 elf_copy_symbol_attributes
,
2331 #ifdef NEED_ECOFF_DEBUG
2332 ecoff_generate_asm_lineno
,
2335 0, /* generate_asm_lineno */
2336 0, /* process_stab */
2338 elf_separate_stab_sections
,
2339 elf_init_stab_section
,
2340 elf_sec_sym_ok_for_reloc
,
2342 #ifdef NEED_ECOFF_DEBUG
2345 0, /* ecoff_set_ext */
2347 elf_obj_read_begin_hook
,
2348 elf_obj_symbol_new_hook