1 /* ELF object file format
2 Copyright (C) 1992-2020 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);
82 static const pseudo_typeS elf_pseudo_table
[] =
84 {"comm", obj_elf_common
, 0},
85 {"common", obj_elf_common
, 1},
86 {"ident", obj_elf_ident
, 0},
87 {"lcomm", obj_elf_lcomm
, 0},
88 {"local", obj_elf_local
, 0},
89 {"previous", obj_elf_previous
, 0},
90 {"section", obj_elf_section
, 0},
91 {"section.s", obj_elf_section
, 0},
92 {"sect", obj_elf_section
, 0},
93 {"sect.s", obj_elf_section
, 0},
94 {"pushsection", obj_elf_section
, 1},
95 {"popsection", obj_elf_popsection
, 0},
96 {"size", obj_elf_size
, 0},
97 {"type", obj_elf_type
, 0},
98 {"version", obj_elf_version
, 0},
99 {"weak", obj_elf_weak
, 0},
101 /* These define symbol visibility. */
102 {"internal", obj_elf_visibility
, STV_INTERNAL
},
103 {"hidden", obj_elf_visibility
, STV_HIDDEN
},
104 {"protected", obj_elf_visibility
, STV_PROTECTED
},
106 /* These are used for stabs-in-elf configurations. */
107 {"line", obj_elf_line
, 0},
109 /* This is a GNU extension to handle symbol versions. */
110 {"symver", obj_elf_symver
, 0},
112 /* A GNU extension to change subsection only. */
113 {"subsection", obj_elf_subsection
, 0},
115 /* These are GNU extensions to aid in garbage collecting C++ vtables. */
116 {"vtable_inherit", obj_elf_vtable_inherit
, 0},
117 {"vtable_entry", obj_elf_vtable_entry
, 0},
119 /* A GNU extension for object attributes. */
120 {"gnu_attribute", obj_elf_gnu_attribute
, 0},
122 /* These are used for dwarf. */
126 /* These are used for dwarf2. */
127 { "file", dwarf2_directive_file
, 0 },
128 { "loc", dwarf2_directive_loc
, 0 },
129 { "loc_mark_labels", dwarf2_directive_loc_mark_labels
, 0 },
131 /* We need to trap the section changing calls to handle .previous. */
132 {"data", obj_elf_data
, 0},
133 {"offset", obj_elf_struct
, 0},
134 {"struct", obj_elf_struct
, 0},
135 {"text", obj_elf_text
, 0},
137 {"tls_common", obj_elf_tls_common
, 0},
143 static const pseudo_typeS ecoff_debug_pseudo_table
[] =
145 #ifdef NEED_ECOFF_DEBUG
146 /* COFF style debugging information for ECOFF. .ln is not used; .loc
148 { "def", ecoff_directive_def
, 0 },
149 { "dim", ecoff_directive_dim
, 0 },
150 { "endef", ecoff_directive_endef
, 0 },
151 { "file", ecoff_directive_file
, 0 },
152 { "scl", ecoff_directive_scl
, 0 },
153 { "tag", ecoff_directive_tag
, 0 },
154 { "val", ecoff_directive_val
, 0 },
156 /* COFF debugging requires pseudo-ops .size and .type, but ELF
157 already has meanings for those. We use .esize and .etype
158 instead. These are only generated by gcc anyhow. */
159 { "esize", ecoff_directive_size
, 0 },
160 { "etype", ecoff_directive_type
, 0 },
162 /* ECOFF specific debugging information. */
163 { "aent", ecoff_directive_ent
, 1 },
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. */
194 asection
*elf_com_section_ptr
;
201 /* Add symbols for the known sections to the symbol table. */
202 s
= bfd_get_section_by_name (stdoutput
, TEXT_SECTION_NAME
);
203 symbol_table_insert (section_symbol (s
));
204 s
= bfd_get_section_by_name (stdoutput
, DATA_SECTION_NAME
);
205 symbol_table_insert (section_symbol (s
));
206 s
= bfd_get_section_by_name (stdoutput
, BSS_SECTION_NAME
);
207 symbol_table_insert (section_symbol (s
));
208 elf_com_section_ptr
= bfd_com_section_ptr
;
212 elf_pop_insert (void)
214 pop_insert (elf_pseudo_table
);
216 pop_insert (ecoff_debug_pseudo_table
);
220 elf_s_get_size (symbolS
*sym
)
222 return S_GET_SIZE (sym
);
226 elf_s_set_size (symbolS
*sym
, bfd_vma sz
)
228 S_SET_SIZE (sym
, sz
);
232 elf_s_get_align (symbolS
*sym
)
234 return S_GET_ALIGN (sym
);
238 elf_s_set_align (symbolS
*sym
, bfd_vma align
)
240 S_SET_ALIGN (sym
, align
);
244 elf_s_get_other (symbolS
*sym
)
246 return elf_symbol (symbol_get_bfdsym (sym
))->internal_elf_sym
.st_other
;
250 elf_s_set_other (symbolS
*sym
, int other
)
252 S_SET_OTHER (sym
, other
);
256 elf_sec_sym_ok_for_reloc (asection
*sec
)
258 return obj_sec_sym_ok_for_reloc (sec
);
262 elf_file_symbol (const char *s
, int appfile
)
267 || symbol_rootP
== NULL
268 || (bsym
= symbol_get_bfdsym (symbol_rootP
)) == NULL
269 || (bsym
->flags
& BSF_FILE
) == 0)
274 sym
= symbol_new (s
, absolute_section
, &zero_address_frag
, 0);
276 name_length
= strlen (s
);
277 if (name_length
> strlen (S_GET_NAME (sym
)))
279 obstack_grow (¬es
, s
, name_length
+ 1);
280 S_SET_NAME (sym
, (const char *) obstack_finish (¬es
));
283 strcpy ((char *) S_GET_NAME (sym
), s
);
285 symbol_get_bfdsym (sym
)->flags
|= BSF_FILE
;
287 if (symbol_rootP
!= sym
288 && ((bsym
= symbol_get_bfdsym (symbol_rootP
)) == NULL
289 || (bsym
->flags
& BSF_FILE
) == 0))
291 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
292 symbol_insert (sym
, symbol_rootP
, &symbol_rootP
, &symbol_lastP
);
296 verify_symbol_chain (symbol_rootP
, symbol_lastP
);
300 #ifdef NEED_ECOFF_DEBUG
301 ecoff_new_file (s
, appfile
);
305 /* Called from read.c:s_comm after we've parsed .comm symbol, size.
306 Parse a possible alignment value. */
309 elf_common_parse (int ignore ATTRIBUTE_UNUSED
, symbolS
*symbolP
, addressT size
)
312 int is_local
= symbol_get_obj (symbolP
)->local
;
314 if (*input_line_pointer
== ',')
316 char *save
= input_line_pointer
;
318 input_line_pointer
++;
321 if (*input_line_pointer
== '"')
323 /* For sparc. Accept .common symbol, length, "bss" */
324 input_line_pointer
++;
325 /* Some use the dot, some don't. */
326 if (*input_line_pointer
== '.')
327 input_line_pointer
++;
328 /* Some say data, some say bss. */
329 if (strncmp (input_line_pointer
, "bss\"", 4) == 0)
330 input_line_pointer
+= 4;
331 else if (strncmp (input_line_pointer
, "data\"", 5) == 0)
332 input_line_pointer
+= 5;
335 char *p
= input_line_pointer
;
340 while (!is_end_of_line
[(unsigned char) *input_line_pointer
])
341 if (*input_line_pointer
++ == '"')
343 c
= *input_line_pointer
;
344 *input_line_pointer
= '\0';
345 as_bad (_("bad .common segment %s"), p
);
346 *input_line_pointer
= c
;
347 ignore_rest_of_line ();
350 /* ??? Don't ask me why these are always global. */
355 input_line_pointer
= save
;
356 align
= parse_align (is_local
);
357 if (align
== (addressT
) -1)
364 bss_alloc (symbolP
, size
, align
);
365 S_CLEAR_EXTERNAL (symbolP
);
369 S_SET_VALUE (symbolP
, size
);
370 S_SET_ALIGN (symbolP
, align
);
371 S_SET_EXTERNAL (symbolP
);
372 S_SET_SEGMENT (symbolP
, elf_com_section_ptr
);
375 symbol_get_bfdsym (symbolP
)->flags
|= BSF_OBJECT
;
381 obj_elf_common (int is_common
)
383 if (flag_mri
&& is_common
)
386 s_comm_internal (0, elf_common_parse
);
390 obj_elf_tls_common (int ignore ATTRIBUTE_UNUSED
)
392 symbolS
*symbolP
= s_comm_internal (0, elf_common_parse
);
395 symbol_get_bfdsym (symbolP
)->flags
|= BSF_THREAD_LOCAL
;
399 obj_elf_lcomm (int ignore ATTRIBUTE_UNUSED
)
401 symbolS
*symbolP
= s_comm_internal (0, s_lcomm_internal
);
404 symbol_get_bfdsym (symbolP
)->flags
|= BSF_OBJECT
;
408 get_sym_from_input_line_and_check (void)
414 c
= get_symbol_name (& name
);
415 sym
= symbol_find_or_make (name
);
416 *input_line_pointer
= c
;
417 SKIP_WHITESPACE_AFTER_NAME ();
419 /* There is no symbol name if input_line_pointer has not moved. */
420 if (name
== input_line_pointer
)
421 as_bad (_("Missing symbol name in directive"));
426 obj_elf_local (int ignore ATTRIBUTE_UNUSED
)
433 symbolP
= get_sym_from_input_line_and_check ();
434 c
= *input_line_pointer
;
435 S_CLEAR_EXTERNAL (symbolP
);
436 symbol_get_obj (symbolP
)->local
= 1;
439 input_line_pointer
++;
441 if (*input_line_pointer
== '\n')
446 demand_empty_rest_of_line ();
450 obj_elf_weak (int ignore ATTRIBUTE_UNUSED
)
457 symbolP
= get_sym_from_input_line_and_check ();
458 c
= *input_line_pointer
;
459 S_SET_WEAK (symbolP
);
462 input_line_pointer
++;
464 if (*input_line_pointer
== '\n')
469 demand_empty_rest_of_line ();
473 obj_elf_visibility (int visibility
)
478 elf_symbol_type
*elfsym
;
482 symbolP
= get_sym_from_input_line_and_check ();
484 bfdsym
= symbol_get_bfdsym (symbolP
);
485 elfsym
= elf_symbol_from (bfdsym
);
489 elfsym
->internal_elf_sym
.st_other
&= ~3;
490 elfsym
->internal_elf_sym
.st_other
|= visibility
;
492 c
= *input_line_pointer
;
495 input_line_pointer
++;
499 if (*input_line_pointer
== '\n')
505 demand_empty_rest_of_line ();
508 static segT previous_section
;
509 static int previous_subsection
;
513 struct section_stack
*next
;
515 int subseg
, prev_subseg
;
518 static struct section_stack
*section_stack
;
521 get_section (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
, void *inf
)
523 struct elf_section_match
*match
= (struct elf_section_match
*) inf
;
524 const char *gname
= match
->group_name
;
525 const char *group_name
= elf_group_name (sec
);
526 const char *linked_to_symbol_name
527 = sec
->map_head
.linked_to_symbol_name
;
528 unsigned int info
= elf_section_data (sec
)->this_hdr
.sh_info
;
530 return (info
== match
->info
531 && ((bfd_section_flags (sec
) & SEC_ASSEMBLER_SECTION_ID
)
532 == (match
->flags
& SEC_ASSEMBLER_SECTION_ID
))
533 && sec
->section_id
== match
->section_id
534 && (group_name
== gname
535 || (group_name
!= NULL
537 && strcmp (group_name
, gname
) == 0))
538 && (linked_to_symbol_name
== match
->linked_to_symbol_name
539 || (linked_to_symbol_name
!= NULL
540 && match
->linked_to_symbol_name
!= NULL
541 && strcmp (linked_to_symbol_name
,
542 match
->linked_to_symbol_name
) == 0)));
545 /* Handle the .section pseudo-op. This code supports two different
548 The first is found on Solaris, and looks like
549 .section ".sec1",#alloc,#execinstr,#write
550 Here the names after '#' are the SHF_* flags to turn on for the
551 section. I'm not sure how it determines the SHT_* type (BFD
552 doesn't really give us control over the type, anyhow).
554 The second format is found on UnixWare, and probably most SVR4
555 machines, and looks like
556 .section .sec1,"a",@progbits
557 The quoted string may contain any combination of a, w, x, and
558 represents the SHF_* flags to turn on for the section. The string
559 beginning with '@' can be progbits or nobits. There should be
560 other possibilities, but I don't know what they are. In any case,
561 BFD doesn't really let us set the section type. */
564 obj_elf_change_section (const char *name
,
568 struct elf_section_match
*match_p
,
575 const struct elf_backend_data
*bed
;
576 const struct bfd_elf_special_section
*ssect
;
580 static struct elf_section_match unused_match
;
581 match_p
= &unused_match
;
584 #ifdef md_flush_pending_output
585 md_flush_pending_output ();
588 /* Switch to the section, creating it if necessary. */
591 struct section_stack
*elt
;
592 elt
= XNEW (struct section_stack
);
593 elt
->next
= section_stack
;
595 elt
->prev_seg
= previous_section
;
596 elt
->subseg
= now_subseg
;
597 elt
->prev_subseg
= previous_subsection
;
600 previous_section
= now_seg
;
601 previous_subsection
= now_subseg
;
603 old_sec
= bfd_get_section_by_name_if (stdoutput
, name
, get_section
,
611 sec
= subseg_force_new (name
, 0);
613 bed
= get_elf_backend_data (stdoutput
);
614 ssect
= (*bed
->get_sec_type_attr
) (stdoutput
, sec
);
618 bfd_boolean override
= FALSE
;
620 if (type
== SHT_NULL
)
622 else if (type
!= ssect
->type
)
625 /* Some older versions of gcc will emit
627 .section .init_array,"aw",@progbits
629 for __attribute__ ((section (".init_array"))).
630 "@progbits" is incorrect. Also for x86-64 large bss
631 sections, some older versions of gcc will emit
633 .section .lbss,"aw",@progbits
635 "@progbits" is incorrect. */
637 && (bed
->s
->arch_size
!= 64
638 || !(ssect
->attr
& SHF_X86_64_LARGE
))
640 && ssect
->type
!= SHT_INIT_ARRAY
641 && ssect
->type
!= SHT_FINI_ARRAY
642 && ssect
->type
!= SHT_PREINIT_ARRAY
)
644 /* We allow to specify any type for a .note section. */
645 if (ssect
->type
!= SHT_NOTE
646 /* Processor and application defined types are allowed too. */
647 && type
< SHT_LOPROC
)
648 as_warn (_("setting incorrect section type for %s"),
653 as_warn (_("ignoring incorrect section type for %s"),
659 if (old_sec
== NULL
&& ((attr
& ~(SHF_MASKOS
| SHF_MASKPROC
))
660 & ~ssect
->attr
) != 0)
662 /* As a GNU extension, we permit a .note section to be
663 allocatable. If the linker sees an allocatable .note
664 section, it will create a PT_NOTE segment in the output
665 file. We also allow "x" for .note.GNU-stack. */
666 if (ssect
->type
== SHT_NOTE
667 && (attr
== SHF_ALLOC
|| attr
== SHF_EXECINSTR
))
669 /* Allow different SHF_MERGE and SHF_STRINGS if we have
670 something like .rodata.str. */
671 else if (ssect
->suffix_length
== -2
672 && name
[ssect
->prefix_length
] == '.'
676 & ~SHF_STRINGS
) == 0)
678 /* .interp, .strtab and .symtab can have SHF_ALLOC. */
679 else if (attr
== SHF_ALLOC
680 && (strcmp (name
, ".interp") == 0
681 || strcmp (name
, ".strtab") == 0
682 || strcmp (name
, ".symtab") == 0))
684 /* .note.GNU-stack can have SHF_EXECINSTR. */
685 else if (attr
== SHF_EXECINSTR
686 && strcmp (name
, ".note.GNU-stack") == 0)
689 /* A section on Alpha may have SHF_ALPHA_GPREL. */
690 else if ((attr
& ~ssect
->attr
) == SHF_ALPHA_GPREL
)
694 else if (attr
== (SHF_EXECINSTR
| SHF_WRITE
| SHF_ALLOC
)
695 && (ssect
->type
== SHT_INIT_ARRAY
696 || ssect
->type
== SHT_FINI_ARRAY
697 || ssect
->type
== SHT_PREINIT_ARRAY
))
698 /* RX init/fini arrays can and should have the "awx" attributes set. */
703 if (match_p
->group_name
== NULL
)
704 as_warn (_("setting incorrect section attributes for %s"),
710 if (!override
&& old_sec
== NULL
)
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_EXCLUDE
) ? SEC_EXCLUDE
: 0)
723 | ((attr
& SHF_TLS
) ? SEC_THREAD_LOCAL
: 0));
724 #ifdef md_elf_section_flags
725 flags
= md_elf_section_flags (flags
, attr
, type
);
729 flags
|= SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_DISCARD
;
735 if (type
== SHT_NULL
)
736 type
= bfd_elf_get_default_section_type (flags
);
737 elf_section_type (sec
) = type
;
738 elf_section_flags (sec
) = attr
;
739 elf_section_data (sec
)->this_hdr
.sh_info
= match_p
->info
;
741 /* Prevent SEC_HAS_CONTENTS from being inadvertently set. */
742 if (type
== SHT_NOBITS
)
743 seg_info (sec
)->bss
= 1;
745 /* Set the section ID and flags. */
746 sec
->section_id
= match_p
->section_id
;
747 flags
|= match_p
->flags
;
749 /* Set the linked-to symbol name. */
750 sec
->map_head
.linked_to_symbol_name
751 = match_p
->linked_to_symbol_name
;
753 bfd_set_section_flags (sec
, flags
);
754 if (flags
& SEC_MERGE
)
755 sec
->entsize
= entsize
;
756 elf_group_name (sec
) = match_p
->group_name
;
758 /* Add a symbol for this section to the symbol table. */
759 secsym
= symbol_find (name
);
762 /* We could be repurposing an undefined symbol here: make sure we
763 reset sy_value to look like other section symbols in order to avoid
764 trying to incorrectly resolve this section symbol later on. */
765 static const expressionS expr
= { .X_op
= O_constant
};
766 symbol_set_value_expression (secsym
, &expr
);
767 symbol_set_bfdsym (secsym
, sec
->symbol
);
770 symbol_table_insert (section_symbol (sec
));
775 && (unsigned) type
!= elf_section_type (old_sec
))
778 /* This is a special section with known type. User
779 assembly might get the section type wrong; Even high
780 profile projects like glibc have done so in the past.
781 So don't error in this case. */
782 as_warn (_("ignoring changed section type for %s"), name
);
784 /* Do error when assembly isn't self-consistent. */
785 as_bad (_("changed section type for %s"), name
);
790 /* If section attributes are specified the second time we see a
791 particular section, then check that they are the same as we
792 saw the first time. */
793 if (((old_sec
->flags
^ flags
)
794 & (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
| SEC_CODE
795 | SEC_EXCLUDE
| SEC_SORT_ENTRIES
| SEC_MERGE
| SEC_STRINGS
796 | SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_DISCARD
797 | SEC_THREAD_LOCAL
)))
800 as_warn (_("ignoring changed section attributes for %s"), name
);
802 as_bad (_("changed section attributes for %s"), name
);
805 /* FIXME: Maybe we should consider removing a previously set
806 processor or application specific attribute as suspicious ? */
807 elf_section_flags (sec
) = attr
;
809 if ((flags
& SEC_MERGE
) && old_sec
->entsize
!= (unsigned) entsize
)
810 as_bad (_("changed section entity size for %s"), name
);
814 #ifdef md_elf_section_change_hook
815 md_elf_section_change_hook ();
820 obj_elf_parse_section_letters (char *str
, size_t len
,
821 bfd_boolean
*is_clone
, bfd_vma
*gnu_attr
)
837 attr
|= SHF_LINK_ORDER
;
843 attr
|= SHF_EXECINSTR
;
858 *gnu_attr
|= SHF_GNU_MBIND
;
865 if (*(str
- 1) == 'a')
868 if (len
> 1 && str
[1] == 's')
878 const char *bad_msg
= _("unrecognized .section attribute:"
879 " want a,e,o,w,x,M,S,G,T or number");
880 #ifdef md_elf_section_letter
881 bfd_vma md_attr
= md_elf_section_letter (*str
, &bad_msg
);
882 if (md_attr
!= (bfd_vma
) -1)
890 attr
|= strtoul (str
, & end
, 0);
891 /* Update str and len, allowing for the fact that
892 we will execute str++ and len-- below. */
898 as_fatal ("%s", bad_msg
);
909 obj_elf_section_type (char *str
, size_t len
, bfd_boolean warn
)
911 if (len
== 8 && strncmp (str
, "progbits", 8) == 0)
913 if (len
== 6 && strncmp (str
, "nobits", 6) == 0)
915 if (len
== 4 && strncmp (str
, "note", 4) == 0)
917 if (len
== 10 && strncmp (str
, "init_array", 10) == 0)
918 return SHT_INIT_ARRAY
;
919 if (len
== 10 && strncmp (str
, "fini_array", 10) == 0)
920 return SHT_FINI_ARRAY
;
921 if (len
== 13 && strncmp (str
, "preinit_array", 13) == 0)
922 return SHT_PREINIT_ARRAY
;
924 #ifdef md_elf_section_type
926 int md_type
= md_elf_section_type (str
, len
);
935 int type
= strtoul (str
, & end
, 0);
937 if (warn
&& (size_t) (end
- str
) != len
)
938 as_warn (_("extraneous characters at end of numeric section type"));
944 as_warn (_("unrecognized section type"));
949 obj_elf_section_word (char *str
, size_t len
, int *type
)
953 if (len
== 5 && strncmp (str
, "write", 5) == 0)
955 if (len
== 5 && strncmp (str
, "alloc", 5) == 0)
957 if (len
== 9 && strncmp (str
, "execinstr", 9) == 0)
958 return SHF_EXECINSTR
;
959 if (len
== 7 && strncmp (str
, "exclude", 7) == 0)
961 if (len
== 3 && strncmp (str
, "tls", 3) == 0)
964 #ifdef md_elf_section_word
966 bfd_vma md_attr
= md_elf_section_word (str
, len
);
972 ret
= obj_elf_section_type (str
, len
, FALSE
);
976 as_warn (_("unrecognized section attribute"));
981 /* Get name of section. */
983 obj_elf_section_name (void)
988 if (*input_line_pointer
== '"')
992 name
= demand_copy_C_string (&dummy
);
995 ignore_rest_of_line ();
1001 char *end
= input_line_pointer
;
1003 while (0 == strchr ("\n\t,; ", *end
))
1005 if (end
== input_line_pointer
)
1007 as_bad (_("missing name"));
1008 ignore_rest_of_line ();
1012 name
= xmemdup0 (input_line_pointer
, end
- input_line_pointer
);
1014 while (flag_sectname_subst
)
1016 char *subst
= strchr (name
, '%');
1017 if (subst
&& subst
[1] == 'S')
1019 int oldlen
= strlen (name
);
1020 int substlen
= strlen (now_seg
->name
);
1021 int newlen
= oldlen
- 2 + substlen
;
1022 char *newname
= XNEWVEC (char, newlen
+ 1);
1023 int headlen
= subst
- name
;
1024 memcpy (newname
, name
, headlen
);
1025 strcpy (newname
+ headlen
, now_seg
->name
);
1026 strcat (newname
+ headlen
, subst
+ 2);
1034 #ifdef tc_canonicalize_section_name
1035 name
= tc_canonicalize_section_name (name
);
1037 input_line_pointer
= end
;
1044 obj_elf_section (int push
)
1053 subsegT new_subsection
= -1;
1054 struct elf_section_match match
;
1060 #ifdef md_flush_pending_output
1061 md_flush_pending_output ();
1064 previous_section
= now_seg
;
1065 previous_subsection
= now_subseg
;
1067 s_mri_sect (&mri_type
);
1069 #ifdef md_elf_section_change_hook
1070 md_elf_section_change_hook ();
1076 name
= obj_elf_section_name ();
1080 memset (&match
, 0, sizeof (match
));
1083 if ((sym
= symbol_find (name
)) != NULL
1084 && ! symbol_section_p (sym
)
1085 && S_IS_DEFINED (sym
)
1086 && ! S_IS_VOLATILE (sym
)
1087 && ! S_CAN_BE_REDEFINED (sym
))
1089 as_bad (_("section name '%s' already defined as another symbol"), name
);
1090 ignore_rest_of_line ();
1099 if (*input_line_pointer
== ',')
1101 /* Skip the comma. */
1102 ++input_line_pointer
;
1105 if (push
&& ISDIGIT (*input_line_pointer
))
1107 /* .pushsection has an optional subsection. */
1108 new_subsection
= (subsegT
) get_absolute_expression ();
1112 /* Stop if we don't see a comma. */
1113 if (*input_line_pointer
!= ',')
1116 /* Skip the comma. */
1117 ++input_line_pointer
;
1121 if (*input_line_pointer
== '"')
1123 bfd_boolean is_clone
;
1125 beg
= demand_copy_C_string (&dummy
);
1128 ignore_rest_of_line ();
1131 attr
|= obj_elf_parse_section_letters (beg
, strlen (beg
),
1132 &is_clone
, &gnu_attr
);
1135 if (*input_line_pointer
== ',')
1138 char *save
= input_line_pointer
;
1140 ++input_line_pointer
;
1142 c
= *input_line_pointer
;
1145 beg
= demand_copy_C_string (&dummy
);
1148 ignore_rest_of_line ();
1151 type
= obj_elf_section_type (beg
, strlen (beg
), TRUE
);
1153 else if (c
== '@' || c
== '%')
1155 ++input_line_pointer
;
1157 if (ISDIGIT (* input_line_pointer
))
1158 type
= strtoul (input_line_pointer
, &input_line_pointer
, 0);
1161 c
= get_symbol_name (& beg
);
1162 (void) restore_line_pointer (c
);
1163 type
= obj_elf_section_type (beg
,
1164 input_line_pointer
- beg
,
1169 input_line_pointer
= save
;
1173 if ((attr
& SHF_MERGE
) != 0 && *input_line_pointer
== ',')
1175 ++input_line_pointer
;
1177 entsize
= get_absolute_expression ();
1181 as_warn (_("invalid merge entity size"));
1186 else if ((attr
& SHF_MERGE
) != 0)
1188 as_warn (_("entity size for SHF_MERGE not specified"));
1192 if ((attr
& SHF_LINK_ORDER
) != 0 && *input_line_pointer
== ',')
1195 unsigned int length
;
1196 ++input_line_pointer
;
1198 c
= get_symbol_name (& beg
);
1199 (void) restore_line_pointer (c
);
1200 length
= input_line_pointer
- beg
;
1202 match
.linked_to_symbol_name
= xmemdup0 (beg
, length
);
1205 if ((attr
& SHF_GROUP
) != 0 && is_clone
)
1207 as_warn (_("? section flag ignored with G present"));
1210 if ((attr
& SHF_GROUP
) != 0 && *input_line_pointer
== ',')
1212 ++input_line_pointer
;
1213 match
.group_name
= obj_elf_section_name ();
1214 if (match
.group_name
== NULL
)
1216 else if (*input_line_pointer
== ',')
1218 ++input_line_pointer
;
1220 if (strncmp (input_line_pointer
, "comdat", 6) == 0)
1222 input_line_pointer
+= 6;
1226 else if (strncmp (name
, ".gnu.linkonce", 13) == 0)
1229 else if ((attr
& SHF_GROUP
) != 0)
1231 as_warn (_("group name for SHF_GROUP not specified"));
1237 const char *now_group
= elf_group_name (now_seg
);
1238 if (now_group
!= NULL
)
1240 match
.group_name
= xstrdup (now_group
);
1241 linkonce
= (now_seg
->flags
& SEC_LINK_ONCE
) != 0;
1245 if ((gnu_attr
& SHF_GNU_MBIND
) != 0 && *input_line_pointer
== ',')
1247 char *save
= input_line_pointer
;
1248 ++input_line_pointer
;
1250 if (ISDIGIT (* input_line_pointer
))
1252 char *t
= input_line_pointer
;
1253 match
.info
= strtoul (input_line_pointer
,
1254 &input_line_pointer
, 0);
1255 if (match
.info
== (unsigned int) -1)
1257 as_warn (_("unsupported mbind section info: %s"), t
);
1262 input_line_pointer
= save
;
1265 if (*input_line_pointer
== ',')
1267 char *save
= input_line_pointer
;
1268 ++input_line_pointer
;
1270 if (strncmp (input_line_pointer
, "unique", 6) == 0)
1272 input_line_pointer
+= 6;
1274 if (*input_line_pointer
== ',')
1276 ++input_line_pointer
;
1278 if (ISDIGIT (* input_line_pointer
))
1281 bfd_boolean overflow
;
1282 char *t
= input_line_pointer
;
1283 if (sizeof (bfd_vma
) <= sizeof (unsigned long))
1286 id
= strtoul (input_line_pointer
,
1287 &input_line_pointer
, 0);
1288 overflow
= (id
== (unsigned long) -1
1289 && errno
== ERANGE
);
1294 (input_line_pointer
,
1295 (const char **) &input_line_pointer
, 0);
1296 overflow
= id
== ~(bfd_vma
) 0;
1298 if (overflow
|| id
> (unsigned int) -1)
1300 char *linefeed
, saved_char
= 0;
1301 if ((linefeed
= strchr (t
, '\n')) != NULL
)
1303 saved_char
= *linefeed
;
1306 as_bad (_("unsupported section id: %s"), t
);
1308 *linefeed
= saved_char
;
1312 match
.section_id
= id
;
1313 match
.flags
|= SEC_ASSEMBLER_SECTION_ID
;
1319 input_line_pointer
= save
;
1329 if (*input_line_pointer
!= '#')
1331 as_bad (_("character following name is not '#'"));
1332 ignore_rest_of_line ();
1335 ++input_line_pointer
;
1336 c
= get_symbol_name (& beg
);
1337 (void) restore_line_pointer (c
);
1339 attr
|= obj_elf_section_word (beg
, input_line_pointer
- beg
,
1344 while (*input_line_pointer
++ == ',');
1345 --input_line_pointer
;
1350 demand_empty_rest_of_line ();
1352 obj_elf_change_section (name
, type
, attr
, entsize
, &match
, linkonce
,
1355 if ((gnu_attr
& SHF_GNU_MBIND
) != 0)
1357 struct elf_backend_data
*bed
;
1359 if ((attr
& SHF_ALLOC
) == 0)
1360 as_bad (_("SHF_ALLOC isn't set for GNU_MBIND section: %s"), name
);
1362 bed
= (struct elf_backend_data
*) get_elf_backend_data (stdoutput
);
1363 if (bed
->elf_osabi
== ELFOSABI_NONE
)
1364 bed
->elf_osabi
= ELFOSABI_GNU
;
1365 else if (bed
->elf_osabi
!= ELFOSABI_GNU
1366 && bed
->elf_osabi
!= ELFOSABI_FREEBSD
)
1367 as_bad (_("GNU_MBIND section is supported only by GNU "
1368 "and FreeBSD targets"));
1369 elf_tdata (stdoutput
)->has_gnu_osabi
|= elf_gnu_osabi_mbind
;
1371 elf_section_flags (now_seg
) |= gnu_attr
;
1373 if (push
&& new_subsection
!= -1)
1374 subseg_set (now_seg
, new_subsection
);
1377 /* Change to the .data section. */
1380 obj_elf_data (int i
)
1382 #ifdef md_flush_pending_output
1383 md_flush_pending_output ();
1386 previous_section
= now_seg
;
1387 previous_subsection
= now_subseg
;
1390 #ifdef md_elf_section_change_hook
1391 md_elf_section_change_hook ();
1395 /* Change to the .text section. */
1398 obj_elf_text (int i
)
1400 #ifdef md_flush_pending_output
1401 md_flush_pending_output ();
1404 previous_section
= now_seg
;
1405 previous_subsection
= now_subseg
;
1408 #ifdef md_elf_section_change_hook
1409 md_elf_section_change_hook ();
1413 /* Change to the *ABS* section. */
1416 obj_elf_struct (int i
)
1418 #ifdef md_flush_pending_output
1419 md_flush_pending_output ();
1422 previous_section
= now_seg
;
1423 previous_subsection
= now_subseg
;
1426 #ifdef md_elf_section_change_hook
1427 md_elf_section_change_hook ();
1432 obj_elf_subsection (int ignore ATTRIBUTE_UNUSED
)
1436 #ifdef md_flush_pending_output
1437 md_flush_pending_output ();
1440 previous_section
= now_seg
;
1441 previous_subsection
= now_subseg
;
1443 temp
= get_absolute_expression ();
1444 subseg_set (now_seg
, (subsegT
) temp
);
1445 demand_empty_rest_of_line ();
1447 #ifdef md_elf_section_change_hook
1448 md_elf_section_change_hook ();
1452 /* This can be called from the processor backends if they change
1456 obj_elf_section_change_hook (void)
1458 previous_section
= now_seg
;
1459 previous_subsection
= now_subseg
;
1463 obj_elf_previous (int ignore ATTRIBUTE_UNUSED
)
1468 if (previous_section
== 0)
1470 as_warn (_(".previous without corresponding .section; ignored"));
1474 #ifdef md_flush_pending_output
1475 md_flush_pending_output ();
1478 new_section
= previous_section
;
1479 new_subsection
= previous_subsection
;
1480 previous_section
= now_seg
;
1481 previous_subsection
= now_subseg
;
1482 subseg_set (new_section
, new_subsection
);
1484 #ifdef md_elf_section_change_hook
1485 md_elf_section_change_hook ();
1490 obj_elf_popsection (int xxx ATTRIBUTE_UNUSED
)
1492 struct section_stack
*top
= section_stack
;
1496 as_warn (_(".popsection without corresponding .pushsection; ignored"));
1500 #ifdef md_flush_pending_output
1501 md_flush_pending_output ();
1504 section_stack
= top
->next
;
1505 previous_section
= top
->prev_seg
;
1506 previous_subsection
= top
->prev_subseg
;
1507 subseg_set (top
->seg
, top
->subseg
);
1510 #ifdef md_elf_section_change_hook
1511 md_elf_section_change_hook ();
1516 obj_elf_line (int ignore ATTRIBUTE_UNUSED
)
1518 /* Assume delimiter is part of expression. BSD4.2 as fails with
1519 delightful bug, so we are not being incompatible here. */
1520 new_logical_line (NULL
, get_absolute_expression ());
1521 demand_empty_rest_of_line ();
1524 static struct elf_versioned_name_list
*
1525 obj_elf_find_and_add_versioned_name (const char *version_name
,
1526 const char *sym_name
,
1528 struct elf_obj_sy
*sy_obj
)
1530 struct elf_versioned_name_list
*versioned_name
;
1533 for (p
= ver
+ 1; *p
== ELF_VER_CHR
; p
++)
1536 /* NB: Since some tests in ld/testsuite/ld-elfvers have no version
1537 names, we have to disable this. */
1538 if (0 && *p
== '\0')
1540 as_bad (_("missing version name in `%s' for symbol `%s'"),
1541 version_name
, sym_name
);
1545 versioned_name
= sy_obj
->versioned_name
;
1555 if (strcmp (versioned_name
->name
, version_name
) == 0)
1556 return versioned_name
;
1559 as_bad (_("only one version name with `@@@' is allowed "
1560 "for symbol `%s'"), sym_name
);
1564 sy_obj
->rename
= TRUE
;
1567 as_bad (_("invalid version name '%s' for symbol `%s'"),
1568 version_name
, sym_name
);
1573 versioned_name
!= NULL
;
1574 versioned_name
= versioned_name
->next
)
1575 if (strcmp (versioned_name
->name
, version_name
) == 0)
1576 return versioned_name
;
1578 /* Add this versioned name to the head of the list, */
1579 versioned_name
= (struct elf_versioned_name_list
*)
1580 xmalloc (sizeof (*versioned_name
));
1581 versioned_name
->name
= xstrdup (version_name
);
1582 versioned_name
->next
= sy_obj
->versioned_name
;
1583 sy_obj
->versioned_name
= versioned_name
;
1585 return versioned_name
;
1588 /* This handles the .symver pseudo-op, which is used to specify a
1589 symbol version. The syntax is ``.symver NAME,SYMVERNAME''.
1590 SYMVERNAME may contain ELF_VER_CHR ('@') characters. This
1591 pseudo-op causes the assembler to emit a symbol named SYMVERNAME
1592 with the same value as the symbol NAME. */
1595 obj_elf_symver (int ignore ATTRIBUTE_UNUSED
)
1598 const char *sym_name
;
1602 struct elf_obj_sy
*sy_obj
;
1605 sym
= get_sym_from_input_line_and_check ();
1607 if (*input_line_pointer
!= ',')
1609 as_bad (_("expected comma after name in .symver"));
1610 ignore_rest_of_line ();
1614 ++input_line_pointer
;
1617 /* Temporarily include '@' in symbol names. */
1618 old_lexat
= lex_type
[(unsigned char) '@'];
1619 lex_type
[(unsigned char) '@'] |= LEX_NAME
;
1620 c
= get_symbol_name (& name
);
1621 lex_type
[(unsigned char) '@'] = old_lexat
;
1622 sym_name
= S_GET_NAME (sym
);
1624 if (S_IS_COMMON (sym
))
1626 as_bad (_("`%s' can't be versioned to common symbol '%s'"),
1628 ignore_rest_of_line ();
1632 p
= strchr (name
, ELF_VER_CHR
);
1635 as_bad (_("missing version name in `%s' for symbol `%s'"),
1637 ignore_rest_of_line ();
1641 sy_obj
= symbol_get_obj (sym
);
1642 if (obj_elf_find_and_add_versioned_name (name
, sym_name
,
1645 sy_obj
->bad_version
= TRUE
;
1646 ignore_rest_of_line ();
1650 (void) restore_line_pointer (c
);
1652 if (*input_line_pointer
== ',')
1654 char *save
= input_line_pointer
;
1656 ++input_line_pointer
;
1658 if (strncmp (input_line_pointer
, "local", 5) == 0)
1660 input_line_pointer
+= 5;
1661 sy_obj
->visibility
= visibility_local
;
1663 else if (strncmp (input_line_pointer
, "hidden", 6) == 0)
1665 input_line_pointer
+= 6;
1666 sy_obj
->visibility
= visibility_hidden
;
1668 else if (strncmp (input_line_pointer
, "remove", 6) == 0)
1670 input_line_pointer
+= 6;
1671 sy_obj
->visibility
= visibility_remove
;
1674 input_line_pointer
= save
;
1677 demand_empty_rest_of_line ();
1680 /* This handles the .vtable_inherit pseudo-op, which is used to indicate
1681 to the linker the hierarchy in which a particular table resides. The
1682 syntax is ".vtable_inherit CHILDNAME, PARENTNAME". */
1685 obj_elf_get_vtable_inherit (void)
1687 char *cname
, *pname
;
1688 symbolS
*csym
, *psym
;
1691 if (*input_line_pointer
== '#')
1692 ++input_line_pointer
;
1694 c
= get_symbol_name (& cname
);
1695 csym
= symbol_find (cname
);
1697 /* GCFIXME: should check that we don't have two .vtable_inherits for
1698 the same child symbol. Also, we can currently only do this if the
1699 child symbol is already exists and is placed in a fragment. */
1701 if (csym
== NULL
|| symbol_get_frag (csym
) == NULL
)
1703 as_bad (_("expected `%s' to have already been set for .vtable_inherit"),
1708 *input_line_pointer
= c
;
1710 SKIP_WHITESPACE_AFTER_NAME ();
1711 if (*input_line_pointer
!= ',')
1713 as_bad (_("expected comma after name in .vtable_inherit"));
1714 ignore_rest_of_line ();
1718 ++input_line_pointer
;
1721 if (*input_line_pointer
== '#')
1722 ++input_line_pointer
;
1724 if (input_line_pointer
[0] == '0'
1725 && (input_line_pointer
[1] == '\0'
1726 || ISSPACE (input_line_pointer
[1])))
1728 psym
= section_symbol (absolute_section
);
1729 ++input_line_pointer
;
1733 c
= get_symbol_name (& pname
);
1734 psym
= symbol_find_or_make (pname
);
1735 restore_line_pointer (c
);
1738 demand_empty_rest_of_line ();
1743 gas_assert (symbol_get_value_expression (csym
)->X_op
== O_constant
);
1744 return fix_new (symbol_get_frag (csym
),
1745 symbol_get_value_expression (csym
)->X_add_number
,
1746 0, psym
, 0, 0, BFD_RELOC_VTABLE_INHERIT
);
1749 /* This is a version of obj_elf_get_vtable_inherit() that is
1750 suitable for use in struct _pseudo_type tables. */
1753 obj_elf_vtable_inherit (int ignore ATTRIBUTE_UNUSED
)
1755 (void) obj_elf_get_vtable_inherit ();
1758 /* This handles the .vtable_entry pseudo-op, which is used to indicate
1759 to the linker that a vtable slot was used. The syntax is
1760 ".vtable_entry tablename, offset". */
1763 obj_elf_get_vtable_entry (void)
1768 if (*input_line_pointer
== '#')
1769 ++input_line_pointer
;
1771 sym
= get_sym_from_input_line_and_check ();
1772 if (*input_line_pointer
!= ',')
1774 as_bad (_("expected comma after name in .vtable_entry"));
1775 ignore_rest_of_line ();
1779 ++input_line_pointer
;
1780 if (*input_line_pointer
== '#')
1781 ++input_line_pointer
;
1783 offset
= get_absolute_expression ();
1785 demand_empty_rest_of_line ();
1787 return fix_new (frag_now
, frag_now_fix (), 0, sym
, offset
, 0,
1788 BFD_RELOC_VTABLE_ENTRY
);
1791 /* This is a version of obj_elf_get_vtable_entry() that is
1792 suitable for use in struct _pseudo_type tables. */
1795 obj_elf_vtable_entry (int ignore ATTRIBUTE_UNUSED
)
1797 (void) obj_elf_get_vtable_entry ();
1800 #define skip_whitespace(str) do { if (*(str) == ' ') ++(str); } while (0)
1803 skip_past_char (char ** str
, char c
)
1813 #define skip_past_comma(str) skip_past_char (str, ',')
1815 /* A list of attributes that have been explicitly set by the assembly code.
1816 VENDOR is the vendor id, BASE is the tag shifted right by the number
1817 of bits in MASK, and bit N of MASK is set if tag BASE+N has been set. */
1818 struct recorded_attribute_info
{
1819 struct recorded_attribute_info
*next
;
1824 static struct recorded_attribute_info
*recorded_attributes
;
1826 /* Record that we have seen an explicit specification of attribute TAG
1827 for vendor VENDOR. */
1830 record_attribute (int vendor
, unsigned int tag
)
1834 struct recorded_attribute_info
*rai
;
1836 base
= tag
/ (8 * sizeof (rai
->mask
));
1837 mask
= 1UL << (tag
% (8 * sizeof (rai
->mask
)));
1838 for (rai
= recorded_attributes
; rai
; rai
= rai
->next
)
1839 if (rai
->vendor
== vendor
&& rai
->base
== base
)
1845 rai
= XNEW (struct recorded_attribute_info
);
1846 rai
->next
= recorded_attributes
;
1847 rai
->vendor
= vendor
;
1850 recorded_attributes
= rai
;
1853 /* Return true if we have seen an explicit specification of attribute TAG
1854 for vendor VENDOR. */
1857 obj_elf_seen_attribute (int vendor
, unsigned int tag
)
1861 struct recorded_attribute_info
*rai
;
1863 base
= tag
/ (8 * sizeof (rai
->mask
));
1864 mask
= 1UL << (tag
% (8 * sizeof (rai
->mask
)));
1865 for (rai
= recorded_attributes
; rai
; rai
= rai
->next
)
1866 if (rai
->vendor
== vendor
&& rai
->base
== base
)
1867 return (rai
->mask
& mask
) != 0;
1871 /* Parse an attribute directive for VENDOR.
1872 Returns the attribute number read, or zero on error. */
1875 obj_elf_vendor_attribute (int vendor
)
1883 /* Read the first number or name. */
1884 skip_whitespace (input_line_pointer
);
1885 s
= input_line_pointer
;
1886 if (ISDIGIT (*input_line_pointer
))
1889 if (exp
.X_op
!= O_constant
)
1891 tag
= exp
.X_add_number
;
1897 /* A name may contain '_', but no other punctuation. */
1898 for (; ISALNUM (*input_line_pointer
) || *input_line_pointer
== '_';
1899 ++input_line_pointer
)
1904 name
= xstrndup (s
, i
);
1906 #ifndef CONVERT_SYMBOLIC_ATTRIBUTE
1907 #define CONVERT_SYMBOLIC_ATTRIBUTE(a) -1
1910 tag
= CONVERT_SYMBOLIC_ATTRIBUTE (name
);
1913 as_bad (_("Attribute name not recognised: %s"), name
);
1914 ignore_rest_of_line ();
1921 type
= _bfd_elf_obj_attrs_arg_type (stdoutput
, vendor
, tag
);
1923 if (skip_past_comma (&input_line_pointer
) == -1)
1928 if (exp
.X_op
!= O_constant
)
1930 as_bad (_("expected numeric constant"));
1931 ignore_rest_of_line ();
1934 i
= exp
.X_add_number
;
1937 && skip_past_comma (&input_line_pointer
) == -1)
1939 as_bad (_("expected comma"));
1940 ignore_rest_of_line ();
1947 skip_whitespace (input_line_pointer
);
1948 if (*input_line_pointer
!= '"')
1950 s
= demand_copy_C_string (&len
);
1953 record_attribute (vendor
, tag
);
1957 bfd_elf_add_obj_attr_int_string (stdoutput
, vendor
, tag
, i
, s
);
1960 bfd_elf_add_obj_attr_string (stdoutput
, vendor
, tag
, s
);
1963 bfd_elf_add_obj_attr_int (stdoutput
, vendor
, tag
, i
);
1969 demand_empty_rest_of_line ();
1972 as_bad (_("bad string constant"));
1973 ignore_rest_of_line ();
1976 as_bad (_("expected <tag> , <value>"));
1977 ignore_rest_of_line ();
1981 /* Parse a .gnu_attribute directive. */
1984 obj_elf_gnu_attribute (int ignored ATTRIBUTE_UNUSED
)
1986 obj_elf_vendor_attribute (OBJ_ATTR_GNU
);
1990 elf_obj_read_begin_hook (void)
1992 #ifdef NEED_ECOFF_DEBUG
1993 if (ECOFF_DEBUGGING
)
1994 ecoff_read_begin_hook ();
1999 elf_obj_symbol_new_hook (symbolS
*symbolP
)
2001 struct elf_obj_sy
*sy_obj
;
2003 sy_obj
= symbol_get_obj (symbolP
);
2004 sy_obj
->size
= NULL
;
2005 sy_obj
->versioned_name
= NULL
;
2007 #ifdef NEED_ECOFF_DEBUG
2008 if (ECOFF_DEBUGGING
)
2009 ecoff_symbol_new_hook (symbolP
);
2013 /* When setting one symbol equal to another, by default we probably
2014 want them to have the same "size", whatever it means in the current
2018 elf_copy_symbol_attributes (symbolS
*dest
, symbolS
*src
)
2020 struct elf_obj_sy
*srcelf
= symbol_get_obj (src
);
2021 struct elf_obj_sy
*destelf
= symbol_get_obj (dest
);
2024 if (destelf
->size
== NULL
)
2025 destelf
->size
= XNEW (expressionS
);
2026 *destelf
->size
= *srcelf
->size
;
2030 free (destelf
->size
);
2031 destelf
->size
= NULL
;
2033 S_SET_SIZE (dest
, S_GET_SIZE (src
));
2034 /* Don't copy visibility. */
2035 S_SET_OTHER (dest
, (ELF_ST_VISIBILITY (S_GET_OTHER (dest
))
2036 | (S_GET_OTHER (src
) & ~ELF_ST_VISIBILITY (-1))));
2040 obj_elf_version (int ignore ATTRIBUTE_UNUSED
)
2045 asection
*seg
= now_seg
;
2046 subsegT subseg
= now_subseg
;
2047 Elf_Internal_Note i_note
;
2048 Elf_External_Note e_note
;
2049 asection
*note_secp
= NULL
;
2052 if (*input_line_pointer
== '\"')
2056 ++input_line_pointer
; /* -> 1st char of string. */
2057 name
= input_line_pointer
;
2059 while (is_a_char (c
= next_char_of_string ()))
2061 c
= *input_line_pointer
;
2062 *input_line_pointer
= '\0';
2063 *(input_line_pointer
- 1) = '\0';
2064 *input_line_pointer
= c
;
2066 /* Create the .note section. */
2067 note_secp
= subseg_new (".note", 0);
2068 bfd_set_section_flags (note_secp
, SEC_HAS_CONTENTS
| SEC_READONLY
);
2069 record_alignment (note_secp
, 2);
2071 /* Process the version string. */
2072 len
= strlen (name
) + 1;
2074 /* PR 3456: Although the name field is padded out to an 4-byte
2075 boundary, the namesz field should not be adjusted. */
2076 i_note
.namesz
= len
;
2077 i_note
.descsz
= 0; /* No description. */
2078 i_note
.type
= NT_VERSION
;
2079 p
= frag_more (sizeof (e_note
.namesz
));
2080 md_number_to_chars (p
, i_note
.namesz
, sizeof (e_note
.namesz
));
2081 p
= frag_more (sizeof (e_note
.descsz
));
2082 md_number_to_chars (p
, i_note
.descsz
, sizeof (e_note
.descsz
));
2083 p
= frag_more (sizeof (e_note
.type
));
2084 md_number_to_chars (p
, i_note
.type
, sizeof (e_note
.type
));
2085 p
= frag_more (len
);
2086 memcpy (p
, name
, len
);
2088 frag_align (2, 0, 0);
2090 subseg_set (seg
, subseg
);
2093 as_bad (_("expected quoted string"));
2095 demand_empty_rest_of_line ();
2099 obj_elf_size (int ignore ATTRIBUTE_UNUSED
)
2102 char c
= get_symbol_name (&name
);
2107 p
= input_line_pointer
;
2109 SKIP_WHITESPACE_AFTER_NAME ();
2110 if (*input_line_pointer
!= ',')
2113 as_bad (_("expected comma after name `%s' in .size directive"), name
);
2115 ignore_rest_of_line ();
2118 input_line_pointer
++;
2120 if (exp
.X_op
== O_absent
)
2122 as_bad (_("missing expression in .size directive"));
2123 exp
.X_op
= O_constant
;
2124 exp
.X_add_number
= 0;
2127 sym
= symbol_find_or_make (name
);
2129 if (exp
.X_op
== O_constant
)
2131 S_SET_SIZE (sym
, exp
.X_add_number
);
2132 xfree (symbol_get_obj (sym
)->size
);
2133 symbol_get_obj (sym
)->size
= NULL
;
2137 symbol_get_obj (sym
)->size
= XNEW (expressionS
);
2138 *symbol_get_obj (sym
)->size
= exp
;
2140 demand_empty_rest_of_line ();
2143 /* Handle the ELF .type pseudo-op. This sets the type of a symbol.
2144 There are six syntaxes:
2146 The first (used on Solaris) is
2148 The second (used on UnixWare) is
2150 The third (reportedly to be used on Irix 6.0) is
2152 The fourth (used on NetBSD/Arm and Linux/ARM) is
2154 The fifth (used on SVR4/860) is
2155 .type SYM,"function"
2156 The sixth (emitted by recent SunPRO under Solaris) is
2158 where the integer is the STT_* value.
2162 obj_elf_type_name (char *cp
)
2166 p
= input_line_pointer
;
2167 if (*input_line_pointer
>= '0'
2168 && *input_line_pointer
<= '9')
2170 while (*input_line_pointer
>= '0'
2171 && *input_line_pointer
<= '9')
2172 ++input_line_pointer
;
2173 *cp
= *input_line_pointer
;
2174 *input_line_pointer
= '\0';
2177 *cp
= get_symbol_name (&p
);
2183 obj_elf_type (int ignore ATTRIBUTE_UNUSED
)
2187 const char *type_name
;
2189 elf_symbol_type
*elfsym
;
2191 sym
= get_sym_from_input_line_and_check ();
2192 c
= *input_line_pointer
;
2193 elfsym
= (elf_symbol_type
*) symbol_get_bfdsym (sym
);
2195 if (*input_line_pointer
== ',')
2196 ++input_line_pointer
;
2199 if ( *input_line_pointer
== '#'
2200 || *input_line_pointer
== '@'
2201 || *input_line_pointer
== '"'
2202 || *input_line_pointer
== '%')
2203 ++input_line_pointer
;
2205 type_name
= obj_elf_type_name (& c
);
2208 if (strcmp (type_name
, "function") == 0
2209 || strcmp (type_name
, "2") == 0
2210 || strcmp (type_name
, "STT_FUNC") == 0)
2211 type
= BSF_FUNCTION
;
2212 else if (strcmp (type_name
, "object") == 0
2213 || strcmp (type_name
, "1") == 0
2214 || strcmp (type_name
, "STT_OBJECT") == 0)
2216 else if (strcmp (type_name
, "tls_object") == 0
2217 || strcmp (type_name
, "6") == 0
2218 || strcmp (type_name
, "STT_TLS") == 0)
2219 type
= BSF_OBJECT
| BSF_THREAD_LOCAL
;
2220 else if (strcmp (type_name
, "notype") == 0
2221 || strcmp (type_name
, "0") == 0
2222 || strcmp (type_name
, "STT_NOTYPE") == 0)
2224 else if (strcmp (type_name
, "common") == 0
2225 || strcmp (type_name
, "5") == 0
2226 || strcmp (type_name
, "STT_COMMON") == 0)
2230 if (! S_IS_COMMON (sym
))
2232 if (S_IS_VOLATILE (sym
))
2234 sym
= symbol_clone (sym
, 1);
2235 S_SET_SEGMENT (sym
, bfd_com_section_ptr
);
2236 S_SET_VALUE (sym
, 0);
2237 S_SET_EXTERNAL (sym
);
2238 symbol_set_frag (sym
, &zero_address_frag
);
2239 S_CLEAR_VOLATILE (sym
);
2241 else if (S_IS_DEFINED (sym
) || symbol_equated_p (sym
))
2242 as_bad (_("symbol '%s' is already defined"), S_GET_NAME (sym
));
2245 /* FIXME: Is it safe to just change the section ? */
2246 S_SET_SEGMENT (sym
, bfd_com_section_ptr
);
2247 S_SET_VALUE (sym
, 0);
2248 S_SET_EXTERNAL (sym
);
2252 else if (strcmp (type_name
, "gnu_indirect_function") == 0
2253 || strcmp (type_name
, "10") == 0
2254 || strcmp (type_name
, "STT_GNU_IFUNC") == 0)
2256 struct elf_backend_data
*bed
;
2258 bed
= (struct elf_backend_data
*) get_elf_backend_data (stdoutput
);
2259 if (bed
->elf_osabi
== ELFOSABI_NONE
)
2260 bed
->elf_osabi
= ELFOSABI_GNU
;
2261 else if (bed
->elf_osabi
!= ELFOSABI_GNU
2262 && bed
->elf_osabi
!= ELFOSABI_FREEBSD
)
2263 as_bad (_("symbol type \"%s\" is supported only by GNU "
2264 "and FreeBSD targets"), type_name
);
2265 /* MIPS targets do not support IFUNCS. */
2266 else if (bed
->target_id
== MIPS_ELF_DATA
)
2267 as_bad (_("symbol type \"%s\" is not supported by "
2268 "MIPS targets"), type_name
);
2269 elf_tdata (stdoutput
)->has_gnu_osabi
|= elf_gnu_osabi_ifunc
;
2270 type
= BSF_FUNCTION
| BSF_GNU_INDIRECT_FUNCTION
;
2272 else if (strcmp (type_name
, "gnu_unique_object") == 0)
2274 struct elf_backend_data
*bed
;
2276 bed
= (struct elf_backend_data
*) get_elf_backend_data (stdoutput
);
2277 if (bed
->elf_osabi
== ELFOSABI_NONE
)
2278 bed
->elf_osabi
= ELFOSABI_GNU
;
2279 else if (bed
->elf_osabi
!= ELFOSABI_GNU
)
2280 as_bad (_("symbol type \"%s\" is supported only by GNU targets"),
2282 elf_tdata (stdoutput
)->has_gnu_osabi
|= elf_gnu_osabi_unique
;
2283 type
= BSF_OBJECT
| BSF_GNU_UNIQUE
;
2285 #ifdef md_elf_symbol_type
2286 else if ((type
= md_elf_symbol_type (type_name
, sym
, elfsym
)) != -1)
2290 as_bad (_("unrecognized symbol type \"%s\""), type_name
);
2292 *input_line_pointer
= c
;
2294 if (*input_line_pointer
== '"')
2295 ++input_line_pointer
;
2297 #ifdef md_elf_symbol_type_change
2298 if (!md_elf_symbol_type_change (sym
, elfsym
, type
))
2301 flagword mask
= BSF_FUNCTION
| BSF_OBJECT
;
2303 if (type
!= BSF_FUNCTION
)
2304 mask
|= BSF_GNU_INDIRECT_FUNCTION
;
2305 if (type
!= BSF_OBJECT
)
2307 mask
|= BSF_GNU_UNIQUE
| BSF_THREAD_LOCAL
;
2309 if (S_IS_COMMON (sym
))
2311 as_bad (_("cannot change type of common symbol '%s'"),
2317 /* Don't warn when changing to STT_NOTYPE. */
2320 flagword
new = (elfsym
->symbol
.flags
& ~mask
) | type
;
2322 if (new != (elfsym
->symbol
.flags
| type
))
2323 as_warn (_("symbol '%s' already has its type set"), S_GET_NAME (sym
));
2324 elfsym
->symbol
.flags
= new;
2327 elfsym
->symbol
.flags
&= ~mask
;
2330 demand_empty_rest_of_line ();
2334 obj_elf_ident (int ignore ATTRIBUTE_UNUSED
)
2336 static segT comment_section
;
2337 segT old_section
= now_seg
;
2338 int old_subsection
= now_subseg
;
2340 #ifdef md_flush_pending_output
2341 md_flush_pending_output ();
2344 if (!comment_section
)
2347 comment_section
= subseg_new (".comment", 0);
2348 bfd_set_section_flags (comment_section
, (SEC_READONLY
| SEC_HAS_CONTENTS
2349 | SEC_MERGE
| SEC_STRINGS
));
2350 comment_section
->entsize
= 1;
2351 #ifdef md_elf_section_change_hook
2352 md_elf_section_change_hook ();
2358 subseg_set (comment_section
, 0);
2360 subseg_set (old_section
, old_subsection
);
2363 #ifdef INIT_STAB_SECTION
2365 /* The first entry in a .stabs section is special. */
2368 obj_elf_init_stab_section (segT seg
)
2373 unsigned int stroff
;
2375 /* Force the section to align to a longword boundary. Without this,
2376 UnixWare ar crashes. */
2377 bfd_set_section_alignment (seg
, 2);
2379 /* Make space for this first symbol. */
2383 file
= as_where (NULL
);
2384 stabstr_name
= concat (segment_name (seg
), "str", (char *) NULL
);
2385 stroff
= get_stab_string_offset (file
, stabstr_name
, TRUE
);
2386 know (stroff
== 1 || (stroff
== 0 && file
[0] == '\0'));
2387 md_number_to_chars (p
, stroff
, 4);
2388 seg_info (seg
)->stabu
.p
= p
;
2393 /* Fill in the counts in the first entry in a .stabs section. */
2396 adjust_stab_sections (bfd
*abfd
, asection
*sec
, void *xxx ATTRIBUTE_UNUSED
)
2403 if (strncmp (".stab", sec
->name
, 5))
2405 if (!strcmp ("str", sec
->name
+ strlen (sec
->name
) - 3))
2408 name
= concat (sec
->name
, "str", NULL
);
2409 strsec
= bfd_get_section_by_name (abfd
, name
);
2411 strsz
= bfd_section_size (strsec
);
2414 nsyms
= bfd_section_size (sec
) / 12 - 1;
2416 p
= seg_info (sec
)->stabu
.p
;
2417 gas_assert (p
!= 0);
2419 bfd_h_put_16 (abfd
, nsyms
, p
+ 6);
2420 bfd_h_put_32 (abfd
, strsz
, p
+ 8);
2424 #ifdef NEED_ECOFF_DEBUG
2426 /* This function is called by the ECOFF code. It is supposed to
2427 record the external symbol information so that the backend can
2428 write it out correctly. The ELF backend doesn't actually handle
2429 this at the moment, so we do it ourselves. We save the information
2432 #ifdef OBJ_MAYBE_ELF
2436 elf_ecoff_set_ext (symbolS
*sym
, struct ecoff_extr
*ext
)
2438 symbol_get_bfdsym (sym
)->udata
.p
= ext
;
2441 /* This function is called by bfd_ecoff_debug_externals. It is
2442 supposed to *EXT to the external symbol information, and return
2443 whether the symbol should be used at all. */
2446 elf_get_extr (asymbol
*sym
, EXTR
*ext
)
2448 if (sym
->udata
.p
== NULL
)
2450 *ext
= *(EXTR
*) sym
->udata
.p
;
2454 /* This function is called by bfd_ecoff_debug_externals. It has
2455 nothing to do for ELF. */
2458 elf_set_index (asymbol
*sym ATTRIBUTE_UNUSED
,
2459 bfd_size_type indx ATTRIBUTE_UNUSED
)
2463 #endif /* NEED_ECOFF_DEBUG */
2466 elf_frob_symbol (symbolS
*symp
, int *puntp
)
2468 struct elf_obj_sy
*sy_obj
;
2470 struct elf_versioned_name_list
*versioned_name
;
2472 #ifdef NEED_ECOFF_DEBUG
2473 if (ECOFF_DEBUGGING
)
2474 ecoff_frob_symbol (symp
);
2477 sy_obj
= symbol_get_obj (symp
);
2479 size
= sy_obj
->size
;
2482 if (resolve_expression (size
)
2483 && size
->X_op
== O_constant
)
2484 S_SET_SIZE (symp
, size
->X_add_number
);
2487 if (!flag_allow_nonconst_size
)
2488 as_bad (_(".size expression for %s "
2489 "does not evaluate to a constant"), S_GET_NAME (symp
));
2491 as_warn (_(".size expression for %s "
2492 "does not evaluate to a constant"), S_GET_NAME (symp
));
2494 free (sy_obj
->size
);
2495 sy_obj
->size
= NULL
;
2498 versioned_name
= sy_obj
->versioned_name
;
2501 /* This symbol was given a new name with the .symver directive.
2502 If this is an external reference, just rename the symbol to
2503 include the version string. This will make the relocs be
2504 against the correct versioned symbol. */
2506 /* We will have already reported an version error. */
2507 if (sy_obj
->bad_version
)
2509 /* elf_frob_file_before_adjust only allows one version symbol for
2511 else if (sy_obj
->rename
)
2512 S_SET_NAME (symp
, versioned_name
->name
);
2513 else if (S_IS_COMMON (symp
))
2515 as_bad (_("`%s' can't be versioned to common symbol '%s'"),
2516 versioned_name
->name
, S_GET_NAME (symp
));
2522 elf_symbol_type
*elfsym
;
2524 /* This is a definition. Add an alias for each version.
2525 FIXME: Using an alias will permit the debugging information
2526 to refer to the right symbol. However, it's not clear
2527 whether it is the best approach. */
2529 /* FIXME: Creating a new symbol here is risky. We're
2530 in the final loop over the symbol table. We can
2531 get away with it only because the symbol goes to
2532 the end of the list, where the loop will still see
2533 it. It would probably be better to do this in
2534 obj_frob_file_before_adjust. */
2535 for (; versioned_name
!= NULL
;
2536 versioned_name
= versioned_name
->next
)
2538 symbolS
*symp2
= symbol_find_or_make (versioned_name
->name
);
2540 S_SET_SEGMENT (symp2
, S_GET_SEGMENT (symp
));
2542 /* Subtracting out the frag address here is a hack
2543 because we are in the middle of the final loop. */
2546 - symbol_get_frag (symp
)->fr_address
));
2548 symbol_set_frag (symp2
, symbol_get_frag (symp
));
2550 /* This will copy over the size information. */
2551 copy_symbol_attributes (symp2
, symp
);
2553 S_SET_OTHER (symp2
, S_GET_OTHER (symp
));
2555 if (S_IS_WEAK (symp
))
2558 if (S_IS_EXTERNAL (symp
))
2559 S_SET_EXTERNAL (symp2
);
2562 switch (symbol_get_obj (symp
)->visibility
)
2564 case visibility_unchanged
:
2566 case visibility_hidden
:
2567 bfdsym
= symbol_get_bfdsym (symp
);
2568 elfsym
= elf_symbol_from (bfdsym
);
2569 elfsym
->internal_elf_sym
.st_other
&= ~3;
2570 elfsym
->internal_elf_sym
.st_other
|= STV_HIDDEN
;
2572 case visibility_remove
:
2573 symbol_remove (symp
, &symbol_rootP
, &symbol_lastP
);
2575 case visibility_local
:
2576 S_CLEAR_EXTERNAL (symp
);
2582 /* Double check weak symbols. */
2583 if (S_IS_WEAK (symp
))
2585 if (S_IS_COMMON (symp
))
2586 as_bad (_("symbol `%s' can not be both weak and common"),
2593 asection
**head
; /* Section lists. */
2594 unsigned int num_group
; /* Number of lists. */
2595 htab_t indexes
; /* Maps group name to index in head array. */
2598 static struct group_list groups
;
2600 /* Called via bfd_map_over_sections. If SEC is a member of a group,
2601 add it to a list of sections belonging to the group. INF is a
2602 pointer to a struct group_list, which is where we store the head of
2603 each list. If its link_to_symbol_name isn't NULL, set up its
2604 linked-to section. */
2607 build_additional_section_info (bfd
*abfd ATTRIBUTE_UNUSED
,
2608 asection
*sec
, void *inf
)
2610 struct group_list
*list
= (struct group_list
*) inf
;
2611 const char *group_name
= elf_group_name (sec
);
2613 unsigned int *elem_idx
;
2614 unsigned int *idx_ptr
;
2616 if (sec
->map_head
.linked_to_symbol_name
)
2618 symbolS
*linked_to_sym
;
2619 linked_to_sym
= symbol_find (sec
->map_head
.linked_to_symbol_name
);
2620 if (!linked_to_sym
|| !S_IS_DEFINED (linked_to_sym
))
2621 as_bad (_("undefined linked-to symbol `%s' on section `%s'"),
2622 sec
->map_head
.linked_to_symbol_name
,
2623 bfd_section_name (sec
));
2625 elf_linked_to_section (sec
) = S_GET_SEGMENT (linked_to_sym
);
2628 if (group_name
== NULL
)
2631 /* If this group already has a list, add the section to the head of
2633 elem_idx
= (unsigned int *) str_hash_find (list
->indexes
, group_name
);
2634 if (elem_idx
!= NULL
)
2636 elf_next_in_group (sec
) = list
->head
[*elem_idx
];
2637 list
->head
[*elem_idx
] = sec
;
2641 /* New group. Make the arrays bigger in chunks to minimize calls to
2643 i
= list
->num_group
;
2646 unsigned int newsize
= i
+ 128;
2647 list
->head
= XRESIZEVEC (asection
*, list
->head
, newsize
);
2649 list
->head
[i
] = sec
;
2650 list
->num_group
+= 1;
2652 /* Add index to hash. */
2653 idx_ptr
= XNEW (unsigned int);
2655 str_hash_insert (list
->indexes
, group_name
, idx_ptr
, 0);
2659 free_section_idx (void **slot
, void *arg ATTRIBUTE_UNUSED
)
2661 string_tuple_t
*tuple
= *((string_tuple_t
**) slot
);
2662 free ((char *)tuple
->value
);
2666 /* Create symbols for group signature. */
2669 elf_adjust_symtab (void)
2673 /* Go find section groups. */
2674 groups
.num_group
= 0;
2676 groups
.indexes
= str_htab_create ();
2677 bfd_map_over_sections (stdoutput
, build_additional_section_info
,
2680 /* Make the SHT_GROUP sections that describe each section group. We
2681 can't set up the section contents here yet, because elf section
2682 indices have yet to be calculated. elf.c:set_group_contents does
2683 the rest of the work. */
2684 for (i
= 0; i
< groups
.num_group
; i
++)
2686 const char *group_name
= elf_group_name (groups
.head
[i
]);
2687 const char *sec_name
;
2692 flags
= SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
| SEC_GROUP
;
2693 for (s
= groups
.head
[i
]; s
!= NULL
; s
= elf_next_in_group (s
))
2694 if ((s
->flags
^ flags
) & SEC_LINK_ONCE
)
2696 flags
|= SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_DISCARD
;
2697 if (s
!= groups
.head
[i
])
2699 as_warn (_("assuming all members of group `%s' are COMDAT"),
2705 sec_name
= ".group";
2706 s
= subseg_force_new (sec_name
, 0);
2708 || !bfd_set_section_flags (s
, flags
)
2709 || !bfd_set_section_alignment (s
, 2))
2711 as_fatal (_("can't create group: %s"),
2712 bfd_errmsg (bfd_get_error ()));
2714 elf_section_type (s
) = SHT_GROUP
;
2716 /* Pass a pointer to the first section in this group. */
2717 elf_next_in_group (s
) = groups
.head
[i
];
2718 elf_sec_group (groups
.head
[i
]) = s
;
2719 /* Make sure that the signature symbol for the group has the
2720 name of the group. */
2721 sy
= symbol_find_exact (group_name
);
2722 if (!sy
|| !symbol_on_chain (sy
, symbol_rootP
, symbol_lastP
))
2724 /* Create the symbol now. */
2725 sy
= symbol_new (group_name
, now_seg
, frag_now
, 0);
2727 /* Before Solaris 11 build 154, Sun ld rejects local group
2728 signature symbols, so make them weak hidden instead. */
2729 symbol_get_bfdsym (sy
)->flags
|= BSF_WEAK
;
2730 S_SET_OTHER (sy
, STV_HIDDEN
);
2732 symbol_get_obj (sy
)->local
= 1;
2734 symbol_table_insert (sy
);
2736 elf_group_id (s
) = symbol_get_bfdsym (sy
);
2741 elf_frob_file (void)
2743 bfd_map_over_sections (stdoutput
, adjust_stab_sections
, NULL
);
2745 #ifdef elf_tc_final_processing
2746 elf_tc_final_processing ();
2750 /* It removes any unneeded versioned symbols from the symbol table. */
2753 elf_frob_file_before_adjust (void)
2759 for (symp
= symbol_rootP
; symp
; symp
= symbol_next (symp
))
2761 struct elf_obj_sy
*sy_obj
= symbol_get_obj (symp
);
2762 int is_defined
= !!S_IS_DEFINED (symp
);
2764 if (sy_obj
->versioned_name
)
2766 char *p
= strchr (sy_obj
->versioned_name
->name
,
2771 /* The @@@ syntax is a special case. If the symbol is
2772 not defined, 2 `@'s will be removed from the
2773 versioned_name. Otherwise, 1 `@' will be removed. */
2774 size_t l
= strlen (&p
[3]) + 1;
2775 memmove (&p
[1 + is_defined
], &p
[3], l
);
2780 /* Verify that the name isn't using the @@ syntax--this
2781 is reserved for definitions of the default version
2783 if (!sy_obj
->rename
&& p
[1] == ELF_VER_CHR
)
2785 as_bad (_("invalid attempt to declare external "
2786 "version name as default in symbol `%s'"),
2787 sy_obj
->versioned_name
->name
);
2791 /* Only one version symbol is allowed for undefined
2793 if (sy_obj
->versioned_name
->next
)
2795 as_bad (_("multiple versions [`%s'|`%s'] for "
2797 sy_obj
->versioned_name
->name
,
2798 sy_obj
->versioned_name
->next
->name
,
2803 sy_obj
->rename
= TRUE
;
2807 /* If there was .symver or .weak, but symbol was neither
2808 defined nor used anywhere, remove it. */
2810 && (sy_obj
->versioned_name
|| S_IS_WEAK (symp
))
2811 && symbol_used_p (symp
) == 0
2812 && symbol_used_in_reloc_p (symp
) == 0)
2813 symbol_remove (symp
, &symbol_rootP
, &symbol_lastP
);
2818 /* It is required that we let write_relocs have the opportunity to
2819 optimize away fixups before output has begun, since it is possible
2820 to eliminate all fixups for a section and thus we never should
2821 have generated the relocation section. */
2824 elf_frob_file_after_relocs (void)
2828 /* Set SHT_GROUP section size. */
2829 for (i
= 0; i
< groups
.num_group
; i
++)
2831 asection
*s
, *head
, *group
;
2834 head
= groups
.head
[i
];
2836 for (s
= head
; s
!= NULL
; s
= elf_next_in_group (s
))
2837 size
+= (s
->flags
& SEC_RELOC
) != 0 ? 8 : 4;
2839 group
= elf_sec_group (head
);
2840 subseg_set (group
, 0);
2841 bfd_set_section_size (group
, size
);
2842 group
->contents
= (unsigned char *) frag_more (size
);
2843 frag_now
->fr_fix
= frag_now_fix_octets ();
2844 frag_wane (frag_now
);
2848 htab_traverse (groups
.indexes
, free_section_idx
, NULL
);
2849 htab_delete (groups
.indexes
);
2851 #ifdef NEED_ECOFF_DEBUG
2852 if (ECOFF_DEBUGGING
)
2853 /* Generate the ECOFF debugging information. */
2855 const struct ecoff_debug_swap
*debug_swap
;
2856 struct ecoff_debug_info debug
;
2861 = get_elf_backend_data (stdoutput
)->elf_backend_ecoff_debug_swap
;
2862 know (debug_swap
!= NULL
);
2863 ecoff_build_debug (&debug
.symbolic_header
, &buf
, debug_swap
);
2865 /* Set up the pointers in debug. */
2866 #define SET(ptr, offset, type) \
2867 debug.ptr = (type) (buf + debug.symbolic_header.offset)
2869 SET (line
, cbLineOffset
, unsigned char *);
2870 SET (external_dnr
, cbDnOffset
, void *);
2871 SET (external_pdr
, cbPdOffset
, void *);
2872 SET (external_sym
, cbSymOffset
, void *);
2873 SET (external_opt
, cbOptOffset
, void *);
2874 SET (external_aux
, cbAuxOffset
, union aux_ext
*);
2875 SET (ss
, cbSsOffset
, char *);
2876 SET (external_fdr
, cbFdOffset
, void *);
2877 SET (external_rfd
, cbRfdOffset
, void *);
2878 /* ssext and external_ext are set up just below. */
2882 /* Set up the external symbols. */
2883 debug
.ssext
= debug
.ssext_end
= NULL
;
2884 debug
.external_ext
= debug
.external_ext_end
= NULL
;
2885 if (! bfd_ecoff_debug_externals (stdoutput
, &debug
, debug_swap
, TRUE
,
2886 elf_get_extr
, elf_set_index
))
2887 as_fatal (_("failed to set up debugging information: %s"),
2888 bfd_errmsg (bfd_get_error ()));
2890 sec
= bfd_get_section_by_name (stdoutput
, ".mdebug");
2891 gas_assert (sec
!= NULL
);
2893 know (!stdoutput
->output_has_begun
);
2895 /* We set the size of the section, call bfd_set_section_contents
2896 to force the ELF backend to allocate a file position, and then
2897 write out the data. FIXME: Is this really the best way to do
2899 bfd_set_section_size (sec
, bfd_ecoff_debug_size (stdoutput
, &debug
,
2902 /* Pass BUF to bfd_set_section_contents because this will
2903 eventually become a call to fwrite, and ISO C prohibits
2904 passing a NULL pointer to a stdio function even if the
2905 pointer will not be used. */
2906 if (! bfd_set_section_contents (stdoutput
, sec
, buf
, 0, 0))
2907 as_fatal (_("can't start writing .mdebug section: %s"),
2908 bfd_errmsg (bfd_get_error ()));
2910 know (stdoutput
->output_has_begun
);
2911 know (sec
->filepos
!= 0);
2913 if (! bfd_ecoff_write_debug (stdoutput
, &debug
, debug_swap
,
2915 as_fatal (_("could not write .mdebug section: %s"),
2916 bfd_errmsg (bfd_get_error ()));
2918 #endif /* NEED_ECOFF_DEBUG */
2922 elf_generate_asm_lineno (void)
2924 #ifdef NEED_ECOFF_DEBUG
2925 if (ECOFF_DEBUGGING
)
2926 ecoff_generate_asm_lineno ();
2931 elf_process_stab (segT sec ATTRIBUTE_UNUSED
,
2932 int what ATTRIBUTE_UNUSED
,
2933 const char *string ATTRIBUTE_UNUSED
,
2934 int type ATTRIBUTE_UNUSED
,
2935 int other ATTRIBUTE_UNUSED
,
2936 int desc ATTRIBUTE_UNUSED
)
2938 #ifdef NEED_ECOFF_DEBUG
2939 if (ECOFF_DEBUGGING
)
2940 ecoff_stab (sec
, what
, string
, type
, other
, desc
);
2945 elf_separate_stab_sections (void)
2947 #ifdef NEED_ECOFF_DEBUG
2948 return (!ECOFF_DEBUGGING
);
2955 elf_init_stab_section (segT seg
)
2957 #ifdef NEED_ECOFF_DEBUG
2958 if (!ECOFF_DEBUGGING
)
2960 obj_elf_init_stab_section (seg
);
2963 const struct format_ops elf_format_ops
=
2965 bfd_target_elf_flavour
,
2966 0, /* dfl_leading_underscore */
2967 1, /* emit_section_symbols */
2972 elf_frob_file_before_adjust
,
2973 0, /* obj_frob_file_before_fix */
2974 elf_frob_file_after_relocs
,
2975 elf_s_get_size
, elf_s_set_size
,
2976 elf_s_get_align
, elf_s_set_align
,
2983 elf_copy_symbol_attributes
,
2984 elf_generate_asm_lineno
,
2986 elf_separate_stab_sections
,
2987 elf_init_stab_section
,
2988 elf_sec_sym_ok_for_reloc
,
2990 #ifdef NEED_ECOFF_DEBUG
2993 0, /* ecoff_set_ext */
2995 elf_obj_read_begin_hook
,
2996 elf_obj_symbol_new_hook
,