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
, 0, NULL
);
275 symbol_set_frag (sym
, &zero_address_frag
);
277 name_length
= strlen (s
);
278 if (name_length
> strlen (S_GET_NAME (sym
)))
280 obstack_grow (¬es
, s
, name_length
+ 1);
281 S_SET_NAME (sym
, (const char *) obstack_finish (¬es
));
284 strcpy ((char *) S_GET_NAME (sym
), s
);
286 symbol_get_bfdsym (sym
)->flags
|= BSF_FILE
;
288 if (symbol_rootP
!= sym
289 && ((bsym
= symbol_get_bfdsym (symbol_rootP
)) == NULL
290 || (bsym
->flags
& BSF_FILE
) == 0))
292 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
293 symbol_insert (sym
, symbol_rootP
, &symbol_rootP
, &symbol_lastP
);
297 verify_symbol_chain (symbol_rootP
, symbol_lastP
);
301 #ifdef NEED_ECOFF_DEBUG
302 ecoff_new_file (s
, appfile
);
306 /* Called from read.c:s_comm after we've parsed .comm symbol, size.
307 Parse a possible alignment value. */
310 elf_common_parse (int ignore ATTRIBUTE_UNUSED
, symbolS
*symbolP
, addressT size
)
313 int is_local
= symbol_get_obj (symbolP
)->local
;
315 if (*input_line_pointer
== ',')
317 char *save
= input_line_pointer
;
319 input_line_pointer
++;
322 if (*input_line_pointer
== '"')
324 /* For sparc. Accept .common symbol, length, "bss" */
325 input_line_pointer
++;
326 /* Some use the dot, some don't. */
327 if (*input_line_pointer
== '.')
328 input_line_pointer
++;
329 /* Some say data, some say bss. */
330 if (strncmp (input_line_pointer
, "bss\"", 4) == 0)
331 input_line_pointer
+= 4;
332 else if (strncmp (input_line_pointer
, "data\"", 5) == 0)
333 input_line_pointer
+= 5;
336 char *p
= input_line_pointer
;
341 while (!is_end_of_line
[(unsigned char) *input_line_pointer
])
342 if (*input_line_pointer
++ == '"')
344 c
= *input_line_pointer
;
345 *input_line_pointer
= '\0';
346 as_bad (_("bad .common segment %s"), p
);
347 *input_line_pointer
= c
;
348 ignore_rest_of_line ();
351 /* ??? Don't ask me why these are always global. */
356 input_line_pointer
= save
;
357 align
= parse_align (is_local
);
358 if (align
== (addressT
) -1)
365 bss_alloc (symbolP
, size
, align
);
366 S_CLEAR_EXTERNAL (symbolP
);
370 S_SET_VALUE (symbolP
, size
);
371 S_SET_ALIGN (symbolP
, align
);
372 S_SET_EXTERNAL (symbolP
);
373 S_SET_SEGMENT (symbolP
, elf_com_section_ptr
);
376 symbol_get_bfdsym (symbolP
)->flags
|= BSF_OBJECT
;
382 obj_elf_common (int is_common
)
384 if (flag_mri
&& is_common
)
387 s_comm_internal (0, elf_common_parse
);
391 obj_elf_tls_common (int ignore ATTRIBUTE_UNUSED
)
393 symbolS
*symbolP
= s_comm_internal (0, elf_common_parse
);
396 symbol_get_bfdsym (symbolP
)->flags
|= BSF_THREAD_LOCAL
;
400 obj_elf_lcomm (int ignore ATTRIBUTE_UNUSED
)
402 symbolS
*symbolP
= s_comm_internal (0, s_lcomm_internal
);
405 symbol_get_bfdsym (symbolP
)->flags
|= BSF_OBJECT
;
409 get_sym_from_input_line_and_check (void)
415 c
= get_symbol_name (& name
);
416 sym
= symbol_find_or_make (name
);
417 *input_line_pointer
= c
;
418 SKIP_WHITESPACE_AFTER_NAME ();
420 /* There is no symbol name if input_line_pointer has not moved. */
421 if (name
== input_line_pointer
)
422 as_bad (_("Missing symbol name in directive"));
427 obj_elf_local (int ignore ATTRIBUTE_UNUSED
)
434 symbolP
= get_sym_from_input_line_and_check ();
435 c
= *input_line_pointer
;
436 S_CLEAR_EXTERNAL (symbolP
);
437 symbol_get_obj (symbolP
)->local
= 1;
440 input_line_pointer
++;
442 if (*input_line_pointer
== '\n')
447 demand_empty_rest_of_line ();
451 obj_elf_weak (int ignore ATTRIBUTE_UNUSED
)
458 symbolP
= get_sym_from_input_line_and_check ();
459 c
= *input_line_pointer
;
460 S_SET_WEAK (symbolP
);
463 input_line_pointer
++;
465 if (*input_line_pointer
== '\n')
470 demand_empty_rest_of_line ();
474 obj_elf_visibility (int visibility
)
479 elf_symbol_type
*elfsym
;
483 symbolP
= get_sym_from_input_line_and_check ();
485 bfdsym
= symbol_get_bfdsym (symbolP
);
486 elfsym
= elf_symbol_from (bfd_asymbol_bfd (bfdsym
), bfdsym
);
490 elfsym
->internal_elf_sym
.st_other
&= ~3;
491 elfsym
->internal_elf_sym
.st_other
|= visibility
;
493 c
= *input_line_pointer
;
496 input_line_pointer
++;
500 if (*input_line_pointer
== '\n')
506 demand_empty_rest_of_line ();
509 static segT previous_section
;
510 static int previous_subsection
;
514 struct section_stack
*next
;
516 int subseg
, prev_subseg
;
519 static struct section_stack
*section_stack
;
521 /* Match both section group name and the sh_info field. */
524 const char *group_name
;
529 get_section (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
, void *inf
)
531 struct section_match
*match
= (struct section_match
*) inf
;
532 const char *gname
= match
->group_name
;
533 const char *group_name
= elf_group_name (sec
);
534 unsigned int info
= elf_section_data (sec
)->this_hdr
.sh_info
;
536 return (info
== match
->info
537 && (group_name
== gname
538 || (group_name
!= NULL
540 && strcmp (group_name
, gname
) == 0)));
543 /* Handle the .section pseudo-op. This code supports two different
546 The first is found on Solaris, and looks like
547 .section ".sec1",#alloc,#execinstr,#write
548 Here the names after '#' are the SHF_* flags to turn on for the
549 section. I'm not sure how it determines the SHT_* type (BFD
550 doesn't really give us control over the type, anyhow).
552 The second format is found on UnixWare, and probably most SVR4
553 machines, and looks like
554 .section .sec1,"a",@progbits
555 The quoted string may contain any combination of a, w, x, and
556 represents the SHF_* flags to turn on for the section. The string
557 beginning with '@' can be progbits or nobits. There should be
558 other possibilities, but I don't know what they are. In any case,
559 BFD doesn't really let us set the section type. */
562 obj_elf_change_section (const char *name
,
567 const char *group_name
,
574 const struct elf_backend_data
*bed
;
575 const struct bfd_elf_special_section
*ssect
;
576 struct section_match match
;
578 #ifdef md_flush_pending_output
579 md_flush_pending_output ();
582 /* Switch to the section, creating it if necessary. */
585 struct section_stack
*elt
;
586 elt
= XNEW (struct section_stack
);
587 elt
->next
= section_stack
;
589 elt
->prev_seg
= previous_section
;
590 elt
->subseg
= now_subseg
;
591 elt
->prev_subseg
= previous_subsection
;
594 previous_section
= now_seg
;
595 previous_subsection
= now_subseg
;
597 match
.group_name
= group_name
;
599 old_sec
= bfd_get_section_by_name_if (stdoutput
, name
, get_section
,
607 sec
= subseg_force_new (name
, 0);
609 bed
= get_elf_backend_data (stdoutput
);
610 ssect
= (*bed
->get_sec_type_attr
) (stdoutput
, sec
);
614 bfd_boolean override
= FALSE
;
616 if (type
== SHT_NULL
)
618 else if (type
!= ssect
->type
)
621 /* Some older versions of gcc will emit
623 .section .init_array,"aw",@progbits
625 for __attribute__ ((section (".init_array"))).
626 "@progbits" is incorrect. Also for x86-64 large bss
627 sections, some older versions of gcc will emit
629 .section .lbss,"aw",@progbits
631 "@progbits" is incorrect. */
633 && (bed
->s
->arch_size
!= 64
634 || !(ssect
->attr
& SHF_X86_64_LARGE
))
636 && ssect
->type
!= SHT_INIT_ARRAY
637 && ssect
->type
!= SHT_FINI_ARRAY
638 && ssect
->type
!= SHT_PREINIT_ARRAY
)
640 /* We allow to specify any type for a .note section. */
641 if (ssect
->type
!= SHT_NOTE
642 /* Processor and application defined types are allowed too. */
643 && type
< SHT_LOPROC
)
644 as_warn (_("setting incorrect section type for %s"),
649 as_warn (_("ignoring incorrect section type for %s"),
655 if (old_sec
== NULL
&& ((attr
& ~(SHF_MASKOS
| SHF_MASKPROC
))
656 & ~ssect
->attr
) != 0)
658 /* As a GNU extension, we permit a .note section to be
659 allocatable. If the linker sees an allocatable .note
660 section, it will create a PT_NOTE segment in the output
661 file. We also allow "x" for .note.GNU-stack. */
662 if (ssect
->type
== SHT_NOTE
663 && (attr
== SHF_ALLOC
|| attr
== SHF_EXECINSTR
))
665 /* Allow different SHF_MERGE and SHF_STRINGS if we have
666 something like .rodata.str. */
667 else if (ssect
->suffix_length
== -2
668 && name
[ssect
->prefix_length
] == '.'
672 & ~SHF_STRINGS
) == 0)
674 /* .interp, .strtab and .symtab can have SHF_ALLOC. */
675 else if (attr
== SHF_ALLOC
676 && (strcmp (name
, ".interp") == 0
677 || strcmp (name
, ".strtab") == 0
678 || strcmp (name
, ".symtab") == 0))
680 /* .note.GNU-stack can have SHF_EXECINSTR. */
681 else if (attr
== SHF_EXECINSTR
682 && strcmp (name
, ".note.GNU-stack") == 0)
685 /* A section on Alpha may have SHF_ALPHA_GPREL. */
686 else if ((attr
& ~ssect
->attr
) == SHF_ALPHA_GPREL
)
690 else if (attr
== (SHF_EXECINSTR
| SHF_WRITE
| SHF_ALLOC
)
691 && (ssect
->type
== SHT_INIT_ARRAY
692 || ssect
->type
== SHT_FINI_ARRAY
693 || ssect
->type
== SHT_PREINIT_ARRAY
))
694 /* RX init/fini arrays can and should have the "awx" attributes set. */
699 if (group_name
== NULL
)
700 as_warn (_("setting incorrect section attributes for %s"),
706 if (!override
&& old_sec
== NULL
)
710 /* Convert ELF type and flags to BFD flags. */
712 | ((attr
& SHF_WRITE
) ? 0 : SEC_READONLY
)
713 | ((attr
& SHF_ALLOC
) ? SEC_ALLOC
: 0)
714 | (((attr
& SHF_ALLOC
) && type
!= SHT_NOBITS
) ? SEC_LOAD
: 0)
715 | ((attr
& SHF_EXECINSTR
) ? SEC_CODE
: 0)
716 | ((attr
& SHF_MERGE
) ? SEC_MERGE
: 0)
717 | ((attr
& SHF_STRINGS
) ? SEC_STRINGS
: 0)
718 | ((attr
& SHF_EXCLUDE
) ? SEC_EXCLUDE
: 0)
719 | ((attr
& SHF_TLS
) ? SEC_THREAD_LOCAL
: 0));
720 #ifdef md_elf_section_flags
721 flags
= md_elf_section_flags (flags
, attr
, type
);
725 flags
|= SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_DISCARD
;
731 if (type
== SHT_NULL
)
732 type
= bfd_elf_get_default_section_type (flags
);
733 elf_section_type (sec
) = type
;
734 elf_section_flags (sec
) = attr
;
735 elf_section_data (sec
)->this_hdr
.sh_info
= info
;
737 /* Prevent SEC_HAS_CONTENTS from being inadvertently set. */
738 if (type
== SHT_NOBITS
)
739 seg_info (sec
)->bss
= 1;
741 bfd_set_section_flags (sec
, flags
);
742 if (flags
& SEC_MERGE
)
743 sec
->entsize
= entsize
;
744 elf_group_name (sec
) = group_name
;
746 /* Add a symbol for this section to the symbol table. */
747 secsym
= symbol_find (name
);
749 symbol_set_bfdsym (secsym
, sec
->symbol
);
751 symbol_table_insert (section_symbol (sec
));
756 && (unsigned) type
!= elf_section_type (old_sec
))
757 as_warn (_("ignoring changed section type for %s"), name
);
761 /* If section attributes are specified the second time we see a
762 particular section, then check that they are the same as we
763 saw the first time. */
764 if (((old_sec
->flags
^ flags
)
765 & (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
| SEC_CODE
766 | SEC_EXCLUDE
| SEC_SORT_ENTRIES
| SEC_MERGE
| SEC_STRINGS
767 | SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_DISCARD
768 | SEC_THREAD_LOCAL
)))
769 as_warn (_("ignoring changed section attributes for %s"), name
);
771 /* FIXME: Maybe we should consider removing a previously set
772 processor or application specific attribute as suspicious ? */
773 elf_section_flags (sec
) = attr
;
775 if ((flags
& SEC_MERGE
) && old_sec
->entsize
!= (unsigned) entsize
)
776 as_warn (_("ignoring changed section entity size for %s"), name
);
780 #ifdef md_elf_section_change_hook
781 md_elf_section_change_hook ();
786 obj_elf_parse_section_letters (char *str
, size_t len
,
787 bfd_boolean
*is_clone
, bfd_vma
*gnu_attr
)
806 attr
|= SHF_EXECINSTR
;
821 *gnu_attr
|= SHF_GNU_MBIND
;
828 if (*(str
- 1) == 'a')
831 if (len
> 1 && str
[1] == 's')
841 const char *bad_msg
= _("unrecognized .section attribute:"
842 " want a,e,w,x,M,S,G,T or number");
843 #ifdef md_elf_section_letter
844 bfd_vma md_attr
= md_elf_section_letter (*str
, &bad_msg
);
845 if (md_attr
!= (bfd_vma
) -1)
853 attr
|= strtoul (str
, & end
, 0);
854 /* Update str and len, allowing for the fact that
855 we will execute str++ and len-- below. */
861 as_fatal ("%s", bad_msg
);
872 obj_elf_section_type (char *str
, size_t len
, bfd_boolean warn
)
874 if (len
== 8 && strncmp (str
, "progbits", 8) == 0)
876 if (len
== 6 && strncmp (str
, "nobits", 6) == 0)
878 if (len
== 4 && strncmp (str
, "note", 4) == 0)
880 if (len
== 10 && strncmp (str
, "init_array", 10) == 0)
881 return SHT_INIT_ARRAY
;
882 if (len
== 10 && strncmp (str
, "fini_array", 10) == 0)
883 return SHT_FINI_ARRAY
;
884 if (len
== 13 && strncmp (str
, "preinit_array", 13) == 0)
885 return SHT_PREINIT_ARRAY
;
887 #ifdef md_elf_section_type
889 int md_type
= md_elf_section_type (str
, len
);
898 int type
= strtoul (str
, & end
, 0);
900 if (warn
&& (size_t) (end
- str
) != len
)
901 as_warn (_("extraneous characters at end of numeric section type"));
907 as_warn (_("unrecognized section type"));
912 obj_elf_section_word (char *str
, size_t len
, int *type
)
916 if (len
== 5 && strncmp (str
, "write", 5) == 0)
918 if (len
== 5 && strncmp (str
, "alloc", 5) == 0)
920 if (len
== 9 && strncmp (str
, "execinstr", 9) == 0)
921 return SHF_EXECINSTR
;
922 if (len
== 7 && strncmp (str
, "exclude", 7) == 0)
924 if (len
== 3 && strncmp (str
, "tls", 3) == 0)
927 #ifdef md_elf_section_word
929 bfd_vma md_attr
= md_elf_section_word (str
, len
);
935 ret
= obj_elf_section_type (str
, len
, FALSE
);
939 as_warn (_("unrecognized section attribute"));
944 /* Get name of section. */
946 obj_elf_section_name (void)
951 if (*input_line_pointer
== '"')
955 name
= demand_copy_C_string (&dummy
);
958 ignore_rest_of_line ();
964 char *end
= input_line_pointer
;
966 while (0 == strchr ("\n\t,; ", *end
))
968 if (end
== input_line_pointer
)
970 as_bad (_("missing name"));
971 ignore_rest_of_line ();
975 name
= xmemdup0 (input_line_pointer
, end
- input_line_pointer
);
977 while (flag_sectname_subst
)
979 char *subst
= strchr (name
, '%');
980 if (subst
&& subst
[1] == 'S')
982 int oldlen
= strlen (name
);
983 int substlen
= strlen (now_seg
->name
);
984 int newlen
= oldlen
- 2 + substlen
;
985 char *newname
= XNEWVEC (char, newlen
+ 1);
986 int headlen
= subst
- name
;
987 memcpy (newname
, name
, headlen
);
988 strcpy (newname
+ headlen
, now_seg
->name
);
989 strcat (newname
+ headlen
, subst
+ 2);
997 #ifdef tc_canonicalize_section_name
998 name
= tc_canonicalize_section_name (name
);
1000 input_line_pointer
= end
;
1007 obj_elf_section (int push
)
1009 const char *name
, *group_name
;
1016 subsegT new_subsection
= -1;
1017 unsigned int info
= 0;
1023 #ifdef md_flush_pending_output
1024 md_flush_pending_output ();
1027 previous_section
= now_seg
;
1028 previous_subsection
= now_subseg
;
1030 s_mri_sect (&mri_type
);
1032 #ifdef md_elf_section_change_hook
1033 md_elf_section_change_hook ();
1039 name
= obj_elf_section_name ();
1044 if ((sym
= symbol_find (name
)) != NULL
1045 && ! symbol_section_p (sym
)
1046 && S_IS_DEFINED (sym
)
1047 && ! S_IS_VOLATILE (sym
)
1048 && ! S_CAN_BE_REDEFINED (sym
))
1050 as_bad (_("section name '%s' already defined as another symbol"), name
);
1051 ignore_rest_of_line ();
1061 if (*input_line_pointer
== ',')
1063 /* Skip the comma. */
1064 ++input_line_pointer
;
1067 if (push
&& ISDIGIT (*input_line_pointer
))
1069 /* .pushsection has an optional subsection. */
1070 new_subsection
= (subsegT
) get_absolute_expression ();
1074 /* Stop if we don't see a comma. */
1075 if (*input_line_pointer
!= ',')
1078 /* Skip the comma. */
1079 ++input_line_pointer
;
1083 if (*input_line_pointer
== '"')
1085 bfd_boolean is_clone
;
1087 beg
= demand_copy_C_string (&dummy
);
1090 ignore_rest_of_line ();
1093 attr
|= obj_elf_parse_section_letters (beg
, strlen (beg
),
1094 &is_clone
, &gnu_attr
);
1097 if (*input_line_pointer
== ',')
1100 char *save
= input_line_pointer
;
1102 ++input_line_pointer
;
1104 c
= *input_line_pointer
;
1107 beg
= demand_copy_C_string (&dummy
);
1110 ignore_rest_of_line ();
1113 type
= obj_elf_section_type (beg
, strlen (beg
), TRUE
);
1115 else if (c
== '@' || c
== '%')
1117 ++input_line_pointer
;
1119 if (ISDIGIT (* input_line_pointer
))
1120 type
= strtoul (input_line_pointer
, &input_line_pointer
, 0);
1123 c
= get_symbol_name (& beg
);
1124 (void) restore_line_pointer (c
);
1125 type
= obj_elf_section_type (beg
,
1126 input_line_pointer
- beg
,
1131 input_line_pointer
= save
;
1135 if ((attr
& SHF_MERGE
) != 0 && *input_line_pointer
== ',')
1137 ++input_line_pointer
;
1139 entsize
= get_absolute_expression ();
1143 as_warn (_("invalid merge entity size"));
1148 else if ((attr
& SHF_MERGE
) != 0)
1150 as_warn (_("entity size for SHF_MERGE not specified"));
1154 if ((attr
& SHF_GROUP
) != 0 && is_clone
)
1156 as_warn (_("? section flag ignored with G present"));
1159 if ((attr
& SHF_GROUP
) != 0 && *input_line_pointer
== ',')
1161 ++input_line_pointer
;
1162 group_name
= obj_elf_section_name ();
1163 if (group_name
== NULL
)
1165 else if (*input_line_pointer
== ',')
1167 ++input_line_pointer
;
1169 if (strncmp (input_line_pointer
, "comdat", 6) == 0)
1171 input_line_pointer
+= 6;
1175 else if (strncmp (name
, ".gnu.linkonce", 13) == 0)
1178 else if ((attr
& SHF_GROUP
) != 0)
1180 as_warn (_("group name for SHF_GROUP not specified"));
1186 const char *now_group
= elf_group_name (now_seg
);
1187 if (now_group
!= NULL
)
1189 group_name
= xstrdup (now_group
);
1190 linkonce
= (now_seg
->flags
& SEC_LINK_ONCE
) != 0;
1194 if ((gnu_attr
& SHF_GNU_MBIND
) != 0 && *input_line_pointer
== ',')
1196 ++input_line_pointer
;
1198 if (ISDIGIT (* input_line_pointer
))
1200 char *t
= input_line_pointer
;
1201 info
= strtoul (input_line_pointer
,
1202 &input_line_pointer
, 0);
1203 if (info
== (unsigned int) -1)
1205 as_warn (_("unsupported mbind section info: %s"), t
);
1218 if (*input_line_pointer
!= '#')
1220 as_bad (_("character following name is not '#'"));
1221 ignore_rest_of_line ();
1224 ++input_line_pointer
;
1225 c
= get_symbol_name (& beg
);
1226 (void) restore_line_pointer (c
);
1228 attr
|= obj_elf_section_word (beg
, input_line_pointer
- beg
,
1233 while (*input_line_pointer
++ == ',');
1234 --input_line_pointer
;
1239 demand_empty_rest_of_line ();
1241 obj_elf_change_section (name
, type
, info
, attr
, entsize
, group_name
,
1244 if ((gnu_attr
& SHF_GNU_MBIND
) != 0)
1246 struct elf_backend_data
*bed
;
1248 if ((attr
& SHF_ALLOC
) == 0)
1249 as_bad (_("SHF_ALLOC isn't set for GNU_MBIND section: %s"), name
);
1251 bed
= (struct elf_backend_data
*) get_elf_backend_data (stdoutput
);
1252 if (bed
->elf_osabi
== ELFOSABI_NONE
)
1253 bed
->elf_osabi
= ELFOSABI_GNU
;
1254 else if (bed
->elf_osabi
!= ELFOSABI_GNU
1255 && bed
->elf_osabi
!= ELFOSABI_FREEBSD
)
1256 as_bad (_("GNU_MBIND section is supported only by GNU "
1257 "and FreeBSD targets"));
1258 elf_tdata (stdoutput
)->has_gnu_osabi
|= elf_gnu_osabi_mbind
;
1260 elf_section_flags (now_seg
) |= gnu_attr
;
1262 if (push
&& new_subsection
!= -1)
1263 subseg_set (now_seg
, new_subsection
);
1266 /* Change to the .data section. */
1269 obj_elf_data (int i
)
1271 #ifdef md_flush_pending_output
1272 md_flush_pending_output ();
1275 previous_section
= now_seg
;
1276 previous_subsection
= now_subseg
;
1279 #ifdef md_elf_section_change_hook
1280 md_elf_section_change_hook ();
1284 /* Change to the .text section. */
1287 obj_elf_text (int i
)
1289 #ifdef md_flush_pending_output
1290 md_flush_pending_output ();
1293 previous_section
= now_seg
;
1294 previous_subsection
= now_subseg
;
1297 #ifdef md_elf_section_change_hook
1298 md_elf_section_change_hook ();
1302 /* Change to the *ABS* section. */
1305 obj_elf_struct (int i
)
1307 #ifdef md_flush_pending_output
1308 md_flush_pending_output ();
1311 previous_section
= now_seg
;
1312 previous_subsection
= now_subseg
;
1315 #ifdef md_elf_section_change_hook
1316 md_elf_section_change_hook ();
1321 obj_elf_subsection (int ignore ATTRIBUTE_UNUSED
)
1325 #ifdef md_flush_pending_output
1326 md_flush_pending_output ();
1329 previous_section
= now_seg
;
1330 previous_subsection
= now_subseg
;
1332 temp
= get_absolute_expression ();
1333 subseg_set (now_seg
, (subsegT
) temp
);
1334 demand_empty_rest_of_line ();
1336 #ifdef md_elf_section_change_hook
1337 md_elf_section_change_hook ();
1341 /* This can be called from the processor backends if they change
1345 obj_elf_section_change_hook (void)
1347 previous_section
= now_seg
;
1348 previous_subsection
= now_subseg
;
1352 obj_elf_previous (int ignore ATTRIBUTE_UNUSED
)
1357 if (previous_section
== 0)
1359 as_warn (_(".previous without corresponding .section; ignored"));
1363 #ifdef md_flush_pending_output
1364 md_flush_pending_output ();
1367 new_section
= previous_section
;
1368 new_subsection
= previous_subsection
;
1369 previous_section
= now_seg
;
1370 previous_subsection
= now_subseg
;
1371 subseg_set (new_section
, new_subsection
);
1373 #ifdef md_elf_section_change_hook
1374 md_elf_section_change_hook ();
1379 obj_elf_popsection (int xxx ATTRIBUTE_UNUSED
)
1381 struct section_stack
*top
= section_stack
;
1385 as_warn (_(".popsection without corresponding .pushsection; ignored"));
1389 #ifdef md_flush_pending_output
1390 md_flush_pending_output ();
1393 section_stack
= top
->next
;
1394 previous_section
= top
->prev_seg
;
1395 previous_subsection
= top
->prev_subseg
;
1396 subseg_set (top
->seg
, top
->subseg
);
1399 #ifdef md_elf_section_change_hook
1400 md_elf_section_change_hook ();
1405 obj_elf_line (int ignore ATTRIBUTE_UNUSED
)
1407 /* Assume delimiter is part of expression. BSD4.2 as fails with
1408 delightful bug, so we are not being incompatible here. */
1409 new_logical_line (NULL
, get_absolute_expression ());
1410 demand_empty_rest_of_line ();
1413 /* This handles the .symver pseudo-op, which is used to specify a
1414 symbol version. The syntax is ``.symver NAME,SYMVERNAME''.
1415 SYMVERNAME may contain ELF_VER_CHR ('@') characters. This
1416 pseudo-op causes the assembler to emit a symbol named SYMVERNAME
1417 with the same value as the symbol NAME. */
1420 obj_elf_symver (int ignore ATTRIBUTE_UNUSED
)
1427 sym
= get_sym_from_input_line_and_check ();
1429 if (*input_line_pointer
!= ',')
1431 as_bad (_("expected comma after name in .symver"));
1432 ignore_rest_of_line ();
1436 ++input_line_pointer
;
1439 /* Temporarily include '@' in symbol names. */
1440 old_lexat
= lex_type
[(unsigned char) '@'];
1441 lex_type
[(unsigned char) '@'] |= LEX_NAME
;
1442 c
= get_symbol_name (& name
);
1443 lex_type
[(unsigned char) '@'] = old_lexat
;
1445 if (S_IS_COMMON (sym
))
1447 as_bad (_("`%s' can't be versioned to common symbol '%s'"),
1448 name
, S_GET_NAME (sym
));
1449 ignore_rest_of_line ();
1453 if (symbol_get_obj (sym
)->versioned_name
== NULL
)
1455 symbol_get_obj (sym
)->versioned_name
= xstrdup (name
);
1457 (void) restore_line_pointer (c
);
1459 if (strchr (symbol_get_obj (sym
)->versioned_name
,
1460 ELF_VER_CHR
) == NULL
)
1462 as_bad (_("missing version name in `%s' for symbol `%s'"),
1463 symbol_get_obj (sym
)->versioned_name
,
1465 ignore_rest_of_line ();
1471 if (strcmp (symbol_get_obj (sym
)->versioned_name
, name
))
1473 as_bad (_("multiple versions [`%s'|`%s'] for symbol `%s'"),
1474 name
, symbol_get_obj (sym
)->versioned_name
,
1476 ignore_rest_of_line ();
1480 (void) restore_line_pointer (c
);
1483 demand_empty_rest_of_line ();
1486 /* This handles the .vtable_inherit pseudo-op, which is used to indicate
1487 to the linker the hierarchy in which a particular table resides. The
1488 syntax is ".vtable_inherit CHILDNAME, PARENTNAME". */
1491 obj_elf_get_vtable_inherit (void)
1493 char *cname
, *pname
;
1494 symbolS
*csym
, *psym
;
1497 if (*input_line_pointer
== '#')
1498 ++input_line_pointer
;
1500 c
= get_symbol_name (& cname
);
1501 csym
= symbol_find (cname
);
1503 /* GCFIXME: should check that we don't have two .vtable_inherits for
1504 the same child symbol. Also, we can currently only do this if the
1505 child symbol is already exists and is placed in a fragment. */
1507 if (csym
== NULL
|| symbol_get_frag (csym
) == NULL
)
1509 as_bad (_("expected `%s' to have already been set for .vtable_inherit"),
1514 *input_line_pointer
= c
;
1516 SKIP_WHITESPACE_AFTER_NAME ();
1517 if (*input_line_pointer
!= ',')
1519 as_bad (_("expected comma after name in .vtable_inherit"));
1520 ignore_rest_of_line ();
1524 ++input_line_pointer
;
1527 if (*input_line_pointer
== '#')
1528 ++input_line_pointer
;
1530 if (input_line_pointer
[0] == '0'
1531 && (input_line_pointer
[1] == '\0'
1532 || ISSPACE (input_line_pointer
[1])))
1534 psym
= section_symbol (absolute_section
);
1535 ++input_line_pointer
;
1539 c
= get_symbol_name (& pname
);
1540 psym
= symbol_find_or_make (pname
);
1541 restore_line_pointer (c
);
1544 demand_empty_rest_of_line ();
1549 gas_assert (symbol_get_value_expression (csym
)->X_op
== O_constant
);
1550 return fix_new (symbol_get_frag (csym
),
1551 symbol_get_value_expression (csym
)->X_add_number
,
1552 0, psym
, 0, 0, BFD_RELOC_VTABLE_INHERIT
);
1555 /* This is a version of obj_elf_get_vtable_inherit() that is
1556 suitable for use in struct _pseudo_type tables. */
1559 obj_elf_vtable_inherit (int ignore ATTRIBUTE_UNUSED
)
1561 (void) obj_elf_get_vtable_inherit ();
1564 /* This handles the .vtable_entry pseudo-op, which is used to indicate
1565 to the linker that a vtable slot was used. The syntax is
1566 ".vtable_entry tablename, offset". */
1569 obj_elf_get_vtable_entry (void)
1574 if (*input_line_pointer
== '#')
1575 ++input_line_pointer
;
1577 sym
= get_sym_from_input_line_and_check ();
1578 if (*input_line_pointer
!= ',')
1580 as_bad (_("expected comma after name in .vtable_entry"));
1581 ignore_rest_of_line ();
1585 ++input_line_pointer
;
1586 if (*input_line_pointer
== '#')
1587 ++input_line_pointer
;
1589 offset
= get_absolute_expression ();
1591 demand_empty_rest_of_line ();
1593 return fix_new (frag_now
, frag_now_fix (), 0, sym
, offset
, 0,
1594 BFD_RELOC_VTABLE_ENTRY
);
1597 /* This is a version of obj_elf_get_vtable_entry() that is
1598 suitable for use in struct _pseudo_type tables. */
1601 obj_elf_vtable_entry (int ignore ATTRIBUTE_UNUSED
)
1603 (void) obj_elf_get_vtable_entry ();
1606 #define skip_whitespace(str) do { if (*(str) == ' ') ++(str); } while (0)
1609 skip_past_char (char ** str
, char c
)
1619 #define skip_past_comma(str) skip_past_char (str, ',')
1621 /* A list of attributes that have been explicitly set by the assembly code.
1622 VENDOR is the vendor id, BASE is the tag shifted right by the number
1623 of bits in MASK, and bit N of MASK is set if tag BASE+N has been set. */
1624 struct recorded_attribute_info
{
1625 struct recorded_attribute_info
*next
;
1630 static struct recorded_attribute_info
*recorded_attributes
;
1632 /* Record that we have seen an explicit specification of attribute TAG
1633 for vendor VENDOR. */
1636 record_attribute (int vendor
, unsigned int tag
)
1640 struct recorded_attribute_info
*rai
;
1642 base
= tag
/ (8 * sizeof (rai
->mask
));
1643 mask
= 1UL << (tag
% (8 * sizeof (rai
->mask
)));
1644 for (rai
= recorded_attributes
; rai
; rai
= rai
->next
)
1645 if (rai
->vendor
== vendor
&& rai
->base
== base
)
1651 rai
= XNEW (struct recorded_attribute_info
);
1652 rai
->next
= recorded_attributes
;
1653 rai
->vendor
= vendor
;
1656 recorded_attributes
= rai
;
1659 /* Return true if we have seen an explicit specification of attribute TAG
1660 for vendor VENDOR. */
1663 obj_elf_seen_attribute (int vendor
, unsigned int tag
)
1667 struct recorded_attribute_info
*rai
;
1669 base
= tag
/ (8 * sizeof (rai
->mask
));
1670 mask
= 1UL << (tag
% (8 * sizeof (rai
->mask
)));
1671 for (rai
= recorded_attributes
; rai
; rai
= rai
->next
)
1672 if (rai
->vendor
== vendor
&& rai
->base
== base
)
1673 return (rai
->mask
& mask
) != 0;
1677 /* Parse an attribute directive for VENDOR.
1678 Returns the attribute number read, or zero on error. */
1681 obj_elf_vendor_attribute (int vendor
)
1689 /* Read the first number or name. */
1690 skip_whitespace (input_line_pointer
);
1691 s
= input_line_pointer
;
1692 if (ISDIGIT (*input_line_pointer
))
1695 if (exp
.X_op
!= O_constant
)
1697 tag
= exp
.X_add_number
;
1703 /* A name may contain '_', but no other punctuation. */
1704 for (; ISALNUM (*input_line_pointer
) || *input_line_pointer
== '_';
1705 ++input_line_pointer
)
1710 name
= xstrndup (s
, i
);
1712 #ifndef CONVERT_SYMBOLIC_ATTRIBUTE
1713 #define CONVERT_SYMBOLIC_ATTRIBUTE(a) -1
1716 tag
= CONVERT_SYMBOLIC_ATTRIBUTE (name
);
1719 as_bad (_("Attribute name not recognised: %s"), name
);
1720 ignore_rest_of_line ();
1727 type
= _bfd_elf_obj_attrs_arg_type (stdoutput
, vendor
, tag
);
1729 if (skip_past_comma (&input_line_pointer
) == -1)
1734 if (exp
.X_op
!= O_constant
)
1736 as_bad (_("expected numeric constant"));
1737 ignore_rest_of_line ();
1740 i
= exp
.X_add_number
;
1743 && skip_past_comma (&input_line_pointer
) == -1)
1745 as_bad (_("expected comma"));
1746 ignore_rest_of_line ();
1753 skip_whitespace (input_line_pointer
);
1754 if (*input_line_pointer
!= '"')
1756 s
= demand_copy_C_string (&len
);
1759 record_attribute (vendor
, tag
);
1763 bfd_elf_add_obj_attr_int_string (stdoutput
, vendor
, tag
, i
, s
);
1766 bfd_elf_add_obj_attr_string (stdoutput
, vendor
, tag
, s
);
1769 bfd_elf_add_obj_attr_int (stdoutput
, vendor
, tag
, i
);
1775 demand_empty_rest_of_line ();
1778 as_bad (_("bad string constant"));
1779 ignore_rest_of_line ();
1782 as_bad (_("expected <tag> , <value>"));
1783 ignore_rest_of_line ();
1787 /* Parse a .gnu_attribute directive. */
1790 obj_elf_gnu_attribute (int ignored ATTRIBUTE_UNUSED
)
1792 obj_elf_vendor_attribute (OBJ_ATTR_GNU
);
1796 elf_obj_read_begin_hook (void)
1798 #ifdef NEED_ECOFF_DEBUG
1799 if (ECOFF_DEBUGGING
)
1800 ecoff_read_begin_hook ();
1805 elf_obj_symbol_new_hook (symbolS
*symbolP
)
1807 struct elf_obj_sy
*sy_obj
;
1809 sy_obj
= symbol_get_obj (symbolP
);
1810 sy_obj
->size
= NULL
;
1811 sy_obj
->versioned_name
= NULL
;
1813 #ifdef NEED_ECOFF_DEBUG
1814 if (ECOFF_DEBUGGING
)
1815 ecoff_symbol_new_hook (symbolP
);
1819 /* When setting one symbol equal to another, by default we probably
1820 want them to have the same "size", whatever it means in the current
1824 elf_copy_symbol_attributes (symbolS
*dest
, symbolS
*src
)
1826 struct elf_obj_sy
*srcelf
= symbol_get_obj (src
);
1827 struct elf_obj_sy
*destelf
= symbol_get_obj (dest
);
1830 if (destelf
->size
== NULL
)
1831 destelf
->size
= XNEW (expressionS
);
1832 *destelf
->size
= *srcelf
->size
;
1836 if (destelf
->size
!= NULL
)
1837 free (destelf
->size
);
1838 destelf
->size
= NULL
;
1840 S_SET_SIZE (dest
, S_GET_SIZE (src
));
1841 /* Don't copy visibility. */
1842 S_SET_OTHER (dest
, (ELF_ST_VISIBILITY (S_GET_OTHER (dest
))
1843 | (S_GET_OTHER (src
) & ~ELF_ST_VISIBILITY (-1))));
1847 obj_elf_version (int ignore ATTRIBUTE_UNUSED
)
1852 asection
*seg
= now_seg
;
1853 subsegT subseg
= now_subseg
;
1854 Elf_Internal_Note i_note
;
1855 Elf_External_Note e_note
;
1856 asection
*note_secp
= NULL
;
1859 if (*input_line_pointer
== '\"')
1863 ++input_line_pointer
; /* -> 1st char of string. */
1864 name
= input_line_pointer
;
1866 while (is_a_char (c
= next_char_of_string ()))
1868 c
= *input_line_pointer
;
1869 *input_line_pointer
= '\0';
1870 *(input_line_pointer
- 1) = '\0';
1871 *input_line_pointer
= c
;
1873 /* Create the .note section. */
1874 note_secp
= subseg_new (".note", 0);
1875 bfd_set_section_flags (note_secp
, SEC_HAS_CONTENTS
| SEC_READONLY
);
1876 record_alignment (note_secp
, 2);
1878 /* Process the version string. */
1879 len
= strlen (name
) + 1;
1881 /* PR 3456: Although the name field is padded out to an 4-byte
1882 boundary, the namesz field should not be adjusted. */
1883 i_note
.namesz
= len
;
1884 i_note
.descsz
= 0; /* No description. */
1885 i_note
.type
= NT_VERSION
;
1886 p
= frag_more (sizeof (e_note
.namesz
));
1887 md_number_to_chars (p
, i_note
.namesz
, sizeof (e_note
.namesz
));
1888 p
= frag_more (sizeof (e_note
.descsz
));
1889 md_number_to_chars (p
, i_note
.descsz
, sizeof (e_note
.descsz
));
1890 p
= frag_more (sizeof (e_note
.type
));
1891 md_number_to_chars (p
, i_note
.type
, sizeof (e_note
.type
));
1892 p
= frag_more (len
);
1893 memcpy (p
, name
, len
);
1895 frag_align (2, 0, 0);
1897 subseg_set (seg
, subseg
);
1900 as_bad (_("expected quoted string"));
1902 demand_empty_rest_of_line ();
1906 obj_elf_size (int ignore ATTRIBUTE_UNUSED
)
1909 char c
= get_symbol_name (&name
);
1914 p
= input_line_pointer
;
1916 SKIP_WHITESPACE_AFTER_NAME ();
1917 if (*input_line_pointer
!= ',')
1920 as_bad (_("expected comma after name `%s' in .size directive"), name
);
1922 ignore_rest_of_line ();
1925 input_line_pointer
++;
1927 if (exp
.X_op
== O_absent
)
1929 as_bad (_("missing expression in .size directive"));
1930 exp
.X_op
= O_constant
;
1931 exp
.X_add_number
= 0;
1934 sym
= symbol_find_or_make (name
);
1936 if (exp
.X_op
== O_constant
)
1938 S_SET_SIZE (sym
, exp
.X_add_number
);
1939 if (symbol_get_obj (sym
)->size
)
1941 xfree (symbol_get_obj (sym
)->size
);
1942 symbol_get_obj (sym
)->size
= NULL
;
1947 symbol_get_obj (sym
)->size
= XNEW (expressionS
);
1948 *symbol_get_obj (sym
)->size
= exp
;
1950 demand_empty_rest_of_line ();
1953 /* Handle the ELF .type pseudo-op. This sets the type of a symbol.
1954 There are six syntaxes:
1956 The first (used on Solaris) is
1958 The second (used on UnixWare) is
1960 The third (reportedly to be used on Irix 6.0) is
1962 The fourth (used on NetBSD/Arm and Linux/ARM) is
1964 The fifth (used on SVR4/860) is
1965 .type SYM,"function"
1966 The sixth (emitted by recent SunPRO under Solaris) is
1968 where the integer is the STT_* value.
1972 obj_elf_type_name (char *cp
)
1976 p
= input_line_pointer
;
1977 if (*input_line_pointer
>= '0'
1978 && *input_line_pointer
<= '9')
1980 while (*input_line_pointer
>= '0'
1981 && *input_line_pointer
<= '9')
1982 ++input_line_pointer
;
1983 *cp
= *input_line_pointer
;
1984 *input_line_pointer
= '\0';
1987 *cp
= get_symbol_name (&p
);
1993 obj_elf_type (int ignore ATTRIBUTE_UNUSED
)
1997 const char *type_name
;
1999 elf_symbol_type
*elfsym
;
2001 sym
= get_sym_from_input_line_and_check ();
2002 c
= *input_line_pointer
;
2003 elfsym
= (elf_symbol_type
*) symbol_get_bfdsym (sym
);
2005 if (*input_line_pointer
== ',')
2006 ++input_line_pointer
;
2009 if ( *input_line_pointer
== '#'
2010 || *input_line_pointer
== '@'
2011 || *input_line_pointer
== '"'
2012 || *input_line_pointer
== '%')
2013 ++input_line_pointer
;
2015 type_name
= obj_elf_type_name (& c
);
2018 if (strcmp (type_name
, "function") == 0
2019 || strcmp (type_name
, "2") == 0
2020 || strcmp (type_name
, "STT_FUNC") == 0)
2021 type
= BSF_FUNCTION
;
2022 else if (strcmp (type_name
, "object") == 0
2023 || strcmp (type_name
, "1") == 0
2024 || strcmp (type_name
, "STT_OBJECT") == 0)
2026 else if (strcmp (type_name
, "tls_object") == 0
2027 || strcmp (type_name
, "6") == 0
2028 || strcmp (type_name
, "STT_TLS") == 0)
2029 type
= BSF_OBJECT
| BSF_THREAD_LOCAL
;
2030 else if (strcmp (type_name
, "notype") == 0
2031 || strcmp (type_name
, "0") == 0
2032 || strcmp (type_name
, "STT_NOTYPE") == 0)
2034 else if (strcmp (type_name
, "common") == 0
2035 || strcmp (type_name
, "5") == 0
2036 || strcmp (type_name
, "STT_COMMON") == 0)
2040 if (! S_IS_COMMON (sym
))
2042 if (S_IS_VOLATILE (sym
))
2044 sym
= symbol_clone (sym
, 1);
2045 S_SET_SEGMENT (sym
, bfd_com_section_ptr
);
2046 S_SET_VALUE (sym
, 0);
2047 S_SET_EXTERNAL (sym
);
2048 symbol_set_frag (sym
, &zero_address_frag
);
2049 S_CLEAR_VOLATILE (sym
);
2051 else if (S_IS_DEFINED (sym
) || symbol_equated_p (sym
))
2052 as_bad (_("symbol '%s' is already defined"), S_GET_NAME (sym
));
2055 /* FIXME: Is it safe to just change the section ? */
2056 S_SET_SEGMENT (sym
, bfd_com_section_ptr
);
2057 S_SET_VALUE (sym
, 0);
2058 S_SET_EXTERNAL (sym
);
2062 else if (strcmp (type_name
, "gnu_indirect_function") == 0
2063 || strcmp (type_name
, "10") == 0
2064 || strcmp (type_name
, "STT_GNU_IFUNC") == 0)
2066 struct elf_backend_data
*bed
;
2068 bed
= (struct elf_backend_data
*) get_elf_backend_data (stdoutput
);
2069 if (bed
->elf_osabi
== ELFOSABI_NONE
)
2070 bed
->elf_osabi
= ELFOSABI_GNU
;
2071 else if (bed
->elf_osabi
!= ELFOSABI_GNU
2072 && bed
->elf_osabi
!= ELFOSABI_FREEBSD
)
2073 as_bad (_("symbol type \"%s\" is supported only by GNU "
2074 "and FreeBSD targets"), type_name
);
2075 elf_tdata (stdoutput
)->has_gnu_osabi
|= elf_gnu_osabi_ifunc
;
2076 type
= BSF_FUNCTION
| BSF_GNU_INDIRECT_FUNCTION
;
2078 else if (strcmp (type_name
, "gnu_unique_object") == 0)
2080 struct elf_backend_data
*bed
;
2082 bed
= (struct elf_backend_data
*) get_elf_backend_data (stdoutput
);
2083 if (bed
->elf_osabi
== ELFOSABI_NONE
)
2084 bed
->elf_osabi
= ELFOSABI_GNU
;
2085 else if (bed
->elf_osabi
!= ELFOSABI_GNU
)
2086 as_bad (_("symbol type \"%s\" is supported only by GNU targets"),
2088 elf_tdata (stdoutput
)->has_gnu_osabi
|= elf_gnu_osabi_unique
;
2089 type
= BSF_OBJECT
| BSF_GNU_UNIQUE
;
2091 #ifdef md_elf_symbol_type
2092 else if ((type
= md_elf_symbol_type (type_name
, sym
, elfsym
)) != -1)
2096 as_bad (_("unrecognized symbol type \"%s\""), type_name
);
2098 *input_line_pointer
= c
;
2100 if (*input_line_pointer
== '"')
2101 ++input_line_pointer
;
2103 #ifdef md_elf_symbol_type_change
2104 if (!md_elf_symbol_type_change (sym
, elfsym
, type
))
2107 flagword mask
= BSF_FUNCTION
| BSF_OBJECT
;
2109 if (type
!= BSF_FUNCTION
)
2110 mask
|= BSF_GNU_INDIRECT_FUNCTION
;
2111 if (type
!= BSF_OBJECT
)
2113 mask
|= BSF_GNU_UNIQUE
| BSF_THREAD_LOCAL
;
2115 if (S_IS_COMMON (sym
))
2117 as_bad (_("cannot change type of common symbol '%s'"),
2123 /* Don't warn when changing to STT_NOTYPE. */
2126 flagword
new = (elfsym
->symbol
.flags
& ~mask
) | type
;
2128 if (new != (elfsym
->symbol
.flags
| type
))
2129 as_warn (_("symbol '%s' already has its type set"), S_GET_NAME (sym
));
2130 elfsym
->symbol
.flags
= new;
2133 elfsym
->symbol
.flags
&= ~mask
;
2136 demand_empty_rest_of_line ();
2140 obj_elf_ident (int ignore ATTRIBUTE_UNUSED
)
2142 static segT comment_section
;
2143 segT old_section
= now_seg
;
2144 int old_subsection
= now_subseg
;
2146 #ifdef md_flush_pending_output
2147 md_flush_pending_output ();
2150 if (!comment_section
)
2153 comment_section
= subseg_new (".comment", 0);
2154 bfd_set_section_flags (comment_section
, (SEC_READONLY
| SEC_HAS_CONTENTS
2155 | SEC_MERGE
| SEC_STRINGS
));
2156 comment_section
->entsize
= 1;
2157 #ifdef md_elf_section_change_hook
2158 md_elf_section_change_hook ();
2164 subseg_set (comment_section
, 0);
2166 subseg_set (old_section
, old_subsection
);
2169 #ifdef INIT_STAB_SECTION
2171 /* The first entry in a .stabs section is special. */
2174 obj_elf_init_stab_section (segT seg
)
2179 unsigned int stroff
;
2181 /* Force the section to align to a longword boundary. Without this,
2182 UnixWare ar crashes. */
2183 bfd_set_section_alignment (seg
, 2);
2185 /* Make space for this first symbol. */
2189 file
= as_where (NULL
);
2190 stabstr_name
= concat (segment_name (seg
), "str", (char *) NULL
);
2191 stroff
= get_stab_string_offset (file
, stabstr_name
, TRUE
);
2192 know (stroff
== 1 || (stroff
== 0 && file
[0] == '\0'));
2193 md_number_to_chars (p
, stroff
, 4);
2194 seg_info (seg
)->stabu
.p
= p
;
2199 /* Fill in the counts in the first entry in a .stabs section. */
2202 adjust_stab_sections (bfd
*abfd
, asection
*sec
, void *xxx ATTRIBUTE_UNUSED
)
2209 if (strncmp (".stab", sec
->name
, 5))
2211 if (!strcmp ("str", sec
->name
+ strlen (sec
->name
) - 3))
2214 name
= concat (sec
->name
, "str", NULL
);
2215 strsec
= bfd_get_section_by_name (abfd
, name
);
2217 strsz
= bfd_section_size (strsec
);
2220 nsyms
= bfd_section_size (sec
) / 12 - 1;
2222 p
= seg_info (sec
)->stabu
.p
;
2223 gas_assert (p
!= 0);
2225 bfd_h_put_16 (abfd
, nsyms
, p
+ 6);
2226 bfd_h_put_32 (abfd
, strsz
, p
+ 8);
2230 #ifdef NEED_ECOFF_DEBUG
2232 /* This function is called by the ECOFF code. It is supposed to
2233 record the external symbol information so that the backend can
2234 write it out correctly. The ELF backend doesn't actually handle
2235 this at the moment, so we do it ourselves. We save the information
2238 #ifdef OBJ_MAYBE_ELF
2242 elf_ecoff_set_ext (symbolS
*sym
, struct ecoff_extr
*ext
)
2244 symbol_get_bfdsym (sym
)->udata
.p
= ext
;
2247 /* This function is called by bfd_ecoff_debug_externals. It is
2248 supposed to *EXT to the external symbol information, and return
2249 whether the symbol should be used at all. */
2252 elf_get_extr (asymbol
*sym
, EXTR
*ext
)
2254 if (sym
->udata
.p
== NULL
)
2256 *ext
= *(EXTR
*) sym
->udata
.p
;
2260 /* This function is called by bfd_ecoff_debug_externals. It has
2261 nothing to do for ELF. */
2264 elf_set_index (asymbol
*sym ATTRIBUTE_UNUSED
,
2265 bfd_size_type indx ATTRIBUTE_UNUSED
)
2269 #endif /* NEED_ECOFF_DEBUG */
2272 elf_frob_symbol (symbolS
*symp
, int *puntp
)
2274 struct elf_obj_sy
*sy_obj
;
2277 #ifdef NEED_ECOFF_DEBUG
2278 if (ECOFF_DEBUGGING
)
2279 ecoff_frob_symbol (symp
);
2282 sy_obj
= symbol_get_obj (symp
);
2284 size
= sy_obj
->size
;
2287 if (resolve_expression (size
)
2288 && size
->X_op
== O_constant
)
2289 S_SET_SIZE (symp
, size
->X_add_number
);
2292 if (!flag_allow_nonconst_size
)
2293 as_bad (_(".size expression for %s "
2294 "does not evaluate to a constant"), S_GET_NAME (symp
));
2296 as_warn (_(".size expression for %s "
2297 "does not evaluate to a constant"), S_GET_NAME (symp
));
2299 free (sy_obj
->size
);
2300 sy_obj
->size
= NULL
;
2303 if (sy_obj
->versioned_name
!= NULL
)
2307 p
= strchr (sy_obj
->versioned_name
, ELF_VER_CHR
);
2309 /* We will have already reported an error about a missing version. */
2312 /* This symbol was given a new name with the .symver directive.
2314 If this is an external reference, just rename the symbol to
2315 include the version string. This will make the relocs be
2316 against the correct versioned symbol.
2318 If this is a definition, add an alias. FIXME: Using an alias
2319 will permit the debugging information to refer to the right
2320 symbol. However, it's not clear whether it is the best
2323 else if (! S_IS_DEFINED (symp
))
2325 /* Verify that the name isn't using the @@ syntax--this is
2326 reserved for definitions of the default version to link
2328 if (p
[1] == ELF_VER_CHR
)
2330 as_bad (_("invalid attempt to declare external version name"
2331 " as default in symbol `%s'"),
2332 sy_obj
->versioned_name
);
2335 S_SET_NAME (symp
, sy_obj
->versioned_name
);
2339 if (p
[1] == ELF_VER_CHR
&& p
[2] == ELF_VER_CHR
)
2343 /* The @@@ syntax is a special case. It renames the
2344 symbol name to versioned_name with one `@' removed. */
2345 l
= strlen (&p
[3]) + 1;
2346 memmove (&p
[2], &p
[3], l
);
2347 S_SET_NAME (symp
, sy_obj
->versioned_name
);
2353 /* FIXME: Creating a new symbol here is risky. We're
2354 in the final loop over the symbol table. We can
2355 get away with it only because the symbol goes to
2356 the end of the list, where the loop will still see
2357 it. It would probably be better to do this in
2358 obj_frob_file_before_adjust. */
2360 symp2
= symbol_find_or_make (sy_obj
->versioned_name
);
2362 /* Now we act as though we saw symp2 = sym. */
2363 if (S_IS_COMMON (symp
))
2365 as_bad (_("`%s' can't be versioned to common symbol '%s'"),
2366 sy_obj
->versioned_name
, S_GET_NAME (symp
));
2371 S_SET_SEGMENT (symp2
, S_GET_SEGMENT (symp
));
2373 /* Subtracting out the frag address here is a hack
2374 because we are in the middle of the final loop. */
2377 - symbol_get_frag (symp
)->fr_address
));
2379 symbol_set_frag (symp2
, symbol_get_frag (symp
));
2381 /* This will copy over the size information. */
2382 copy_symbol_attributes (symp2
, symp
);
2384 S_SET_OTHER (symp2
, S_GET_OTHER (symp
));
2386 if (S_IS_WEAK (symp
))
2389 if (S_IS_EXTERNAL (symp
))
2390 S_SET_EXTERNAL (symp2
);
2395 /* Double check weak symbols. */
2396 if (S_IS_WEAK (symp
))
2398 if (S_IS_COMMON (symp
))
2399 as_bad (_("symbol `%s' can not be both weak and common"),
2406 asection
**head
; /* Section lists. */
2407 unsigned int num_group
; /* Number of lists. */
2408 struct hash_control
*indexes
; /* Maps group name to index in head array. */
2411 static struct group_list groups
;
2413 /* Called via bfd_map_over_sections. If SEC is a member of a group,
2414 add it to a list of sections belonging to the group. INF is a
2415 pointer to a struct group_list, which is where we store the head of
2419 build_group_lists (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
, void *inf
)
2421 struct group_list
*list
= (struct group_list
*) inf
;
2422 const char *group_name
= elf_group_name (sec
);
2424 unsigned int *elem_idx
;
2425 unsigned int *idx_ptr
;
2427 if (group_name
== NULL
)
2430 /* If this group already has a list, add the section to the head of
2432 elem_idx
= (unsigned int *) hash_find (list
->indexes
, group_name
);
2433 if (elem_idx
!= NULL
)
2435 elf_next_in_group (sec
) = list
->head
[*elem_idx
];
2436 list
->head
[*elem_idx
] = sec
;
2440 /* New group. Make the arrays bigger in chunks to minimize calls to
2442 i
= list
->num_group
;
2445 unsigned int newsize
= i
+ 128;
2446 list
->head
= XRESIZEVEC (asection
*, list
->head
, newsize
);
2448 list
->head
[i
] = sec
;
2449 list
->num_group
+= 1;
2451 /* Add index to hash. */
2452 idx_ptr
= XNEW (unsigned int);
2454 hash_insert (list
->indexes
, group_name
, idx_ptr
);
2457 static void free_section_idx (const char *key ATTRIBUTE_UNUSED
, void *val
)
2459 free ((unsigned int *) val
);
2462 /* Create symbols for group signature. */
2465 elf_adjust_symtab (void)
2469 /* Go find section groups. */
2470 groups
.num_group
= 0;
2472 groups
.indexes
= hash_new ();
2473 bfd_map_over_sections (stdoutput
, build_group_lists
, &groups
);
2475 /* Make the SHT_GROUP sections that describe each section group. We
2476 can't set up the section contents here yet, because elf section
2477 indices have yet to be calculated. elf.c:set_group_contents does
2478 the rest of the work. */
2479 for (i
= 0; i
< groups
.num_group
; i
++)
2481 const char *group_name
= elf_group_name (groups
.head
[i
]);
2482 const char *sec_name
;
2487 flags
= SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
| SEC_GROUP
;
2488 for (s
= groups
.head
[i
]; s
!= NULL
; s
= elf_next_in_group (s
))
2489 if ((s
->flags
^ flags
) & SEC_LINK_ONCE
)
2491 flags
|= SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_DISCARD
;
2492 if (s
!= groups
.head
[i
])
2494 as_warn (_("assuming all members of group `%s' are COMDAT"),
2500 sec_name
= ".group";
2501 s
= subseg_force_new (sec_name
, 0);
2503 || !bfd_set_section_flags (s
, flags
)
2504 || !bfd_set_section_alignment (s
, 2))
2506 as_fatal (_("can't create group: %s"),
2507 bfd_errmsg (bfd_get_error ()));
2509 elf_section_type (s
) = SHT_GROUP
;
2511 /* Pass a pointer to the first section in this group. */
2512 elf_next_in_group (s
) = groups
.head
[i
];
2513 elf_sec_group (groups
.head
[i
]) = s
;
2514 /* Make sure that the signature symbol for the group has the
2515 name of the group. */
2516 sy
= symbol_find_exact (group_name
);
2517 if (!sy
|| !symbol_on_chain (sy
, symbol_rootP
, symbol_lastP
))
2519 /* Create the symbol now. */
2520 sy
= symbol_new (group_name
, now_seg
, (valueT
) 0, frag_now
);
2522 /* Before Solaris 11 build 154, Sun ld rejects local group
2523 signature symbols, so make them weak hidden instead. */
2524 symbol_get_bfdsym (sy
)->flags
|= BSF_WEAK
;
2525 S_SET_OTHER (sy
, STV_HIDDEN
);
2527 symbol_get_obj (sy
)->local
= 1;
2529 symbol_table_insert (sy
);
2531 elf_group_id (s
) = symbol_get_bfdsym (sy
);
2536 elf_frob_file (void)
2538 bfd_map_over_sections (stdoutput
, adjust_stab_sections
, NULL
);
2540 #ifdef elf_tc_final_processing
2541 elf_tc_final_processing ();
2545 /* It removes any unneeded versioned symbols from the symbol table. */
2548 elf_frob_file_before_adjust (void)
2554 for (symp
= symbol_rootP
; symp
; symp
= symbol_next (symp
))
2555 if (!S_IS_DEFINED (symp
))
2557 if (symbol_get_obj (symp
)->versioned_name
)
2561 /* The @@@ syntax is a special case. If the symbol is
2562 not defined, 2 `@'s will be removed from the
2565 p
= strchr (symbol_get_obj (symp
)->versioned_name
,
2567 if (p
!= NULL
&& p
[1] == ELF_VER_CHR
&& p
[2] == ELF_VER_CHR
)
2569 size_t l
= strlen (&p
[3]) + 1;
2570 memmove (&p
[1], &p
[3], l
);
2572 if (symbol_used_p (symp
) == 0
2573 && symbol_used_in_reloc_p (symp
) == 0)
2574 symbol_remove (symp
, &symbol_rootP
, &symbol_lastP
);
2577 /* If there was .weak foo, but foo was neither defined nor
2578 used anywhere, remove it. */
2580 else if (S_IS_WEAK (symp
)
2581 && symbol_used_p (symp
) == 0
2582 && symbol_used_in_reloc_p (symp
) == 0)
2583 symbol_remove (symp
, &symbol_rootP
, &symbol_lastP
);
2588 /* It is required that we let write_relocs have the opportunity to
2589 optimize away fixups before output has begun, since it is possible
2590 to eliminate all fixups for a section and thus we never should
2591 have generated the relocation section. */
2594 elf_frob_file_after_relocs (void)
2598 /* Set SHT_GROUP section size. */
2599 for (i
= 0; i
< groups
.num_group
; i
++)
2601 asection
*s
, *head
, *group
;
2604 head
= groups
.head
[i
];
2606 for (s
= head
; s
!= NULL
; s
= elf_next_in_group (s
))
2607 size
+= (s
->flags
& SEC_RELOC
) != 0 ? 8 : 4;
2609 group
= elf_sec_group (head
);
2610 subseg_set (group
, 0);
2611 bfd_set_section_size (group
, size
);
2612 group
->contents
= (unsigned char *) frag_more (size
);
2613 frag_now
->fr_fix
= frag_now_fix_octets ();
2614 frag_wane (frag_now
);
2618 hash_traverse (groups
.indexes
, free_section_idx
);
2619 hash_die (groups
.indexes
);
2621 #ifdef NEED_ECOFF_DEBUG
2622 if (ECOFF_DEBUGGING
)
2623 /* Generate the ECOFF debugging information. */
2625 const struct ecoff_debug_swap
*debug_swap
;
2626 struct ecoff_debug_info debug
;
2631 = get_elf_backend_data (stdoutput
)->elf_backend_ecoff_debug_swap
;
2632 know (debug_swap
!= NULL
);
2633 ecoff_build_debug (&debug
.symbolic_header
, &buf
, debug_swap
);
2635 /* Set up the pointers in debug. */
2636 #define SET(ptr, offset, type) \
2637 debug.ptr = (type) (buf + debug.symbolic_header.offset)
2639 SET (line
, cbLineOffset
, unsigned char *);
2640 SET (external_dnr
, cbDnOffset
, void *);
2641 SET (external_pdr
, cbPdOffset
, void *);
2642 SET (external_sym
, cbSymOffset
, void *);
2643 SET (external_opt
, cbOptOffset
, void *);
2644 SET (external_aux
, cbAuxOffset
, union aux_ext
*);
2645 SET (ss
, cbSsOffset
, char *);
2646 SET (external_fdr
, cbFdOffset
, void *);
2647 SET (external_rfd
, cbRfdOffset
, void *);
2648 /* ssext and external_ext are set up just below. */
2652 /* Set up the external symbols. */
2653 debug
.ssext
= debug
.ssext_end
= NULL
;
2654 debug
.external_ext
= debug
.external_ext_end
= NULL
;
2655 if (! bfd_ecoff_debug_externals (stdoutput
, &debug
, debug_swap
, TRUE
,
2656 elf_get_extr
, elf_set_index
))
2657 as_fatal (_("failed to set up debugging information: %s"),
2658 bfd_errmsg (bfd_get_error ()));
2660 sec
= bfd_get_section_by_name (stdoutput
, ".mdebug");
2661 gas_assert (sec
!= NULL
);
2663 know (!stdoutput
->output_has_begun
);
2665 /* We set the size of the section, call bfd_set_section_contents
2666 to force the ELF backend to allocate a file position, and then
2667 write out the data. FIXME: Is this really the best way to do
2669 bfd_set_section_size (sec
, bfd_ecoff_debug_size (stdoutput
, &debug
,
2672 /* Pass BUF to bfd_set_section_contents because this will
2673 eventually become a call to fwrite, and ISO C prohibits
2674 passing a NULL pointer to a stdio function even if the
2675 pointer will not be used. */
2676 if (! bfd_set_section_contents (stdoutput
, sec
, buf
, 0, 0))
2677 as_fatal (_("can't start writing .mdebug section: %s"),
2678 bfd_errmsg (bfd_get_error ()));
2680 know (stdoutput
->output_has_begun
);
2681 know (sec
->filepos
!= 0);
2683 if (! bfd_ecoff_write_debug (stdoutput
, &debug
, debug_swap
,
2685 as_fatal (_("could not write .mdebug section: %s"),
2686 bfd_errmsg (bfd_get_error ()));
2688 #endif /* NEED_ECOFF_DEBUG */
2692 elf_generate_asm_lineno (void)
2694 #ifdef NEED_ECOFF_DEBUG
2695 if (ECOFF_DEBUGGING
)
2696 ecoff_generate_asm_lineno ();
2701 elf_process_stab (segT sec ATTRIBUTE_UNUSED
,
2702 int what ATTRIBUTE_UNUSED
,
2703 const char *string ATTRIBUTE_UNUSED
,
2704 int type ATTRIBUTE_UNUSED
,
2705 int other ATTRIBUTE_UNUSED
,
2706 int desc ATTRIBUTE_UNUSED
)
2708 #ifdef NEED_ECOFF_DEBUG
2709 if (ECOFF_DEBUGGING
)
2710 ecoff_stab (sec
, what
, string
, type
, other
, desc
);
2715 elf_separate_stab_sections (void)
2717 #ifdef NEED_ECOFF_DEBUG
2718 return (!ECOFF_DEBUGGING
);
2725 elf_init_stab_section (segT seg
)
2727 #ifdef NEED_ECOFF_DEBUG
2728 if (!ECOFF_DEBUGGING
)
2730 obj_elf_init_stab_section (seg
);
2733 const struct format_ops elf_format_ops
=
2735 bfd_target_elf_flavour
,
2736 0, /* dfl_leading_underscore */
2737 1, /* emit_section_symbols */
2742 elf_frob_file_before_adjust
,
2743 0, /* obj_frob_file_before_fix */
2744 elf_frob_file_after_relocs
,
2745 elf_s_get_size
, elf_s_set_size
,
2746 elf_s_get_align
, elf_s_set_align
,
2753 elf_copy_symbol_attributes
,
2754 elf_generate_asm_lineno
,
2756 elf_separate_stab_sections
,
2757 elf_init_stab_section
,
2758 elf_sec_sym_ok_for_reloc
,
2760 #ifdef NEED_ECOFF_DEBUG
2763 0, /* ecoff_set_ext */
2765 elf_obj_read_begin_hook
,
2766 elf_obj_symbol_new_hook
,