1 /* ELF object file format
2 Copyright (C) 1992-2023 Free Software Foundation, Inc.
4 This file is part of GAS, the GNU Assembler.
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as
8 published by the Free Software Foundation; either version 3,
9 or (at your option) any later version.
11 GAS is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
14 the GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 #define OBJ_HEADER "obj-elf.h"
23 #include "safe-ctype.h"
26 #include "dwarf2dbg.h"
28 #ifndef ECOFF_DEBUGGING
29 #define ECOFF_DEBUGGING 0
31 #define NEED_ECOFF_DEBUG
34 #ifdef NEED_ECOFF_DEBUG
36 #include "bfd/ecoff-bfd.h"
40 #include "elf/alpha.h"
52 #include "elf/x86-64.h"
60 #include "elf/nios2.h"
67 static void obj_elf_line (int);
68 static void obj_elf_size (int);
69 static void obj_elf_type (int);
70 static void obj_elf_ident (int);
71 static void obj_elf_weak (int);
72 static void obj_elf_local (int);
73 static void obj_elf_visibility (int);
74 static void obj_elf_symver (int);
75 static void obj_elf_subsection (int);
76 static void obj_elf_popsection (int);
77 static void obj_elf_gnu_attribute (int);
78 static void obj_elf_tls_common (int);
79 static void obj_elf_lcomm (int);
80 static void obj_elf_struct (int);
81 static void obj_elf_attach_to_group (int);
83 static const pseudo_typeS elf_pseudo_table
[] =
85 {"attach_to_group", obj_elf_attach_to_group
, 0},
86 {"comm", obj_elf_common
, 0},
87 {"common", obj_elf_common
, 1},
88 {"ident", obj_elf_ident
, 0},
89 {"lcomm", obj_elf_lcomm
, 0},
90 {"local", obj_elf_local
, 0},
91 {"previous", obj_elf_previous
, 0},
92 {"section", obj_elf_section
, 0},
93 {"section.s", obj_elf_section
, 0},
94 {"sect", obj_elf_section
, 0},
95 {"sect.s", obj_elf_section
, 0},
96 {"pushsection", obj_elf_section
, 1},
97 {"popsection", obj_elf_popsection
, 0},
98 {"size", obj_elf_size
, 0},
99 {"type", obj_elf_type
, 0},
100 {"version", obj_elf_version
, 0},
101 {"weak", obj_elf_weak
, 0},
103 /* These define symbol visibility. */
104 {"internal", obj_elf_visibility
, STV_INTERNAL
},
105 {"hidden", obj_elf_visibility
, STV_HIDDEN
},
106 {"protected", obj_elf_visibility
, STV_PROTECTED
},
108 /* These are used for stabs-in-elf configurations. */
109 {"line", obj_elf_line
, 0},
111 /* This is a GNU extension to handle symbol versions. */
112 {"symver", obj_elf_symver
, 0},
114 /* A GNU extension to change subsection only. */
115 {"subsection", obj_elf_subsection
, 0},
117 /* These are GNU extensions to aid in garbage collecting C++ vtables. */
118 {"vtable_inherit", obj_elf_vtable_inherit
, 0},
119 {"vtable_entry", obj_elf_vtable_entry
, 0},
121 /* A GNU extension for object attributes. */
122 {"gnu_attribute", obj_elf_gnu_attribute
, 0},
124 /* These are used for dwarf2. */
125 { "file", dwarf2_directive_file
, 0 },
126 { "loc", dwarf2_directive_loc
, 0 },
127 { "loc_mark_labels", dwarf2_directive_loc_mark_labels
, 0 },
129 /* We need to trap the section changing calls to handle .previous. */
130 {"data", obj_elf_data
, 0},
131 {"offset", obj_elf_struct
, 0},
132 {"struct", obj_elf_struct
, 0},
133 {"text", obj_elf_text
, 0},
134 {"bss", obj_elf_bss
, 0},
136 {"tls_common", obj_elf_tls_common
, 0},
142 static const pseudo_typeS ecoff_debug_pseudo_table
[] =
144 #ifdef NEED_ECOFF_DEBUG
145 /* COFF style debugging information for ECOFF. .ln is not used; .loc
147 { "def", ecoff_directive_def
, 0 },
148 { "dim", ecoff_directive_dim
, 0 },
149 { "endef", ecoff_directive_endef
, 0 },
150 { "file", ecoff_directive_file
, 0 },
151 { "scl", ecoff_directive_scl
, 0 },
152 { "tag", ecoff_directive_tag
, 0 },
153 { "val", ecoff_directive_val
, 0 },
155 /* COFF debugging requires pseudo-ops .size and .type, but ELF
156 already has meanings for those. We use .esize and .etype
157 instead. These are only generated by gcc anyhow. */
158 { "esize", ecoff_directive_size
, 0 },
159 { "etype", ecoff_directive_type
, 0 },
161 /* ECOFF specific debugging information. */
162 { "aent", ecoff_directive_ent
, 1 },
163 { "begin", ecoff_directive_begin
, 0 },
164 { "bend", ecoff_directive_bend
, 0 },
165 { "end", ecoff_directive_end
, 0 },
166 { "ent", ecoff_directive_ent
, 0 },
167 { "fmask", ecoff_directive_fmask
, 0 },
168 { "frame", ecoff_directive_frame
, 0 },
169 { "loc", ecoff_directive_loc
, 0 },
170 { "mask", ecoff_directive_mask
, 0 },
172 /* Other ECOFF directives. */
173 { "extern", ecoff_directive_extern
, 0 },
175 /* These are used on Irix. I don't know how to implement them. */
176 { "alias", s_ignore
, 0 },
177 { "bgnb", s_ignore
, 0 },
178 { "endb", s_ignore
, 0 },
179 { "lab", s_ignore
, 0 },
180 { "noalias", s_ignore
, 0 },
181 { "verstamp", s_ignore
, 0 },
182 { "vreg", s_ignore
, 0 },
185 {NULL
, NULL
, 0} /* end sentinel */
189 #include "aout/aout64.h"
191 asection
*elf_com_section_ptr
;
194 elf_pop_insert (void)
196 pop_insert (elf_pseudo_table
);
198 pop_insert (ecoff_debug_pseudo_table
);
202 elf_s_get_size (symbolS
*sym
)
204 return S_GET_SIZE (sym
);
208 elf_s_set_size (symbolS
*sym
, bfd_vma sz
)
210 S_SET_SIZE (sym
, sz
);
214 elf_s_get_align (symbolS
*sym
)
216 return S_GET_ALIGN (sym
);
220 elf_s_set_align (symbolS
*sym
, bfd_vma align
)
222 S_SET_ALIGN (sym
, align
);
226 elf_s_get_other (symbolS
*sym
)
228 return elf_symbol (symbol_get_bfdsym (sym
))->internal_elf_sym
.st_other
;
232 elf_s_set_other (symbolS
*sym
, int other
)
234 S_SET_OTHER (sym
, other
);
238 elf_sec_sym_ok_for_reloc (asection
*sec
)
240 return obj_sec_sym_ok_for_reloc (sec
);
244 elf_file_symbol (const char *s
)
247 symbolS
*sym
= symbol_new (s
, absolute_section
, &zero_address_frag
, 0);
248 size_t name_length
= strlen (s
);
250 if (name_length
> strlen (S_GET_NAME (sym
)))
252 obstack_grow (¬es
, s
, name_length
+ 1);
253 S_SET_NAME (sym
, (const char *) obstack_finish (¬es
));
256 strcpy ((char *) S_GET_NAME (sym
), s
);
258 symbol_get_bfdsym (sym
)->flags
|= BSF_FILE
;
260 if (symbol_rootP
!= sym
261 && ((bsym
= symbol_get_bfdsym (symbol_rootP
)) == NULL
262 || (bsym
->flags
& BSF_FILE
) == 0))
264 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
265 symbol_insert (sym
, symbol_rootP
, &symbol_rootP
, &symbol_lastP
);
269 verify_symbol_chain (symbol_rootP
, symbol_lastP
);
272 #ifdef NEED_ECOFF_DEBUG
277 /* Called from read.c:s_comm after we've parsed .comm symbol, size.
278 Parse a possible alignment value. */
281 elf_common_parse (int ignore ATTRIBUTE_UNUSED
, symbolS
*symbolP
, addressT size
)
284 int is_local
= symbol_get_obj (symbolP
)->local
;
286 if (*input_line_pointer
== ',')
288 char *save
= input_line_pointer
;
290 input_line_pointer
++;
293 if (*input_line_pointer
== '"')
295 /* For sparc. Accept .common symbol, length, "bss" */
296 input_line_pointer
++;
297 /* Some use the dot, some don't. */
298 if (*input_line_pointer
== '.')
299 input_line_pointer
++;
300 /* Some say data, some say bss. */
301 if (startswith (input_line_pointer
, "bss\""))
302 input_line_pointer
+= 4;
303 else if (startswith (input_line_pointer
, "data\""))
304 input_line_pointer
+= 5;
307 char *p
= input_line_pointer
;
312 while (!is_end_of_line
[(unsigned char) *input_line_pointer
])
313 if (*input_line_pointer
++ == '"')
315 c
= *input_line_pointer
;
316 *input_line_pointer
= '\0';
317 as_bad (_("bad .common segment %s"), p
);
318 *input_line_pointer
= c
;
319 ignore_rest_of_line ();
322 /* ??? Don't ask me why these are always global. */
327 input_line_pointer
= save
;
328 align
= parse_align (is_local
);
329 if (align
== (addressT
) -1)
336 bss_alloc (symbolP
, size
, align
);
337 S_CLEAR_EXTERNAL (symbolP
);
341 S_SET_VALUE (symbolP
, size
);
342 S_SET_ALIGN (symbolP
, align
);
343 S_SET_EXTERNAL (symbolP
);
344 S_SET_SEGMENT (symbolP
, elf_com_section_ptr
);
347 symbol_get_bfdsym (symbolP
)->flags
|= BSF_OBJECT
;
353 obj_elf_common (int is_common
)
355 if (flag_mri
&& is_common
)
358 s_comm_internal (0, elf_common_parse
);
362 obj_elf_tls_common (int ignore ATTRIBUTE_UNUSED
)
364 symbolS
*symbolP
= s_comm_internal (0, elf_common_parse
);
367 symbol_get_bfdsym (symbolP
)->flags
|= BSF_THREAD_LOCAL
;
371 obj_elf_lcomm (int ignore ATTRIBUTE_UNUSED
)
373 symbolS
*symbolP
= s_comm_internal (0, s_lcomm_internal
);
376 symbol_get_bfdsym (symbolP
)->flags
|= BSF_OBJECT
;
380 get_sym_from_input_line_and_check (void)
386 c
= get_symbol_name (& name
);
387 sym
= symbol_find_or_make (name
);
388 *input_line_pointer
= c
;
389 SKIP_WHITESPACE_AFTER_NAME ();
391 /* There is no symbol name if input_line_pointer has not moved. */
392 if (name
== input_line_pointer
)
393 as_bad (_("Missing symbol name in directive"));
398 obj_elf_local (int ignore ATTRIBUTE_UNUSED
)
405 symbolP
= get_sym_from_input_line_and_check ();
406 c
= *input_line_pointer
;
407 S_CLEAR_EXTERNAL (symbolP
);
408 symbol_get_obj (symbolP
)->local
= 1;
411 input_line_pointer
++;
413 if (*input_line_pointer
== '\n')
418 demand_empty_rest_of_line ();
422 obj_elf_weak (int ignore ATTRIBUTE_UNUSED
)
429 symbolP
= get_sym_from_input_line_and_check ();
430 c
= *input_line_pointer
;
431 S_SET_WEAK (symbolP
);
434 input_line_pointer
++;
436 if (*input_line_pointer
== '\n')
441 demand_empty_rest_of_line ();
445 obj_elf_visibility (int visibility
)
450 elf_symbol_type
*elfsym
;
454 symbolP
= get_sym_from_input_line_and_check ();
456 bfdsym
= symbol_get_bfdsym (symbolP
);
457 elfsym
= elf_symbol_from (bfdsym
);
461 elfsym
->internal_elf_sym
.st_other
&= ~3;
462 elfsym
->internal_elf_sym
.st_other
|= visibility
;
464 c
= *input_line_pointer
;
467 input_line_pointer
++;
471 if (*input_line_pointer
== '\n')
477 demand_empty_rest_of_line ();
480 static segT previous_section
;
481 static int previous_subsection
;
485 struct section_stack
*next
;
487 int subseg
, prev_subseg
;
490 static struct section_stack
*section_stack
;
492 /* ELF section flags for unique sections. */
493 #define SEC_ASSEMBLER_SHF_MASK SHF_GNU_RETAIN
495 /* Return TRUE iff SEC matches the section info INF. */
498 get_section_by_match (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
, void *inf
)
500 struct elf_section_match
*match
= (struct elf_section_match
*) inf
;
501 const char *gname
= match
->group_name
;
502 const char *group_name
= elf_group_name (sec
);
503 const char *linked_to_symbol_name
504 = sec
->map_head
.linked_to_symbol_name
;
505 unsigned int sh_info
= elf_section_data (sec
)->this_hdr
.sh_info
;
506 bfd_vma sh_flags
= (elf_section_data (sec
)->this_hdr
.sh_flags
507 & SEC_ASSEMBLER_SHF_MASK
);
509 return (sh_info
== match
->sh_info
510 && sh_flags
== match
->sh_flags
511 && ((bfd_section_flags (sec
) & SEC_ASSEMBLER_SECTION_ID
)
512 == (match
->flags
& SEC_ASSEMBLER_SECTION_ID
))
513 && sec
->section_id
== match
->section_id
514 && (group_name
== gname
515 || (group_name
!= NULL
517 && strcmp (group_name
, gname
) == 0))
518 && (linked_to_symbol_name
== match
->linked_to_symbol_name
519 || (linked_to_symbol_name
!= NULL
520 && match
->linked_to_symbol_name
!= NULL
521 && strcmp (linked_to_symbol_name
,
522 match
->linked_to_symbol_name
) == 0)));
525 /* Handle the .section pseudo-op. This code supports two different
528 The first is found on Solaris, and looks like
529 .section ".sec1",#alloc,#execinstr,#write
530 Here the names after '#' are the SHF_* flags to turn on for the
531 section. I'm not sure how it determines the SHT_* type (BFD
532 doesn't really give us control over the type, anyhow).
534 The second format is found on UnixWare, and probably most SVR4
535 machines, and looks like
536 .section .sec1,"a",@progbits
537 The quoted string may contain any combination of a, w, x, and
538 represents the SHF_* flags to turn on for the section. The string
539 beginning with '@' can be progbits or nobits. There should be
540 other possibilities, but I don't know what they are. In any case,
541 BFD doesn't really let us set the section type. */
544 obj_elf_change_section (const char *name
,
548 struct elf_section_match
*match_p
,
555 const struct elf_backend_data
*bed
;
556 const struct bfd_elf_special_section
*ssect
;
560 static struct elf_section_match unused_match
;
561 match_p
= &unused_match
;
564 #ifdef md_flush_pending_output
565 md_flush_pending_output ();
568 /* Switch to the section, creating it if necessary. */
571 struct section_stack
*elt
;
572 elt
= XNEW (struct section_stack
);
573 elt
->next
= section_stack
;
575 elt
->prev_seg
= previous_section
;
576 elt
->subseg
= now_subseg
;
577 elt
->prev_subseg
= previous_subsection
;
581 obj_elf_section_change_hook ();
583 old_sec
= bfd_get_section_by_name_if (stdoutput
, name
, get_section_by_match
,
591 sec
= subseg_force_new (name
, 0);
593 bed
= get_elf_backend_data (stdoutput
);
594 ssect
= (*bed
->get_sec_type_attr
) (stdoutput
, sec
);
598 bool override
= false;
600 if (type
== SHT_NULL
)
602 else if (type
!= ssect
->type
)
605 /* Some older versions of gcc will emit
607 .section .init_array,"aw",@progbits
609 for __attribute__ ((section (".init_array"))).
610 "@progbits" is incorrect. Also for x86-64 large bss
611 sections, some older versions of gcc will emit
613 .section .lbss,"aw",@progbits
615 "@progbits" is incorrect. */
617 && (bed
->s
->arch_size
!= 64
618 || !(ssect
->attr
& SHF_X86_64_LARGE
))
620 && ssect
->type
!= SHT_INIT_ARRAY
621 && ssect
->type
!= SHT_FINI_ARRAY
622 && ssect
->type
!= SHT_PREINIT_ARRAY
)
624 /* We allow to specify any type for a .note section. */
625 if (ssect
->type
!= SHT_NOTE
626 /* Processor and application defined types are allowed too. */
627 && type
< SHT_LOPROC
)
628 as_warn (_("setting incorrect section type for %s"),
633 as_warn (_("ignoring incorrect section type for %s"),
639 if (old_sec
== NULL
&& ((attr
& ~(SHF_LINK_ORDER
642 & ~ssect
->attr
) != 0)
644 /* Strip SHF_GNU_RETAIN. */
645 bfd_vma generic_attr
= attr
;
646 if (elf_tdata (stdoutput
)->has_gnu_osabi
)
647 generic_attr
&= ~SHF_GNU_RETAIN
;
649 /* As a GNU extension, we permit a .note section to be
650 allocatable. If the linker sees an allocatable .note
651 section, it will create a PT_NOTE segment in the output
652 file. We also allow "x" for .note.GNU-stack. */
653 if (ssect
->type
== SHT_NOTE
654 && (generic_attr
== SHF_ALLOC
655 || generic_attr
== SHF_EXECINSTR
))
657 /* Allow different SHF_MERGE and SHF_STRINGS if we have
658 something like .rodata.str. */
659 else if (ssect
->suffix_length
== -2
660 && name
[ssect
->prefix_length
] == '.'
664 & ~SHF_STRINGS
) == 0)
666 /* .interp, .strtab and .symtab can have SHF_ALLOC. */
667 else if (generic_attr
== SHF_ALLOC
668 && (strcmp (name
, ".interp") == 0
669 || strcmp (name
, ".strtab") == 0
670 || strcmp (name
, ".symtab") == 0))
672 /* .note.GNU-stack can have SHF_EXECINSTR. */
673 else if (generic_attr
== SHF_EXECINSTR
674 && strcmp (name
, ".note.GNU-stack") == 0)
677 /* A section on Alpha may have SHF_ALPHA_GPREL. */
678 else if ((generic_attr
& ~ssect
->attr
) == SHF_ALPHA_GPREL
)
682 else if (generic_attr
== (SHF_EXECINSTR
| SHF_WRITE
| SHF_ALLOC
)
683 && (ssect
->type
== SHT_INIT_ARRAY
684 || ssect
->type
== SHT_FINI_ARRAY
685 || ssect
->type
== SHT_PREINIT_ARRAY
))
686 /* RX init/fini arrays can and should have the "awx" attributes set. */
691 if (match_p
->group_name
== NULL
)
692 as_warn (_("setting incorrect section attributes for %s"),
698 if (!override
&& old_sec
== NULL
)
702 /* Convert ELF type and flags to BFD flags. */
704 | ((attr
& SHF_WRITE
) ? 0 : SEC_READONLY
)
705 | ((attr
& SHF_ALLOC
) ? SEC_ALLOC
: 0)
706 | (((attr
& SHF_ALLOC
) && type
!= SHT_NOBITS
) ? SEC_LOAD
: 0)
707 | ((attr
& SHF_EXECINSTR
) ? SEC_CODE
: 0)
708 | ((attr
& SHF_MERGE
) ? SEC_MERGE
: 0)
709 | ((attr
& SHF_STRINGS
) ? SEC_STRINGS
: 0)
710 | ((attr
& SHF_EXCLUDE
) ? SEC_EXCLUDE
: 0)
711 | ((attr
& SHF_TLS
) ? SEC_THREAD_LOCAL
: 0));
712 #ifdef md_elf_section_flags
713 flags
= md_elf_section_flags (flags
, attr
, type
);
717 flags
|= SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_DISCARD
;
719 /* PR 28054: Set the SEC_ELF_OCTETS flag for debugging sections.
720 Based on the code in bfd/elf.c:_bfd_elf_make_section_from_shdr().
722 FIXME: We do not set the SEC_DEBUGGING flag because that causes
723 problems for the FT32 and MSP430 targets. Investigate and fix. */
724 if ((flags
& SEC_ALLOC
) == 0 && name
[0] == '.')
726 if ( startswith (name
, ".debug")
727 || startswith (name
, ".zdebug")
728 || startswith (name
, ".gnu.debuglto_.debug_")
729 || startswith (name
, ".gnu.linkonce.wi.")
730 || startswith (name
, GNU_BUILD_ATTRS_SECTION_NAME
)
731 || startswith (name
, ".note.gnu"))
732 flags
|= SEC_ELF_OCTETS
;
739 if (type
== SHT_NULL
)
740 type
= bfd_elf_get_default_section_type (flags
);
741 elf_section_type (sec
) = type
;
742 elf_section_flags (sec
) = attr
;
743 elf_section_data (sec
)->this_hdr
.sh_info
= match_p
->sh_info
;
745 /* Prevent SEC_HAS_CONTENTS from being inadvertently set. */
746 if (type
== SHT_NOBITS
)
747 seg_info (sec
)->bss
= 1;
749 /* Set the section ID and flags. */
750 sec
->section_id
= match_p
->section_id
;
751 flags
|= match_p
->flags
;
753 /* Set the linked-to symbol name. */
754 sec
->map_head
.linked_to_symbol_name
755 = match_p
->linked_to_symbol_name
;
757 bfd_set_section_flags (sec
, flags
);
758 if (flags
& SEC_MERGE
)
759 sec
->entsize
= entsize
;
760 elf_group_name (sec
) = match_p
->group_name
;
762 /* Add a symbol for this section to the symbol table. */
763 secsym
= symbol_find (name
);
766 /* We could be repurposing an undefined symbol here: make sure we
767 reset sy_value to look like other section symbols in order to avoid
768 trying to incorrectly resolve this section symbol later on. */
769 static const expressionS exp
= { .X_op
= O_constant
};
770 symbol_set_value_expression (secsym
, &exp
);
771 symbol_set_bfdsym (secsym
, sec
->symbol
);
774 symbol_table_insert (section_symbol (sec
));
779 && (unsigned) type
!= elf_section_type (old_sec
))
782 /* This is a special section with known type. User
783 assembly might get the section type wrong; Even high
784 profile projects like glibc have done so in the past.
785 So don't error in this case. */
786 as_warn (_("ignoring changed section type for %s"), name
);
788 /* Do error when assembly isn't self-consistent. */
789 as_bad (_("changed section type for %s"), name
);
794 /* If section attributes are specified the second time we see a
795 particular section, then check that they are the same as we
796 saw the first time. */
797 if (((old_sec
->flags
^ flags
)
798 & (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
| SEC_CODE
799 | SEC_EXCLUDE
| SEC_SORT_ENTRIES
| SEC_MERGE
| SEC_STRINGS
800 | SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_DISCARD
801 | SEC_THREAD_LOCAL
)))
804 as_warn (_("ignoring changed section attributes for %s"), name
);
806 as_bad (_("changed section attributes for %s"), name
);
809 /* FIXME: Maybe we should consider removing a previously set
810 processor or application specific attribute as suspicious? */
811 elf_section_flags (sec
) = attr
;
813 if ((flags
& SEC_MERGE
) && old_sec
->entsize
!= (unsigned) entsize
)
814 as_bad (_("changed section entity size for %s"), name
);
818 #ifdef md_elf_section_change_hook
819 md_elf_section_change_hook ();
824 obj_elf_parse_section_letters (char *str
, size_t len
,
825 bool *is_clone
, int *inherit
, bfd_vma
*gnu_attr
)
839 if (len
> 1 && str
[1] == 'm')
843 if (len
> 1 && str
[1] == 's')
854 attr
|= SHF_LINK_ORDER
;
860 attr
|= SHF_EXECINSTR
;
875 *gnu_attr
|= SHF_GNU_MBIND
;
878 *gnu_attr
|= SHF_GNU_RETAIN
;
885 const char *bad_msg
= _("unrecognized .section attribute:"
886 " want a,e,o,w,x,M,S,G,T or number");
887 #ifdef md_elf_section_letter
888 bfd_vma md_attr
= md_elf_section_letter (*str
, &bad_msg
);
889 if (md_attr
!= (bfd_vma
) -1)
896 struct elf_backend_data
*bed
;
897 bfd_vma numeric_flags
= strtoul (str
, &end
, 0);
899 attr
|= numeric_flags
;
901 bed
= (struct elf_backend_data
*)
902 get_elf_backend_data (stdoutput
);
904 if (bed
->elf_osabi
== ELFOSABI_NONE
905 || bed
->elf_osabi
== ELFOSABI_STANDALONE
906 || bed
->elf_osabi
== ELFOSABI_GNU
907 || bed
->elf_osabi
== ELFOSABI_FREEBSD
)
909 /* Add flags in the SHF_MASKOS range to gnu_attr for
910 OSABIs that support those flags.
911 Also adding the flags for ELFOSABI_{NONE,STANDALONE}
912 allows them to be validated later in obj_elf_section.
913 We can't just always set these bits in gnu_attr for
914 all OSABIs, since Binutils does not recognize all
915 SHF_MASKOS bits for non-GNU OSABIs. It's therefore
916 possible that numeric flags are being used to set bits
917 in the SHF_MASKOS range for those targets, and we
918 don't want assembly to fail in those situations. */
919 *gnu_attr
|= (numeric_flags
& SHF_MASKOS
);
922 /* Update str and len, allowing for the fact that
923 we will execute str++ and len-- below. */
928 else if (!attr
&& !*gnu_attr
&& (*str
== '+' || *str
== '-'))
929 *inherit
= *str
== '+' ? 1 : -1;
931 as_fatal ("%s", bad_msg
);
942 obj_elf_section_type (char *str
, size_t len
, bool warn
)
944 if (len
== 8 && startswith (str
, "progbits"))
946 if (len
== 6 && startswith (str
, "nobits"))
948 if (len
== 4 && startswith (str
, "note"))
950 if (len
== 10 && startswith (str
, "init_array"))
951 return SHT_INIT_ARRAY
;
952 if (len
== 10 && startswith (str
, "fini_array"))
953 return SHT_FINI_ARRAY
;
954 if (len
== 13 && startswith (str
, "preinit_array"))
955 return SHT_PREINIT_ARRAY
;
957 #ifdef md_elf_section_type
959 int md_type
= md_elf_section_type (str
, len
);
968 int type
= strtoul (str
, & end
, 0);
970 if (warn
&& (size_t) (end
- str
) != len
)
971 as_warn (_("extraneous characters at end of numeric section type"));
977 as_warn (_("unrecognized section type"));
983 obj_elf_section_word (char *str
, size_t len
, int *type
)
987 if (len
== 5 && startswith (str
, "write"))
989 if (len
== 5 && startswith (str
, "alloc"))
991 if (len
== 9 && startswith (str
, "execinstr"))
992 return SHF_EXECINSTR
;
993 if (len
== 7 && startswith (str
, "exclude"))
995 if (len
== 3 && startswith (str
, "tls"))
998 ret
= obj_elf_section_type (str
, len
, false);
1002 as_warn (_("unrecognized section attribute"));
1008 /* Get name of section. */
1010 obj_elf_section_name (void)
1015 if (*input_line_pointer
== '"')
1019 name
= demand_copy_C_string (&dummy
);
1022 ignore_rest_of_line ();
1028 char *end
= input_line_pointer
;
1030 while (0 == strchr ("\n\t,; ", *end
))
1032 if (end
== input_line_pointer
)
1034 as_bad (_("missing name"));
1035 ignore_rest_of_line ();
1039 obstack_grow0 (¬es
, input_line_pointer
, end
- input_line_pointer
);
1040 name
= obstack_base (¬es
);
1042 while (flag_sectname_subst
)
1044 char *subst
= strchr (name
, '%');
1045 if (subst
&& subst
[1] == 'S')
1047 size_t head
= subst
- name
;
1048 size_t tail
= strlen (subst
+ 2) + 1;
1049 size_t slen
= strlen (now_seg
->name
);
1053 obstack_blank (¬es
, slen
- 2);
1054 name
= obstack_base (¬es
);
1056 memmove (name
+ head
+ slen
, name
+ head
+ 2, tail
);
1057 memcpy (name
+ head
, now_seg
->name
, slen
);
1063 obstack_finish (¬es
);
1065 #ifdef tc_canonicalize_section_name
1066 name
= tc_canonicalize_section_name (name
);
1068 input_line_pointer
= end
;
1075 obj_elf_attach_to_group (int dummy ATTRIBUTE_UNUSED
)
1077 const char * gname
= obj_elf_section_name ();
1081 as_warn (_("group name not parseable"));
1085 if (elf_group_name (now_seg
))
1087 if (strcmp (elf_group_name (now_seg
), gname
) != 0)
1088 as_warn (_("section %s already has a group (%s)"),
1089 bfd_section_name (now_seg
), elf_group_name (now_seg
));
1093 elf_group_name (now_seg
) = gname
;
1094 elf_section_flags (now_seg
) |= SHF_GROUP
;
1098 obj_elf_section (int push
)
1107 subsegT new_subsection
= -1;
1108 struct elf_section_match match
;
1109 unsigned long linked_to_section_index
= -1UL;
1115 #ifdef md_flush_pending_output
1116 md_flush_pending_output ();
1119 obj_elf_section_change_hook ();
1121 s_mri_sect (&mri_type
);
1123 #ifdef md_elf_section_change_hook
1124 md_elf_section_change_hook ();
1130 name
= obj_elf_section_name ();
1134 memset (&match
, 0, sizeof (match
));
1137 if ((sym
= symbol_find (name
)) != NULL
1138 && ! symbol_section_p (sym
)
1139 && S_IS_DEFINED (sym
)
1140 && ! S_IS_VOLATILE (sym
)
1141 && ! S_CAN_BE_REDEFINED (sym
))
1143 as_bad (_("section name '%s' already defined as another symbol"), name
);
1144 ignore_rest_of_line ();
1153 if (*input_line_pointer
== ',')
1155 /* Skip the comma. */
1156 ++input_line_pointer
;
1159 if (push
&& ISDIGIT (*input_line_pointer
))
1161 /* .pushsection has an optional subsection. */
1162 new_subsection
= (subsegT
) get_absolute_expression ();
1166 /* Stop if we don't see a comma. */
1167 if (*input_line_pointer
!= ',')
1170 /* Skip the comma. */
1171 ++input_line_pointer
;
1175 if (*input_line_pointer
== '"')
1180 beg
= demand_copy_C_string (&dummy
);
1183 ignore_rest_of_line ();
1186 attr
= obj_elf_parse_section_letters (beg
, strlen (beg
), &is_clone
,
1187 &inherit
, &gnu_attr
);
1190 attr
|= elf_section_flags (now_seg
);
1191 else if (inherit
< 0)
1192 attr
= elf_section_flags (now_seg
) & ~attr
;
1194 type
= elf_section_type (now_seg
);
1197 if (*input_line_pointer
== ',')
1200 char *save
= input_line_pointer
;
1202 ++input_line_pointer
;
1204 c
= *input_line_pointer
;
1207 beg
= demand_copy_C_string (&dummy
);
1210 ignore_rest_of_line ();
1213 type
= obj_elf_section_type (beg
, strlen (beg
), true);
1215 else if (c
== '@' || c
== '%')
1217 ++input_line_pointer
;
1219 if (ISDIGIT (* input_line_pointer
))
1220 type
= strtoul (input_line_pointer
, &input_line_pointer
, 0);
1223 c
= get_symbol_name (& beg
);
1224 (void) restore_line_pointer (c
);
1225 type
= obj_elf_section_type (beg
,
1226 input_line_pointer
- beg
,
1231 input_line_pointer
= save
;
1235 if ((attr
& SHF_MERGE
) != 0 && *input_line_pointer
== ',')
1237 ++input_line_pointer
;
1239 if (inherit
&& *input_line_pointer
== ','
1240 && (bfd_section_flags (now_seg
) & SEC_MERGE
) != 0)
1242 entsize
= get_absolute_expression ();
1246 as_warn (_("invalid merge entity size"));
1251 else if ((attr
& SHF_MERGE
) != 0 && inherit
1252 && (bfd_section_flags (now_seg
) & SEC_MERGE
) != 0)
1255 entsize
= now_seg
->entsize
;
1257 else if ((attr
& SHF_MERGE
) != 0)
1259 as_warn (_("entity size for SHF_MERGE not specified"));
1263 if ((attr
& SHF_LINK_ORDER
) != 0 && *input_line_pointer
== ',')
1265 ++input_line_pointer
;
1267 /* Check for a numeric section index, rather than a symbol name. */
1268 if (ISDIGIT (* input_line_pointer
))
1270 linked_to_section_index
= strtoul (input_line_pointer
, & input_line_pointer
, 0);
1272 else if (inherit
&& *input_line_pointer
== ','
1273 && (elf_section_flags (now_seg
) & SHF_LINK_ORDER
) != 0)
1274 goto fetch_linked_to
;
1278 unsigned int length
;
1280 c
= get_symbol_name (& beg
);
1281 (void) restore_line_pointer (c
);
1282 length
= input_line_pointer
- beg
;
1284 match
.linked_to_symbol_name
= xmemdup0 (beg
, length
);
1287 else if ((attr
& SHF_LINK_ORDER
) != 0 && inherit
1288 && (elf_section_flags (now_seg
) & SHF_LINK_ORDER
) != 0)
1291 if (now_seg
->map_head
.linked_to_symbol_name
)
1292 match
.linked_to_symbol_name
=
1293 now_seg
->map_head
.linked_to_symbol_name
;
1295 linked_to_section_index
=
1296 elf_section_data (now_seg
)->this_hdr
.sh_link
;
1299 if ((attr
& SHF_GROUP
) != 0 && is_clone
)
1301 as_warn (_("? section flag ignored with G present"));
1305 if ((attr
& SHF_GROUP
) != 0 && *input_line_pointer
== ',')
1307 ++input_line_pointer
;
1309 if (inherit
&& *input_line_pointer
== ','
1310 && (elf_section_flags (now_seg
) & SHF_GROUP
) != 0)
1312 match
.group_name
= obj_elf_section_name ();
1313 if (match
.group_name
== NULL
)
1315 else if (*input_line_pointer
== ',')
1317 ++input_line_pointer
;
1319 if (startswith (input_line_pointer
, "comdat"))
1321 input_line_pointer
+= 6;
1325 else if (startswith (name
, ".gnu.linkonce"))
1328 else if ((attr
& SHF_GROUP
) != 0 && inherit
1329 && (elf_section_flags (now_seg
) & SHF_GROUP
) != 0)
1332 match
.group_name
= elf_group_name (now_seg
);
1334 (bfd_section_flags (now_seg
) & SEC_LINK_ONCE
) != 0;
1336 else if ((attr
& SHF_GROUP
) != 0)
1338 as_warn (_("group name for SHF_GROUP not specified"));
1344 const char *now_group
= elf_group_name (now_seg
);
1345 if (now_group
!= NULL
)
1347 match
.group_name
= now_group
;
1348 linkonce
= (now_seg
->flags
& SEC_LINK_ONCE
) != 0;
1352 if ((gnu_attr
& SHF_GNU_MBIND
) != 0 && *input_line_pointer
== ',')
1354 char *save
= input_line_pointer
;
1355 ++input_line_pointer
;
1357 if (ISDIGIT (* input_line_pointer
))
1359 char *t
= input_line_pointer
;
1360 match
.sh_info
= strtoul (input_line_pointer
,
1361 &input_line_pointer
, 0);
1362 if (match
.sh_info
== (unsigned int) -1)
1364 as_warn (_("unsupported mbind section info: %s"), t
);
1369 input_line_pointer
= save
;
1372 if ((gnu_attr
& SHF_GNU_RETAIN
) != 0)
1373 match
.sh_flags
|= SHF_GNU_RETAIN
;
1375 if (*input_line_pointer
== ',')
1377 char *save
= input_line_pointer
;
1379 ++input_line_pointer
;
1381 if (startswith (input_line_pointer
, "unique"))
1383 input_line_pointer
+= 6;
1385 if (*input_line_pointer
== ',')
1387 ++input_line_pointer
;
1389 if (ISDIGIT (* input_line_pointer
))
1393 char *t
= input_line_pointer
;
1394 if (sizeof (bfd_vma
) <= sizeof (unsigned long))
1397 id
= strtoul (input_line_pointer
,
1398 &input_line_pointer
, 0);
1399 overflow
= (id
== (unsigned long) -1
1400 && errno
== ERANGE
);
1405 (input_line_pointer
,
1406 (const char **) &input_line_pointer
, 0);
1407 overflow
= id
== ~(bfd_vma
) 0;
1409 if (overflow
|| id
> (unsigned int) -1)
1411 char *linefeed
, saved_char
= 0;
1412 if ((linefeed
= strchr (t
, '\n')) != NULL
)
1414 saved_char
= *linefeed
;
1417 as_bad (_("unsupported section id: %s"), t
);
1419 *linefeed
= saved_char
;
1423 match
.section_id
= id
;
1424 match
.flags
|= SEC_ASSEMBLER_SECTION_ID
;
1430 input_line_pointer
= save
;
1441 if (*input_line_pointer
!= '#')
1443 as_bad (_("character following name is not '#'"));
1444 ignore_rest_of_line ();
1447 ++input_line_pointer
;
1448 c
= get_symbol_name (& beg
);
1449 (void) restore_line_pointer (c
);
1451 attr
|= obj_elf_section_word (beg
, input_line_pointer
- beg
,
1456 while (*input_line_pointer
++ == ',');
1457 --input_line_pointer
;
1463 demand_empty_rest_of_line ();
1465 if ((gnu_attr
& (SHF_GNU_MBIND
| SHF_GNU_RETAIN
)) != 0)
1467 const struct elf_backend_data
*bed
;
1468 bool mbind_p
= (gnu_attr
& SHF_GNU_MBIND
) != 0;
1470 if (mbind_p
&& (attr
& SHF_ALLOC
) == 0)
1471 as_bad (_("SHF_ALLOC isn't set for GNU_MBIND section: %s"), name
);
1473 bed
= get_elf_backend_data (stdoutput
);
1475 if (bed
->elf_osabi
!= ELFOSABI_GNU
1476 && bed
->elf_osabi
!= ELFOSABI_FREEBSD
1477 && bed
->elf_osabi
!= ELFOSABI_NONE
)
1478 as_bad (_("%s section is supported only by GNU and FreeBSD targets"),
1479 mbind_p
? "GNU_MBIND" : "GNU_RETAIN");
1483 elf_tdata (stdoutput
)->has_gnu_osabi
|= elf_gnu_osabi_mbind
;
1484 if ((gnu_attr
& SHF_GNU_RETAIN
) != 0)
1485 elf_tdata (stdoutput
)->has_gnu_osabi
|= elf_gnu_osabi_retain
;
1491 obj_elf_change_section (name
, type
, attr
, entsize
, &match
, linkonce
,
1494 if (linked_to_section_index
!= -1UL)
1496 elf_section_flags (now_seg
) |= SHF_LINK_ORDER
;
1497 elf_section_data (now_seg
)->this_hdr
.sh_link
= linked_to_section_index
;
1498 /* FIXME: Should we perform some sanity checking on the section index ? */
1501 if (push
&& new_subsection
!= -1)
1502 subseg_set (now_seg
, new_subsection
);
1505 /* Change to the .bss section. */
1508 obj_elf_bss (int i ATTRIBUTE_UNUSED
)
1512 #ifdef md_flush_pending_output
1513 md_flush_pending_output ();
1516 obj_elf_section_change_hook ();
1518 temp
= get_absolute_expression ();
1519 subseg_set (bss_section
, (subsegT
) temp
);
1520 demand_empty_rest_of_line ();
1522 #ifdef md_elf_section_change_hook
1523 md_elf_section_change_hook ();
1527 /* Change to the .data section. */
1530 obj_elf_data (int i
)
1532 #ifdef md_flush_pending_output
1533 md_flush_pending_output ();
1536 obj_elf_section_change_hook ();
1540 #ifdef md_elf_section_change_hook
1541 md_elf_section_change_hook ();
1545 /* Change to the .text section. */
1548 obj_elf_text (int i
)
1550 #ifdef md_flush_pending_output
1551 md_flush_pending_output ();
1554 obj_elf_section_change_hook ();
1558 #ifdef md_elf_section_change_hook
1559 md_elf_section_change_hook ();
1563 /* Change to the *ABS* section. */
1566 obj_elf_struct (int i
)
1568 #ifdef md_flush_pending_output
1569 md_flush_pending_output ();
1572 obj_elf_section_change_hook ();
1576 #ifdef md_elf_section_change_hook
1577 md_elf_section_change_hook ();
1582 obj_elf_subsection (int ignore ATTRIBUTE_UNUSED
)
1586 #ifdef md_flush_pending_output
1587 md_flush_pending_output ();
1590 obj_elf_section_change_hook ();
1592 temp
= get_absolute_expression ();
1593 subseg_set (now_seg
, (subsegT
) temp
);
1594 demand_empty_rest_of_line ();
1596 #ifdef md_elf_section_change_hook
1597 md_elf_section_change_hook ();
1601 /* This can be called from the processor backends if they change
1605 obj_elf_section_change_hook (void)
1607 previous_section
= now_seg
;
1608 previous_subsection
= now_subseg
;
1612 obj_elf_previous (int ignore ATTRIBUTE_UNUSED
)
1617 if (previous_section
== 0)
1619 as_warn (_(".previous without corresponding .section; ignored"));
1623 #ifdef md_flush_pending_output
1624 md_flush_pending_output ();
1627 new_section
= previous_section
;
1628 new_subsection
= previous_subsection
;
1629 obj_elf_section_change_hook ();
1631 subseg_set (new_section
, new_subsection
);
1633 #ifdef md_elf_section_change_hook
1634 md_elf_section_change_hook ();
1639 obj_elf_popsection (int xxx ATTRIBUTE_UNUSED
)
1641 struct section_stack
*top
= section_stack
;
1645 as_warn (_(".popsection without corresponding .pushsection; ignored"));
1649 #ifdef md_flush_pending_output
1650 md_flush_pending_output ();
1653 section_stack
= top
->next
;
1654 previous_section
= top
->prev_seg
;
1655 previous_subsection
= top
->prev_subseg
;
1656 subseg_set (top
->seg
, top
->subseg
);
1659 #ifdef md_elf_section_change_hook
1660 md_elf_section_change_hook ();
1665 obj_elf_line (int ignore ATTRIBUTE_UNUSED
)
1667 /* Assume delimiter is part of expression. BSD4.2 as fails with
1668 delightful bug, so we are not being incompatible here. */
1669 new_logical_line (NULL
, get_absolute_expression ());
1670 demand_empty_rest_of_line ();
1673 static struct elf_versioned_name_list
*
1674 obj_elf_find_and_add_versioned_name (const char *version_name
,
1675 const char *sym_name
,
1677 struct elf_obj_sy
*sy_obj
)
1679 struct elf_versioned_name_list
*versioned_name
;
1682 for (p
= ver
+ 1; *p
== ELF_VER_CHR
; p
++)
1685 /* NB: Since some tests in ld/testsuite/ld-elfvers have no version
1686 names, we have to disable this. */
1687 if (0 && *p
== '\0')
1689 as_bad (_("missing version name in `%s' for symbol `%s'"),
1690 version_name
, sym_name
);
1694 versioned_name
= sy_obj
->versioned_name
;
1704 if (strcmp (versioned_name
->name
, version_name
) == 0)
1705 return versioned_name
;
1708 as_bad (_("only one version name with `@@@' is allowed "
1709 "for symbol `%s'"), sym_name
);
1713 sy_obj
->rename
= true;
1716 as_bad (_("invalid version name '%s' for symbol `%s'"),
1717 version_name
, sym_name
);
1722 versioned_name
!= NULL
;
1723 versioned_name
= versioned_name
->next
)
1724 if (strcmp (versioned_name
->name
, version_name
) == 0)
1725 return versioned_name
;
1727 /* Add this versioned name to the head of the list, */
1728 versioned_name
= (struct elf_versioned_name_list
*)
1729 xmalloc (sizeof (*versioned_name
));
1730 versioned_name
->name
= xstrdup (version_name
);
1731 versioned_name
->next
= sy_obj
->versioned_name
;
1732 sy_obj
->versioned_name
= versioned_name
;
1734 return versioned_name
;
1737 /* This handles the .symver pseudo-op, which is used to specify a
1738 symbol version. The syntax is ``.symver NAME,SYMVERNAME''.
1739 SYMVERNAME may contain ELF_VER_CHR ('@') characters. This
1740 pseudo-op causes the assembler to emit a symbol named SYMVERNAME
1741 with the same value as the symbol NAME. */
1744 obj_elf_symver (int ignore ATTRIBUTE_UNUSED
)
1747 const char *sym_name
;
1751 struct elf_obj_sy
*sy_obj
;
1754 sym
= get_sym_from_input_line_and_check ();
1756 if (*input_line_pointer
!= ',')
1758 as_bad (_("expected comma after name in .symver"));
1759 ignore_rest_of_line ();
1763 ++input_line_pointer
;
1766 /* Temporarily include '@' in symbol names. */
1767 old_lexat
= lex_type
[(unsigned char) '@'];
1768 lex_type
[(unsigned char) '@'] |= LEX_NAME
;
1769 c
= get_symbol_name (& name
);
1770 lex_type
[(unsigned char) '@'] = old_lexat
;
1771 sym_name
= S_GET_NAME (sym
);
1773 if (S_IS_COMMON (sym
))
1775 as_bad (_("`%s' can't be versioned to common symbol '%s'"),
1777 ignore_rest_of_line ();
1781 p
= strchr (name
, ELF_VER_CHR
);
1784 as_bad (_("missing version name in `%s' for symbol `%s'"),
1786 ignore_rest_of_line ();
1790 sy_obj
= symbol_get_obj (sym
);
1791 if (obj_elf_find_and_add_versioned_name (name
, sym_name
,
1794 sy_obj
->bad_version
= true;
1795 ignore_rest_of_line ();
1799 (void) restore_line_pointer (c
);
1801 if (*input_line_pointer
== ',')
1803 char *save
= input_line_pointer
;
1805 ++input_line_pointer
;
1807 if (startswith (input_line_pointer
, "local"))
1809 input_line_pointer
+= 5;
1810 sy_obj
->visibility
= visibility_local
;
1812 else if (startswith (input_line_pointer
, "hidden"))
1814 input_line_pointer
+= 6;
1815 sy_obj
->visibility
= visibility_hidden
;
1817 else if (startswith (input_line_pointer
, "remove"))
1819 input_line_pointer
+= 6;
1820 sy_obj
->visibility
= visibility_remove
;
1823 input_line_pointer
= save
;
1826 demand_empty_rest_of_line ();
1829 /* This handles the .vtable_inherit pseudo-op, which is used to indicate
1830 to the linker the hierarchy in which a particular table resides. The
1831 syntax is ".vtable_inherit CHILDNAME, PARENTNAME". */
1834 obj_elf_get_vtable_inherit (void)
1836 char *cname
, *pname
;
1837 symbolS
*csym
, *psym
;
1840 if (*input_line_pointer
== '#')
1841 ++input_line_pointer
;
1843 c
= get_symbol_name (& cname
);
1844 csym
= symbol_find (cname
);
1846 /* GCFIXME: should check that we don't have two .vtable_inherits for
1847 the same child symbol. Also, we can currently only do this if the
1848 child symbol is already exists and is placed in a fragment. */
1850 if (csym
== NULL
|| symbol_get_frag (csym
) == NULL
)
1852 as_bad (_("expected `%s' to have already been set for .vtable_inherit"),
1857 *input_line_pointer
= c
;
1859 SKIP_WHITESPACE_AFTER_NAME ();
1860 if (*input_line_pointer
!= ',')
1862 as_bad (_("expected comma after name in .vtable_inherit"));
1863 ignore_rest_of_line ();
1867 ++input_line_pointer
;
1870 if (*input_line_pointer
== '#')
1871 ++input_line_pointer
;
1873 if (input_line_pointer
[0] == '0'
1874 && (input_line_pointer
[1] == '\0'
1875 || ISSPACE (input_line_pointer
[1])))
1877 psym
= section_symbol (absolute_section
);
1878 ++input_line_pointer
;
1882 c
= get_symbol_name (& pname
);
1883 psym
= symbol_find_or_make (pname
);
1884 restore_line_pointer (c
);
1887 demand_empty_rest_of_line ();
1892 gas_assert (symbol_get_value_expression (csym
)->X_op
== O_constant
);
1893 return fix_new (symbol_get_frag (csym
),
1894 symbol_get_value_expression (csym
)->X_add_number
,
1895 0, psym
, 0, 0, BFD_RELOC_VTABLE_INHERIT
);
1898 /* This is a version of obj_elf_get_vtable_inherit() that is
1899 suitable for use in struct _pseudo_type tables. */
1902 obj_elf_vtable_inherit (int ignore ATTRIBUTE_UNUSED
)
1904 (void) obj_elf_get_vtable_inherit ();
1907 /* This handles the .vtable_entry pseudo-op, which is used to indicate
1908 to the linker that a vtable slot was used. The syntax is
1909 ".vtable_entry tablename, offset". */
1912 obj_elf_get_vtable_entry (void)
1917 if (*input_line_pointer
== '#')
1918 ++input_line_pointer
;
1920 sym
= get_sym_from_input_line_and_check ();
1921 if (*input_line_pointer
!= ',')
1923 as_bad (_("expected comma after name in .vtable_entry"));
1924 ignore_rest_of_line ();
1928 ++input_line_pointer
;
1929 if (*input_line_pointer
== '#')
1930 ++input_line_pointer
;
1932 offset
= get_absolute_expression ();
1934 demand_empty_rest_of_line ();
1936 return fix_new (frag_now
, frag_now_fix (), 0, sym
, offset
, 0,
1937 BFD_RELOC_VTABLE_ENTRY
);
1940 /* This is a version of obj_elf_get_vtable_entry() that is
1941 suitable for use in struct _pseudo_type tables. */
1944 obj_elf_vtable_entry (int ignore ATTRIBUTE_UNUSED
)
1946 (void) obj_elf_get_vtable_entry ();
1949 #define skip_whitespace(str) do { if (*(str) == ' ') ++(str); } while (0)
1952 skip_past_char (char ** str
, char c
)
1962 #define skip_past_comma(str) skip_past_char (str, ',')
1964 /* A list of attributes that have been explicitly set by the assembly code.
1965 VENDOR is the vendor id, BASE is the tag shifted right by the number
1966 of bits in MASK, and bit N of MASK is set if tag BASE+N has been set. */
1967 struct recorded_attribute_info
{
1968 struct recorded_attribute_info
*next
;
1973 static struct recorded_attribute_info
*recorded_attributes
;
1975 /* Record that we have seen an explicit specification of attribute TAG
1976 for vendor VENDOR. */
1979 record_attribute (int vendor
, unsigned int tag
)
1983 struct recorded_attribute_info
*rai
;
1985 base
= tag
/ (8 * sizeof (rai
->mask
));
1986 mask
= 1UL << (tag
% (8 * sizeof (rai
->mask
)));
1987 for (rai
= recorded_attributes
; rai
; rai
= rai
->next
)
1988 if (rai
->vendor
== vendor
&& rai
->base
== base
)
1994 rai
= XNEW (struct recorded_attribute_info
);
1995 rai
->next
= recorded_attributes
;
1996 rai
->vendor
= vendor
;
1999 recorded_attributes
= rai
;
2002 /* Return true if we have seen an explicit specification of attribute TAG
2003 for vendor VENDOR. */
2006 obj_elf_seen_attribute (int vendor
, unsigned int tag
)
2010 struct recorded_attribute_info
*rai
;
2012 base
= tag
/ (8 * sizeof (rai
->mask
));
2013 mask
= 1UL << (tag
% (8 * sizeof (rai
->mask
)));
2014 for (rai
= recorded_attributes
; rai
; rai
= rai
->next
)
2015 if (rai
->vendor
== vendor
&& rai
->base
== base
)
2016 return (rai
->mask
& mask
) != 0;
2020 /* Parse an attribute directive for VENDOR.
2021 Returns the attribute number read, or zero on error. */
2024 obj_elf_vendor_attribute (int vendor
)
2032 /* Read the first number or name. */
2033 skip_whitespace (input_line_pointer
);
2034 s
= input_line_pointer
;
2035 if (ISDIGIT (*input_line_pointer
))
2038 if (exp
.X_op
!= O_constant
)
2040 tag
= exp
.X_add_number
;
2046 /* A name may contain '_', but no other punctuation. */
2047 for (; ISALNUM (*input_line_pointer
) || *input_line_pointer
== '_';
2048 ++input_line_pointer
)
2053 name
= xmemdup0 (s
, i
);
2055 #ifndef CONVERT_SYMBOLIC_ATTRIBUTE
2056 #define CONVERT_SYMBOLIC_ATTRIBUTE(a) -1
2059 tag
= CONVERT_SYMBOLIC_ATTRIBUTE (name
);
2062 as_bad (_("Attribute name not recognised: %s"), name
);
2063 ignore_rest_of_line ();
2070 type
= _bfd_elf_obj_attrs_arg_type (stdoutput
, vendor
, tag
);
2072 if (skip_past_comma (&input_line_pointer
) == -1)
2077 if (exp
.X_op
!= O_constant
)
2079 as_bad (_("expected numeric constant"));
2080 ignore_rest_of_line ();
2083 i
= exp
.X_add_number
;
2086 && skip_past_comma (&input_line_pointer
) == -1)
2088 as_bad (_("expected comma"));
2089 ignore_rest_of_line ();
2096 skip_whitespace (input_line_pointer
);
2097 if (*input_line_pointer
!= '"')
2099 s
= demand_copy_C_string (&len
);
2102 record_attribute (vendor
, tag
);
2107 ok
= bfd_elf_add_obj_attr_int_string (stdoutput
, vendor
, tag
, i
, s
);
2110 ok
= bfd_elf_add_obj_attr_string (stdoutput
, vendor
, tag
, s
);
2113 ok
= bfd_elf_add_obj_attr_int (stdoutput
, vendor
, tag
, i
);
2119 as_fatal (_("error adding attribute: %s"),
2120 bfd_errmsg (bfd_get_error ()));
2122 demand_empty_rest_of_line ();
2125 as_bad (_("bad string constant"));
2126 ignore_rest_of_line ();
2129 as_bad (_("expected <tag> , <value>"));
2130 ignore_rest_of_line ();
2134 /* Parse a .gnu_attribute directive. */
2137 obj_elf_gnu_attribute (int ignored ATTRIBUTE_UNUSED
)
2139 obj_elf_vendor_attribute (OBJ_ATTR_GNU
);
2143 elf_obj_read_begin_hook (void)
2145 #ifdef NEED_ECOFF_DEBUG
2146 if (ECOFF_DEBUGGING
)
2147 ecoff_read_begin_hook ();
2152 elf_obj_symbol_new_hook (symbolS
*symbolP
)
2154 struct elf_obj_sy
*sy_obj
;
2156 sy_obj
= symbol_get_obj (symbolP
);
2157 sy_obj
->size
= NULL
;
2158 sy_obj
->versioned_name
= NULL
;
2160 #ifdef NEED_ECOFF_DEBUG
2161 if (ECOFF_DEBUGGING
)
2162 ecoff_symbol_new_hook (symbolP
);
2166 /* Deduplicate size expressions. We might get into trouble with
2167 multiple freeing or use after free if we leave them pointing to the
2168 same expressionS. */
2171 elf_obj_symbol_clone_hook (symbolS
*newsym
, symbolS
*orgsym ATTRIBUTE_UNUSED
)
2173 struct elf_obj_sy
*newelf
= symbol_get_obj (newsym
);
2176 expressionS
*exp
= XNEW (expressionS
);
2177 *exp
= *newelf
->size
;
2183 elf_copy_symbol_attributes (symbolS
*dest
, symbolS
*src
)
2185 struct elf_obj_sy
*srcelf
= symbol_get_obj (src
);
2186 struct elf_obj_sy
*destelf
= symbol_get_obj (dest
);
2187 /* If size is unset, copy size from src. Because we don't track whether
2188 .size has been used, we can't differentiate .size dest, 0 from the case
2189 where dest's size is unset. */
2190 if (!destelf
->size
&& S_GET_SIZE (dest
) == 0)
2194 destelf
->size
= XNEW (expressionS
);
2195 *destelf
->size
= *srcelf
->size
;
2197 S_SET_SIZE (dest
, S_GET_SIZE (src
));
2199 /* Don't copy visibility. */
2200 S_SET_OTHER (dest
, (ELF_ST_VISIBILITY (S_GET_OTHER (dest
))
2201 | (S_GET_OTHER (src
) & ~ELF_ST_VISIBILITY (-1))));
2205 obj_elf_version (int ignore ATTRIBUTE_UNUSED
)
2210 asection
*seg
= now_seg
;
2211 subsegT subseg
= now_subseg
;
2212 Elf_Internal_Note i_note
;
2213 Elf_External_Note e_note
;
2214 asection
*note_secp
= NULL
;
2217 if (*input_line_pointer
== '\"')
2221 ++input_line_pointer
; /* -> 1st char of string. */
2222 name
= input_line_pointer
;
2224 while (is_a_char (c
= next_char_of_string ()))
2226 c
= *input_line_pointer
;
2227 *input_line_pointer
= '\0';
2228 *(input_line_pointer
- 1) = '\0';
2229 *input_line_pointer
= c
;
2231 /* Create the .note section. */
2232 note_secp
= subseg_new (".note", 0);
2233 bfd_set_section_flags (note_secp
, SEC_HAS_CONTENTS
| SEC_READONLY
);
2234 record_alignment (note_secp
, 2);
2236 /* Process the version string. */
2237 len
= strlen (name
) + 1;
2239 /* PR 3456: Although the name field is padded out to an 4-byte
2240 boundary, the namesz field should not be adjusted. */
2241 i_note
.namesz
= len
;
2242 i_note
.descsz
= 0; /* No description. */
2243 i_note
.type
= NT_VERSION
;
2244 p
= frag_more (sizeof (e_note
.namesz
));
2245 md_number_to_chars (p
, i_note
.namesz
, sizeof (e_note
.namesz
));
2246 p
= frag_more (sizeof (e_note
.descsz
));
2247 md_number_to_chars (p
, i_note
.descsz
, sizeof (e_note
.descsz
));
2248 p
= frag_more (sizeof (e_note
.type
));
2249 md_number_to_chars (p
, i_note
.type
, sizeof (e_note
.type
));
2250 p
= frag_more (len
);
2251 memcpy (p
, name
, len
);
2253 frag_align (2, 0, 0);
2255 subseg_set (seg
, subseg
);
2258 as_bad (_("expected quoted string"));
2260 demand_empty_rest_of_line ();
2264 obj_elf_size (int ignore ATTRIBUTE_UNUSED
)
2267 char c
= get_symbol_name (&name
);
2272 p
= input_line_pointer
;
2274 SKIP_WHITESPACE_AFTER_NAME ();
2275 if (*input_line_pointer
!= ',')
2278 as_bad (_("expected comma after name `%s' in .size directive"), name
);
2280 ignore_rest_of_line ();
2283 input_line_pointer
++;
2285 if (exp
.X_op
== O_absent
)
2287 as_bad (_("missing expression in .size directive"));
2288 exp
.X_op
= O_constant
;
2289 exp
.X_add_number
= 0;
2292 sym
= symbol_find_or_make (name
);
2294 if (exp
.X_op
== O_constant
)
2296 S_SET_SIZE (sym
, exp
.X_add_number
);
2297 xfree (symbol_get_obj (sym
)->size
);
2298 symbol_get_obj (sym
)->size
= NULL
;
2302 symbol_get_obj (sym
)->size
= XNEW (expressionS
);
2303 *symbol_get_obj (sym
)->size
= exp
;
2305 demand_empty_rest_of_line ();
2308 /* Handle the ELF .type pseudo-op. This sets the type of a symbol.
2309 There are six syntaxes:
2311 The first (used on Solaris) is
2313 The second (used on UnixWare) is
2315 The third (reportedly to be used on Irix 6.0) is
2317 The fourth (used on NetBSD/Arm and Linux/ARM) is
2319 The fifth (used on SVR4/860) is
2320 .type SYM,"function"
2321 The sixth (emitted by recent SunPRO under Solaris) is
2323 where the integer is the STT_* value.
2327 obj_elf_type_name (char *cp
)
2331 p
= input_line_pointer
;
2332 if (*input_line_pointer
>= '0'
2333 && *input_line_pointer
<= '9')
2335 while (*input_line_pointer
>= '0'
2336 && *input_line_pointer
<= '9')
2337 ++input_line_pointer
;
2338 *cp
= *input_line_pointer
;
2339 *input_line_pointer
= '\0';
2342 *cp
= get_symbol_name (&p
);
2348 obj_elf_type (int ignore ATTRIBUTE_UNUSED
)
2352 const char *type_name
;
2354 elf_symbol_type
*elfsym
;
2356 sym
= get_sym_from_input_line_and_check ();
2357 c
= *input_line_pointer
;
2358 elfsym
= (elf_symbol_type
*) symbol_get_bfdsym (sym
);
2360 if (*input_line_pointer
== ',')
2361 ++input_line_pointer
;
2364 if ( *input_line_pointer
== '#'
2365 || *input_line_pointer
== '@'
2366 || *input_line_pointer
== '"'
2367 || *input_line_pointer
== '%')
2368 ++input_line_pointer
;
2370 type_name
= obj_elf_type_name (& c
);
2373 if (strcmp (type_name
, "function") == 0
2374 || strcmp (type_name
, "2") == 0
2375 || strcmp (type_name
, "STT_FUNC") == 0)
2376 type
= BSF_FUNCTION
;
2377 else if (strcmp (type_name
, "object") == 0
2378 || strcmp (type_name
, "1") == 0
2379 || strcmp (type_name
, "STT_OBJECT") == 0)
2381 else if (strcmp (type_name
, "tls_object") == 0
2382 || strcmp (type_name
, "6") == 0
2383 || strcmp (type_name
, "STT_TLS") == 0)
2384 type
= BSF_OBJECT
| BSF_THREAD_LOCAL
;
2385 else if (strcmp (type_name
, "notype") == 0
2386 || strcmp (type_name
, "0") == 0
2387 || strcmp (type_name
, "STT_NOTYPE") == 0)
2389 else if (strcmp (type_name
, "common") == 0
2390 || strcmp (type_name
, "5") == 0
2391 || strcmp (type_name
, "STT_COMMON") == 0)
2395 if (! S_IS_COMMON (sym
))
2397 if (S_IS_VOLATILE (sym
))
2399 sym
= symbol_clone (sym
, 1);
2400 S_SET_SEGMENT (sym
, bfd_com_section_ptr
);
2401 S_SET_VALUE (sym
, 0);
2402 S_SET_EXTERNAL (sym
);
2403 symbol_set_frag (sym
, &zero_address_frag
);
2404 S_CLEAR_VOLATILE (sym
);
2406 else if (S_IS_DEFINED (sym
) || symbol_equated_p (sym
))
2407 as_bad (_("symbol '%s' is already defined"), S_GET_NAME (sym
));
2410 /* FIXME: Is it safe to just change the section ? */
2411 S_SET_SEGMENT (sym
, bfd_com_section_ptr
);
2412 S_SET_VALUE (sym
, 0);
2413 S_SET_EXTERNAL (sym
);
2417 else if (strcmp (type_name
, "gnu_indirect_function") == 0
2418 || strcmp (type_name
, "10") == 0
2419 || strcmp (type_name
, "STT_GNU_IFUNC") == 0)
2421 const struct elf_backend_data
*bed
;
2423 bed
= get_elf_backend_data (stdoutput
);
2424 if (bed
->elf_osabi
!= ELFOSABI_NONE
2425 && bed
->elf_osabi
!= ELFOSABI_GNU
2426 && bed
->elf_osabi
!= ELFOSABI_FREEBSD
)
2427 as_bad (_("symbol type \"%s\" is supported only by GNU "
2428 "and FreeBSD targets"), type_name
);
2429 /* MIPS targets do not support IFUNCS. */
2430 else if (bed
->target_id
== MIPS_ELF_DATA
)
2431 as_bad (_("symbol type \"%s\" is not supported by "
2432 "MIPS targets"), type_name
);
2433 elf_tdata (stdoutput
)->has_gnu_osabi
|= elf_gnu_osabi_ifunc
;
2434 type
= BSF_FUNCTION
| BSF_GNU_INDIRECT_FUNCTION
;
2436 else if (strcmp (type_name
, "gnu_unique_object") == 0)
2438 const struct elf_backend_data
*bed
;
2440 bed
= get_elf_backend_data (stdoutput
);
2441 if (bed
->elf_osabi
!= ELFOSABI_NONE
2442 && bed
->elf_osabi
!= ELFOSABI_GNU
)
2443 as_bad (_("symbol type \"%s\" is supported only by GNU targets"),
2445 elf_tdata (stdoutput
)->has_gnu_osabi
|= elf_gnu_osabi_unique
;
2446 type
= BSF_OBJECT
| BSF_GNU_UNIQUE
;
2448 #ifdef md_elf_symbol_type
2449 else if ((type
= md_elf_symbol_type (type_name
, sym
, elfsym
)) != -1)
2453 as_bad (_("unrecognized symbol type \"%s\""), type_name
);
2455 *input_line_pointer
= c
;
2457 if (*input_line_pointer
== '"')
2458 ++input_line_pointer
;
2460 #ifdef md_elf_symbol_type_change
2461 if (!md_elf_symbol_type_change (sym
, elfsym
, type
))
2464 flagword mask
= BSF_FUNCTION
| BSF_OBJECT
;
2466 if (type
!= BSF_FUNCTION
)
2467 mask
|= BSF_GNU_INDIRECT_FUNCTION
;
2468 if (type
!= BSF_OBJECT
)
2470 mask
|= BSF_GNU_UNIQUE
| BSF_THREAD_LOCAL
;
2472 if (S_IS_COMMON (sym
))
2474 as_bad (_("cannot change type of common symbol '%s'"),
2480 /* Don't warn when changing to STT_NOTYPE. */
2483 flagword
new = (elfsym
->symbol
.flags
& ~mask
) | type
;
2485 if (new != (elfsym
->symbol
.flags
| type
))
2486 as_warn (_("symbol '%s' already has its type set"), S_GET_NAME (sym
));
2487 elfsym
->symbol
.flags
= new;
2490 elfsym
->symbol
.flags
&= ~mask
;
2493 demand_empty_rest_of_line ();
2496 static segT comment_section
;
2499 obj_elf_ident (int ignore ATTRIBUTE_UNUSED
)
2501 segT old_section
= now_seg
;
2502 int old_subsection
= now_subseg
;
2504 #ifdef md_flush_pending_output
2505 md_flush_pending_output ();
2508 if (!comment_section
)
2511 comment_section
= subseg_new (".comment", 0);
2512 bfd_set_section_flags (comment_section
, (SEC_READONLY
| SEC_HAS_CONTENTS
2513 | SEC_MERGE
| SEC_STRINGS
));
2514 comment_section
->entsize
= 1;
2515 #ifdef md_elf_section_change_hook
2516 md_elf_section_change_hook ();
2522 subseg_set (comment_section
, 0);
2524 subseg_set (old_section
, old_subsection
);
2527 #ifdef INIT_STAB_SECTION
2529 /* The first entry in a .stabs section is special. */
2532 obj_elf_init_stab_section (segT stab
, segT stabstr
)
2536 unsigned int stroff
;
2538 /* Force the section to align to a longword boundary. Without this,
2539 UnixWare ar crashes. */
2540 bfd_set_section_alignment (stab
, 2);
2542 /* Make space for this first symbol. */
2546 file
= remap_debug_filename (as_where (NULL
));
2547 stroff
= get_stab_string_offset (file
, stabstr
);
2548 know (stroff
== 1 || (stroff
== 0 && file
[0] == '\0'));
2549 md_number_to_chars (p
, stroff
, 4);
2550 seg_info (stab
)->stabu
.p
= p
;
2556 /* Fill in the counts in the first entry in a .stabs section. */
2559 adjust_stab_sections (bfd
*abfd
, asection
*sec
, void *xxx ATTRIBUTE_UNUSED
)
2566 if (!startswith (sec
->name
, ".stab"))
2568 if (!strcmp ("str", sec
->name
+ strlen (sec
->name
) - 3))
2571 name
= concat (sec
->name
, "str", NULL
);
2572 strsec
= bfd_get_section_by_name (abfd
, name
);
2574 strsz
= bfd_section_size (strsec
);
2577 nsyms
= bfd_section_size (sec
) / 12 - 1;
2579 p
= seg_info (sec
)->stabu
.p
;
2580 gas_assert (p
!= 0);
2582 bfd_h_put_16 (abfd
, nsyms
, p
+ 6);
2583 bfd_h_put_32 (abfd
, strsz
, p
+ 8);
2587 #ifdef NEED_ECOFF_DEBUG
2589 /* This function is called by the ECOFF code. It is supposed to
2590 record the external symbol information so that the backend can
2591 write it out correctly. The ELF backend doesn't actually handle
2592 this at the moment, so we do it ourselves. We save the information
2595 #ifdef OBJ_MAYBE_ELF
2599 elf_ecoff_set_ext (symbolS
*sym
, struct ecoff_extr
*ext
)
2601 symbol_get_bfdsym (sym
)->udata
.p
= ext
;
2604 /* This function is called by bfd_ecoff_debug_externals. It is
2605 supposed to *EXT to the external symbol information, and return
2606 whether the symbol should be used at all. */
2609 elf_get_extr (asymbol
*sym
, EXTR
*ext
)
2611 if (sym
->udata
.p
== NULL
)
2613 *ext
= *(EXTR
*) sym
->udata
.p
;
2617 /* This function is called by bfd_ecoff_debug_externals. It has
2618 nothing to do for ELF. */
2621 elf_set_index (asymbol
*sym ATTRIBUTE_UNUSED
,
2622 bfd_size_type indx ATTRIBUTE_UNUSED
)
2626 #endif /* NEED_ECOFF_DEBUG */
2629 elf_frob_symbol (symbolS
*symp
, int *puntp
)
2631 struct elf_obj_sy
*sy_obj
;
2633 struct elf_versioned_name_list
*versioned_name
;
2635 #ifdef NEED_ECOFF_DEBUG
2636 if (ECOFF_DEBUGGING
)
2637 ecoff_frob_symbol (symp
);
2640 sy_obj
= symbol_get_obj (symp
);
2642 size
= sy_obj
->size
;
2645 if (resolve_expression (size
)
2646 && size
->X_op
== O_constant
)
2647 S_SET_SIZE (symp
, size
->X_add_number
);
2650 if (!flag_allow_nonconst_size
)
2651 as_bad (_(".size expression for %s "
2652 "does not evaluate to a constant"), S_GET_NAME (symp
));
2654 as_warn (_(".size expression for %s "
2655 "does not evaluate to a constant"), S_GET_NAME (symp
));
2657 free (sy_obj
->size
);
2658 sy_obj
->size
= NULL
;
2661 versioned_name
= sy_obj
->versioned_name
;
2664 /* This symbol was given a new name with the .symver directive.
2665 If this is an external reference, just rename the symbol to
2666 include the version string. This will make the relocs be
2667 against the correct versioned symbol. */
2669 /* We will have already reported an version error. */
2670 if (sy_obj
->bad_version
)
2672 /* elf_frob_file_before_adjust only allows one version symbol for
2674 else if (sy_obj
->rename
)
2675 S_SET_NAME (symp
, versioned_name
->name
);
2676 else if (S_IS_COMMON (symp
))
2678 as_bad (_("`%s' can't be versioned to common symbol '%s'"),
2679 versioned_name
->name
, S_GET_NAME (symp
));
2685 elf_symbol_type
*elfsym
;
2687 /* This is a definition. Add an alias for each version.
2688 FIXME: Using an alias will permit the debugging information
2689 to refer to the right symbol. However, it's not clear
2690 whether it is the best approach. */
2692 /* FIXME: Creating a new symbol here is risky. We're
2693 in the final loop over the symbol table. We can
2694 get away with it only because the symbol goes to
2695 the end of the list, where the loop will still see
2696 it. It would probably be better to do this in
2697 obj_frob_file_before_adjust. */
2698 for (; versioned_name
!= NULL
;
2699 versioned_name
= versioned_name
->next
)
2701 symbolS
*symp2
= symbol_find_or_make (versioned_name
->name
);
2703 S_SET_SEGMENT (symp2
, S_GET_SEGMENT (symp
));
2705 /* Subtracting out the frag address here is a hack
2706 because we are in the middle of the final loop. */
2709 - (symbol_get_frag (symp
)->fr_address
2710 / OCTETS_PER_BYTE
)));
2712 symbol_set_frag (symp2
, symbol_get_frag (symp
));
2714 /* This will copy over the size information. */
2715 copy_symbol_attributes (symp2
, symp
);
2717 S_SET_OTHER (symp2
, S_GET_OTHER (symp
));
2719 if (S_IS_WEAK (symp
))
2722 if (S_IS_EXTERNAL (symp
))
2723 S_SET_EXTERNAL (symp2
);
2726 switch (sy_obj
->visibility
)
2728 case visibility_unchanged
:
2730 case visibility_hidden
:
2731 bfdsym
= symbol_get_bfdsym (symp
);
2732 elfsym
= elf_symbol_from (bfdsym
);
2733 elfsym
->internal_elf_sym
.st_other
&= ~3;
2734 elfsym
->internal_elf_sym
.st_other
|= STV_HIDDEN
;
2736 case visibility_remove
:
2737 /* Don't remove the symbol if it is used in relocation.
2738 Instead, mark it as to be removed and issue an error
2739 if the symbol has more than one versioned name. */
2740 if (symbol_used_in_reloc_p (symp
))
2742 if (sy_obj
->versioned_name
->next
!= NULL
)
2743 as_bad (_("symbol '%s' with multiple versions cannot be used in relocation"),
2745 symbol_mark_removed (symp
);
2748 symbol_remove (symp
, &symbol_rootP
, &symbol_lastP
);
2750 case visibility_local
:
2751 S_CLEAR_EXTERNAL (symp
);
2757 /* Double check weak symbols. */
2758 if (S_IS_WEAK (symp
))
2760 if (S_IS_COMMON (symp
))
2761 as_bad (_("symbol `%s' can not be both weak and common"),
2766 /* Fix up SYMPP which has been marked to be removed by .symver. */
2769 elf_fixup_removed_symbol (symbolS
**sympp
)
2771 symbolS
*symp
= *sympp
;
2772 struct elf_obj_sy
*sy_obj
= symbol_get_obj (symp
);
2774 /* Replace the removed symbol with the versioned symbol. */
2775 symp
= symbol_find (sy_obj
->versioned_name
->name
);
2781 asection
**head
; /* Section lists. */
2782 unsigned int num_group
; /* Number of lists. */
2783 htab_t indexes
; /* Maps group name to index in head array. */
2786 static struct group_list groups
;
2788 /* Called via bfd_map_over_sections. If SEC is a member of a group,
2789 add it to a list of sections belonging to the group. INF is a
2790 pointer to a struct group_list, which is where we store the head of
2791 each list. If its link_to_symbol_name isn't NULL, set up its
2792 linked-to section. */
2795 build_additional_section_info (bfd
*abfd ATTRIBUTE_UNUSED
,
2796 asection
*sec
, void *inf
)
2798 struct group_list
*list
= (struct group_list
*) inf
;
2799 const char *group_name
= elf_group_name (sec
);
2801 unsigned int *elem_idx
;
2802 unsigned int *idx_ptr
;
2804 if (sec
->map_head
.linked_to_symbol_name
)
2806 symbolS
*linked_to_sym
;
2807 linked_to_sym
= symbol_find (sec
->map_head
.linked_to_symbol_name
);
2808 if (!linked_to_sym
|| !S_IS_DEFINED (linked_to_sym
))
2809 as_bad (_("undefined linked-to symbol `%s' on section `%s'"),
2810 sec
->map_head
.linked_to_symbol_name
,
2811 bfd_section_name (sec
));
2813 elf_linked_to_section (sec
) = S_GET_SEGMENT (linked_to_sym
);
2816 if (group_name
== NULL
)
2819 /* If this group already has a list, add the section to the head of
2821 elem_idx
= (unsigned int *) str_hash_find (list
->indexes
, group_name
);
2822 if (elem_idx
!= NULL
)
2824 elf_next_in_group (sec
) = list
->head
[*elem_idx
];
2825 list
->head
[*elem_idx
] = sec
;
2829 /* New group. Make the arrays bigger in chunks to minimize calls to
2831 i
= list
->num_group
;
2834 unsigned int newsize
= i
+ 128;
2835 list
->head
= XRESIZEVEC (asection
*, list
->head
, newsize
);
2837 list
->head
[i
] = sec
;
2838 list
->num_group
+= 1;
2840 /* Add index to hash. */
2841 idx_ptr
= XNEW (unsigned int);
2843 str_hash_insert (list
->indexes
, group_name
, idx_ptr
, 0);
2847 free_section_idx (void *ent
)
2849 string_tuple_t
*tuple
= ent
;
2850 free ((char *) tuple
->value
);
2853 /* Create symbols for group signature. */
2856 elf_adjust_symtab (void)
2860 /* Go find section groups. */
2861 groups
.num_group
= 0;
2863 groups
.indexes
= htab_create_alloc (16, hash_string_tuple
, eq_string_tuple
,
2864 free_section_idx
, notes_calloc
, NULL
);
2865 bfd_map_over_sections (stdoutput
, build_additional_section_info
,
2868 /* Make the SHT_GROUP sections that describe each section group. We
2869 can't set up the section contents here yet, because elf section
2870 indices have yet to be calculated. elf.c:set_group_contents does
2871 the rest of the work. */
2872 for (i
= 0; i
< groups
.num_group
; i
++)
2874 const char *group_name
= elf_group_name (groups
.head
[i
]);
2875 const char *sec_name
;
2880 flags
= SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
| SEC_GROUP
;
2881 for (s
= groups
.head
[i
]; s
!= NULL
; s
= elf_next_in_group (s
))
2882 if ((s
->flags
^ flags
) & SEC_LINK_ONCE
)
2884 flags
|= SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_DISCARD
;
2885 if (s
!= groups
.head
[i
])
2887 as_warn (_("assuming all members of group `%s' are COMDAT"),
2893 sec_name
= ".group";
2894 s
= subseg_force_new (sec_name
, 0);
2896 || !bfd_set_section_flags (s
, flags
)
2897 || !bfd_set_section_alignment (s
, 2))
2899 as_fatal (_("can't create group: %s"),
2900 bfd_errmsg (bfd_get_error ()));
2902 elf_section_type (s
) = SHT_GROUP
;
2904 /* Pass a pointer to the first section in this group. */
2905 elf_next_in_group (s
) = groups
.head
[i
];
2906 elf_sec_group (groups
.head
[i
]) = s
;
2907 /* Make sure that the signature symbol for the group has the
2908 name of the group. */
2909 sy
= symbol_find_exact (group_name
);
2910 if (!sy
|| !symbol_on_chain (sy
, symbol_rootP
, symbol_lastP
))
2912 /* Create the symbol now. */
2913 sy
= symbol_new (group_name
, now_seg
, frag_now
, 0);
2915 /* Before Solaris 11 build 154, Sun ld rejects local group
2916 signature symbols, so make them weak hidden instead. */
2917 symbol_get_bfdsym (sy
)->flags
|= BSF_WEAK
;
2918 S_SET_OTHER (sy
, STV_HIDDEN
);
2920 symbol_get_obj (sy
)->local
= 1;
2922 symbol_table_insert (sy
);
2924 elf_group_id (s
) = symbol_get_bfdsym (sy
);
2925 /* Mark the group signature symbol as used so that it will be
2926 included in the symbol table. */
2927 symbol_mark_used_in_reloc (sy
);
2932 elf_frob_file (void)
2934 bfd_map_over_sections (stdoutput
, adjust_stab_sections
, NULL
);
2936 #ifdef elf_tc_final_processing
2937 elf_tc_final_processing ();
2941 /* It removes any unneeded versioned symbols from the symbol table. */
2944 elf_frob_file_before_adjust (void)
2950 for (symp
= symbol_rootP
; symp
; symp
= symbol_next (symp
))
2952 struct elf_obj_sy
*sy_obj
= symbol_get_obj (symp
);
2953 int is_defined
= !!S_IS_DEFINED (symp
);
2955 if (sy_obj
->versioned_name
)
2957 char *p
= strchr (sy_obj
->versioned_name
->name
,
2962 /* The @@@ syntax is a special case. If the symbol is
2963 not defined, 2 `@'s will be removed from the
2964 versioned_name. Otherwise, 1 `@' will be removed. */
2965 size_t l
= strlen (&p
[3]) + 1;
2966 memmove (&p
[1 + is_defined
], &p
[3], l
);
2971 /* Verify that the name isn't using the @@ syntax--this
2972 is reserved for definitions of the default version
2974 if (!sy_obj
->rename
&& p
[1] == ELF_VER_CHR
)
2976 as_bad (_("invalid attempt to declare external "
2977 "version name as default in symbol `%s'"),
2978 sy_obj
->versioned_name
->name
);
2982 /* Only one version symbol is allowed for undefined
2984 if (sy_obj
->versioned_name
->next
)
2986 as_bad (_("multiple versions [`%s'|`%s'] for "
2988 sy_obj
->versioned_name
->name
,
2989 sy_obj
->versioned_name
->next
->name
,
2994 sy_obj
->rename
= true;
2998 /* If there was .symver or .weak, but symbol was neither
2999 defined nor used anywhere, remove it. */
3001 && (sy_obj
->versioned_name
|| S_IS_WEAK (symp
))
3002 && symbol_used_p (symp
) == 0
3003 && symbol_used_in_reloc_p (symp
) == 0)
3004 symbol_remove (symp
, &symbol_rootP
, &symbol_lastP
);
3009 /* It is required that we let write_relocs have the opportunity to
3010 optimize away fixups before output has begun, since it is possible
3011 to eliminate all fixups for a section and thus we never should
3012 have generated the relocation section. */
3015 elf_frob_file_after_relocs (void)
3019 /* Set SHT_GROUP section size. */
3020 for (i
= 0; i
< groups
.num_group
; i
++)
3022 asection
*s
, *head
, *group
;
3025 head
= groups
.head
[i
];
3027 for (s
= head
; s
!= NULL
; s
= elf_next_in_group (s
))
3028 size
+= (s
->flags
& SEC_RELOC
) != 0 ? 8 : 4;
3030 group
= elf_sec_group (head
);
3031 subseg_set (group
, 0);
3032 bfd_set_section_size (group
, size
);
3033 group
->contents
= (unsigned char *) frag_more (size
);
3034 frag_now
->fr_fix
= frag_now_fix_octets ();
3035 frag_wane (frag_now
);
3038 #ifdef NEED_ECOFF_DEBUG
3039 if (ECOFF_DEBUGGING
)
3040 /* Generate the ECOFF debugging information. */
3042 const struct ecoff_debug_swap
*debug_swap
;
3043 struct ecoff_debug_info debug
;
3048 = get_elf_backend_data (stdoutput
)->elf_backend_ecoff_debug_swap
;
3049 know (debug_swap
!= NULL
);
3050 ecoff_build_debug (&debug
.symbolic_header
, &buf
, debug_swap
);
3052 /* Set up the pointers in debug. */
3053 debug
.alloc_syments
= true;
3054 #define SET(ptr, offset, type) \
3055 debug.ptr = (type) (buf + debug.symbolic_header.offset)
3057 SET (line
, cbLineOffset
, unsigned char *);
3058 SET (external_dnr
, cbDnOffset
, void *);
3059 SET (external_pdr
, cbPdOffset
, void *);
3060 SET (external_sym
, cbSymOffset
, void *);
3061 SET (external_opt
, cbOptOffset
, void *);
3062 SET (external_aux
, cbAuxOffset
, union aux_ext
*);
3063 SET (ss
, cbSsOffset
, char *);
3064 SET (external_fdr
, cbFdOffset
, void *);
3065 SET (external_rfd
, cbRfdOffset
, void *);
3066 /* ssext and external_ext are set up just below. */
3070 /* Set up the external symbols. */
3071 debug
.ssext
= debug
.ssext_end
= NULL
;
3072 debug
.external_ext
= debug
.external_ext_end
= NULL
;
3073 if (! bfd_ecoff_debug_externals (stdoutput
, &debug
, debug_swap
, true,
3074 elf_get_extr
, elf_set_index
))
3075 as_fatal (_("failed to set up debugging information: %s"),
3076 bfd_errmsg (bfd_get_error ()));
3078 sec
= bfd_get_section_by_name (stdoutput
, ".mdebug");
3079 gas_assert (sec
!= NULL
);
3081 know (!stdoutput
->output_has_begun
);
3083 /* We set the size of the section, call bfd_set_section_contents
3084 to force the ELF backend to allocate a file position, and then
3085 write out the data. FIXME: Is this really the best way to do
3087 bfd_set_section_size (sec
, bfd_ecoff_debug_size (stdoutput
, &debug
,
3090 /* Pass BUF to bfd_set_section_contents because this will
3091 eventually become a call to fwrite, and ISO C prohibits
3092 passing a NULL pointer to a stdio function even if the
3093 pointer will not be used. */
3094 if (! bfd_set_section_contents (stdoutput
, sec
, buf
, 0, 0))
3095 as_fatal (_("can't start writing .mdebug section: %s"),
3096 bfd_errmsg (bfd_get_error ()));
3098 know (stdoutput
->output_has_begun
);
3099 know (sec
->filepos
!= 0);
3101 if (! bfd_ecoff_write_debug (stdoutput
, &debug
, debug_swap
,
3103 as_fatal (_("could not write .mdebug section: %s"),
3104 bfd_errmsg (bfd_get_error ()));
3106 #endif /* NEED_ECOFF_DEBUG */
3110 elf_generate_asm_lineno (void)
3112 #ifdef NEED_ECOFF_DEBUG
3113 if (ECOFF_DEBUGGING
)
3114 ecoff_generate_asm_lineno ();
3119 elf_process_stab (int what ATTRIBUTE_UNUSED
,
3120 const char *string ATTRIBUTE_UNUSED
,
3121 int type ATTRIBUTE_UNUSED
,
3122 int other ATTRIBUTE_UNUSED
,
3123 int desc ATTRIBUTE_UNUSED
)
3125 #ifdef NEED_ECOFF_DEBUG
3126 if (ECOFF_DEBUGGING
)
3127 ecoff_stab (what
, string
, type
, other
, desc
);
3132 elf_separate_stab_sections (void)
3134 #ifdef NEED_ECOFF_DEBUG
3135 return (!ECOFF_DEBUGGING
);
3142 elf_init_stab_section (segT stab
, segT stabstr
)
3144 #ifdef NEED_ECOFF_DEBUG
3145 if (!ECOFF_DEBUGGING
)
3147 obj_elf_init_stab_section (stab
, stabstr
);
3150 /* This is called when the assembler starts. */
3157 /* Add symbols for the known sections to the symbol table. */
3158 s
= bfd_get_section_by_name (stdoutput
, TEXT_SECTION_NAME
);
3159 symbol_table_insert (section_symbol (s
));
3160 s
= bfd_get_section_by_name (stdoutput
, DATA_SECTION_NAME
);
3161 symbol_table_insert (section_symbol (s
));
3162 s
= bfd_get_section_by_name (stdoutput
, BSS_SECTION_NAME
);
3163 symbol_table_insert (section_symbol (s
));
3164 elf_com_section_ptr
= bfd_com_section_ptr
;
3165 previous_section
= NULL
;
3166 previous_subsection
= 0;
3167 comment_section
= NULL
;
3168 memset (&groups
, 0, sizeof (groups
));
3174 while (section_stack
)
3176 struct section_stack
*top
= section_stack
;
3177 section_stack
= top
->next
;
3180 while (recorded_attributes
)
3182 struct recorded_attribute_info
*rai
= recorded_attributes
;
3183 recorded_attributes
= rai
->next
;
3188 htab_delete (groups
.indexes
);
3193 const struct format_ops elf_format_ops
=
3195 bfd_target_elf_flavour
,
3196 0, /* dfl_leading_underscore */
3197 1, /* emit_section_symbols */
3203 elf_frob_file_before_adjust
,
3204 0, /* obj_frob_file_before_fix */
3205 elf_frob_file_after_relocs
,
3206 elf_s_get_size
, elf_s_set_size
,
3207 elf_s_get_align
, elf_s_set_align
,
3214 elf_copy_symbol_attributes
,
3215 elf_generate_asm_lineno
,
3217 elf_separate_stab_sections
,
3218 elf_init_stab_section
,
3219 elf_sec_sym_ok_for_reloc
,
3221 #ifdef NEED_ECOFF_DEBUG
3224 0, /* ecoff_set_ext */
3226 elf_obj_read_begin_hook
,
3227 elf_obj_symbol_new_hook
,
3228 elf_obj_symbol_clone_hook
,