1 /* ELF object file format
2 Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2,
10 or (at your option) any later version.
12 GAS is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 the GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 #define OBJ_HEADER "obj-elf.h"
24 #include "safe-ctype.h"
27 #include "struc-symbol.h"
29 #ifndef ECOFF_DEBUGGING
30 #define ECOFF_DEBUGGING 0
32 #define NEED_ECOFF_DEBUG
35 #ifdef NEED_ECOFF_DEBUG
40 #include "elf/alpha.h"
55 static bfd_vma elf_s_get_size
PARAMS ((symbolS
*));
56 static void elf_s_set_size
PARAMS ((symbolS
*, bfd_vma
));
57 static bfd_vma elf_s_get_align
PARAMS ((symbolS
*));
58 static void elf_s_set_align
PARAMS ((symbolS
*, bfd_vma
));
59 static void elf_s_set_other
PARAMS ((symbolS
*, int));
60 static int elf_sec_sym_ok_for_reloc
PARAMS ((asection
*));
61 static void adjust_stab_sections
PARAMS ((bfd
*, asection
*, PTR
));
62 static void build_group_lists
PARAMS ((bfd
*, asection
*, PTR
));
63 static int elf_separate_stab_sections
PARAMS ((void));
64 static void elf_init_stab_section
PARAMS ((segT
));
65 static symbolS
*elf_common
PARAMS ((int));
67 #ifdef NEED_ECOFF_DEBUG
68 static boolean elf_get_extr
PARAMS ((asymbol
*, EXTR
*));
69 static void elf_set_index
PARAMS ((asymbol
*, bfd_size_type
));
72 static void obj_elf_line
PARAMS ((int));
73 void obj_elf_version
PARAMS ((int));
74 static void obj_elf_size
PARAMS ((int));
75 static void obj_elf_type
PARAMS ((int));
76 static void obj_elf_ident
PARAMS ((int));
77 static void obj_elf_weak
PARAMS ((int));
78 static void obj_elf_local
PARAMS ((int));
79 static void obj_elf_visibility
PARAMS ((int));
80 void obj_elf_change_section
81 PARAMS ((const char *, int, int, int, const char *, int, int));
82 static int obj_elf_parse_section_letters
PARAMS ((char *, size_t));
83 static int obj_elf_section_word
PARAMS ((char *, size_t));
84 static char *obj_elf_section_name
PARAMS ((void));
85 static int obj_elf_section_type
PARAMS ((char *, size_t));
86 static void obj_elf_symver
PARAMS ((int));
87 static void obj_elf_subsection
PARAMS ((int));
88 static void obj_elf_popsection
PARAMS ((int));
89 static void obj_elf_tls_common
PARAMS ((int));
91 static const pseudo_typeS elf_pseudo_table
[] =
93 {"comm", obj_elf_common
, 0},
94 {"common", obj_elf_common
, 1},
95 {"ident", obj_elf_ident
, 0},
96 {"local", obj_elf_local
, 0},
97 {"previous", obj_elf_previous
, 0},
98 {"section", obj_elf_section
, 0},
99 {"section.s", obj_elf_section
, 0},
100 {"sect", obj_elf_section
, 0},
101 {"sect.s", obj_elf_section
, 0},
102 {"pushsection", obj_elf_section
, 1},
103 {"popsection", obj_elf_popsection
, 0},
104 {"size", obj_elf_size
, 0},
105 {"type", obj_elf_type
, 0},
106 {"version", obj_elf_version
, 0},
107 {"weak", obj_elf_weak
, 0},
109 /* These define symbol visibility. */
110 {"internal", obj_elf_visibility
, STV_INTERNAL
},
111 {"hidden", obj_elf_visibility
, STV_HIDDEN
},
112 {"protected", obj_elf_visibility
, STV_PROTECTED
},
114 /* These are used for stabs-in-elf configurations. */
115 {"line", obj_elf_line
, 0},
117 /* This is a GNU extension to handle symbol versions. */
118 {"symver", obj_elf_symver
, 0},
120 /* A GNU extension to change subsection only. */
121 {"subsection", obj_elf_subsection
, 0},
123 /* These are GNU extensions to aid in garbage collecting C++ vtables. */
124 {"vtable_inherit", (void (*) PARAMS ((int))) &obj_elf_vtable_inherit
, 0},
125 {"vtable_entry", (void (*) PARAMS ((int))) &obj_elf_vtable_entry
, 0},
127 /* These are used for dwarf. */
132 /* We need to trap the section changing calls to handle .previous. */
133 {"data", obj_elf_data
, 0},
134 {"text", obj_elf_text
, 0},
136 {"tls_common", obj_elf_tls_common
, 0},
142 static const pseudo_typeS ecoff_debug_pseudo_table
[] =
144 #ifdef NEED_ECOFF_DEBUG
145 /* COFF style debugging information for ECOFF. .ln is not used; .loc
147 { "def", ecoff_directive_def
, 0 },
148 { "dim", ecoff_directive_dim
, 0 },
149 { "endef", ecoff_directive_endef
, 0 },
150 { "file", ecoff_directive_file
, 0 },
151 { "scl", ecoff_directive_scl
, 0 },
152 { "tag", ecoff_directive_tag
, 0 },
153 { "val", ecoff_directive_val
, 0 },
155 /* COFF debugging requires pseudo-ops .size and .type, but ELF
156 already has meanings for those. We use .esize and .etype
157 instead. These are only generated by gcc anyhow. */
158 { "esize", ecoff_directive_size
, 0 },
159 { "etype", ecoff_directive_type
, 0 },
161 /* ECOFF specific debugging information. */
162 { "begin", ecoff_directive_begin
, 0 },
163 { "bend", ecoff_directive_bend
, 0 },
164 { "end", ecoff_directive_end
, 0 },
165 { "ent", ecoff_directive_ent
, 0 },
166 { "fmask", ecoff_directive_fmask
, 0 },
167 { "frame", ecoff_directive_frame
, 0 },
168 { "loc", ecoff_directive_loc
, 0 },
169 { "mask", ecoff_directive_mask
, 0 },
171 /* Other ECOFF directives. */
172 { "extern", ecoff_directive_extern
, 0 },
174 /* These are used on Irix. I don't know how to implement them. */
175 { "alias", s_ignore
, 0 },
176 { "bgnb", s_ignore
, 0 },
177 { "endb", s_ignore
, 0 },
178 { "lab", s_ignore
, 0 },
179 { "noalias", s_ignore
, 0 },
180 { "verstamp", s_ignore
, 0 },
181 { "vreg", s_ignore
, 0 },
184 {NULL
, NULL
, 0} /* end sentinel */
188 #include "aout/aout64.h"
190 /* This is called when the assembler starts. */
195 /* Add symbols for the known sections to the symbol table. */
196 symbol_table_insert (section_symbol (bfd_get_section_by_name (stdoutput
,
197 TEXT_SECTION_NAME
)));
198 symbol_table_insert (section_symbol (bfd_get_section_by_name (stdoutput
,
199 DATA_SECTION_NAME
)));
200 symbol_table_insert (section_symbol (bfd_get_section_by_name (stdoutput
,
207 pop_insert (elf_pseudo_table
);
209 pop_insert (ecoff_debug_pseudo_table
);
216 return S_GET_SIZE (sym
);
220 elf_s_set_size (sym
, sz
)
224 S_SET_SIZE (sym
, sz
);
228 elf_s_get_align (sym
)
231 return S_GET_ALIGN (sym
);
235 elf_s_set_align (sym
, align
)
239 S_SET_ALIGN (sym
, align
);
243 elf_s_get_other (sym
)
246 return elf_symbol (symbol_get_bfdsym (sym
))->internal_elf_sym
.st_other
;
250 elf_s_set_other (sym
, other
)
254 S_SET_OTHER (sym
, other
);
258 elf_sec_sym_ok_for_reloc (sec
)
261 return obj_sec_sym_ok_for_reloc (sec
);
270 sym
= symbol_new (s
, absolute_section
, (valueT
) 0, (struct frag
*) 0);
271 symbol_set_frag (sym
, &zero_address_frag
);
272 symbol_get_bfdsym (sym
)->flags
|= BSF_FILE
;
274 if (symbol_rootP
!= sym
)
276 symbol_remove (sym
, &symbol_rootP
, &symbol_lastP
);
277 symbol_insert (sym
, symbol_rootP
, &symbol_rootP
, &symbol_lastP
);
279 verify_symbol_chain (symbol_rootP
, symbol_lastP
);
283 #ifdef NEED_ECOFF_DEBUG
289 elf_common (is_common
)
299 if (flag_mri
&& is_common
)
305 name
= input_line_pointer
;
306 c
= get_symbol_end ();
307 /* just after name is now '\0' */
308 p
= input_line_pointer
;
311 if (*input_line_pointer
!= ',')
313 as_bad (_("expected comma after symbol-name"));
314 ignore_rest_of_line ();
317 input_line_pointer
++; /* skip ',' */
318 if ((temp
= get_absolute_expression ()) < 0)
320 as_bad (_(".COMMon length (%d.) <0! Ignored."), temp
);
321 ignore_rest_of_line ();
326 symbolP
= symbol_find_or_make (name
);
328 if (S_IS_DEFINED (symbolP
) && ! S_IS_COMMON (symbolP
))
330 as_bad (_("symbol `%s' is already defined"), S_GET_NAME (symbolP
));
331 ignore_rest_of_line ();
334 if (S_GET_VALUE (symbolP
) != 0)
336 if (S_GET_VALUE (symbolP
) != (valueT
) size
)
338 as_warn (_("length of .comm \"%s\" is already %ld; not changed to %d"),
339 S_GET_NAME (symbolP
), (long) S_GET_VALUE (symbolP
), size
);
342 know (symbolP
->sy_frag
== &zero_address_frag
);
343 if (*input_line_pointer
!= ',')
348 input_line_pointer
++;
351 if (! have_align
|| *input_line_pointer
!= '"')
357 temp
= get_absolute_expression ();
361 as_warn (_("common alignment negative; 0 assumed"));
364 if (symbol_get_obj (symbolP
)->local
)
373 old_subsec
= now_subseg
;
376 /* convert to a power of 2 alignment */
377 for (align
= 0; (temp
& 1) == 0; temp
>>= 1, ++align
);
380 as_bad (_("common alignment not a power of 2"));
381 ignore_rest_of_line ();
387 record_alignment (bss_section
, align
);
388 subseg_set (bss_section
, 0);
390 frag_align (align
, 0, 0);
391 if (S_GET_SEGMENT (symbolP
) == bss_section
)
392 symbol_get_frag (symbolP
)->fr_symbol
= 0;
393 symbol_set_frag (symbolP
, frag_now
);
394 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, symbolP
,
395 (offsetT
) size
, (char *) 0);
397 S_SET_SIZE (symbolP
, size
);
398 S_SET_SEGMENT (symbolP
, bss_section
);
399 S_CLEAR_EXTERNAL (symbolP
);
400 subseg_set (old_sec
, old_subsec
);
405 S_SET_VALUE (symbolP
, (valueT
) size
);
406 S_SET_ALIGN (symbolP
, temp
);
407 S_SET_EXTERNAL (symbolP
);
408 S_SET_SEGMENT (symbolP
, bfd_com_section_ptr
);
413 input_line_pointer
++;
414 /* @@ Some use the dot, some don't. Can we get some consistency?? */
415 if (*input_line_pointer
== '.')
416 input_line_pointer
++;
417 /* @@ Some say data, some say bss. */
418 if (strncmp (input_line_pointer
, "bss\"", 4)
419 && strncmp (input_line_pointer
, "data\"", 5))
421 while (*--input_line_pointer
!= '"')
423 input_line_pointer
--;
424 goto bad_common_segment
;
426 while (*input_line_pointer
++ != '"')
428 goto allocate_common
;
431 symbol_get_bfdsym (symbolP
)->flags
|= BSF_OBJECT
;
433 demand_empty_rest_of_line ();
438 p
= input_line_pointer
;
439 while (*p
&& *p
!= '\n')
443 as_bad (_("bad .common segment %s"), input_line_pointer
+ 1);
445 input_line_pointer
= p
;
446 ignore_rest_of_line ();
452 obj_elf_common (is_common
)
455 elf_common (is_common
);
459 obj_elf_tls_common (ignore
)
460 int ignore ATTRIBUTE_UNUSED
;
462 symbolS
*symbolP
= elf_common (0);
465 symbol_get_bfdsym (symbolP
)->flags
|= BSF_THREAD_LOCAL
;
469 obj_elf_local (ignore
)
470 int ignore ATTRIBUTE_UNUSED
;
478 name
= input_line_pointer
;
479 c
= get_symbol_end ();
480 symbolP
= symbol_find_or_make (name
);
481 *input_line_pointer
= c
;
483 S_CLEAR_EXTERNAL (symbolP
);
484 symbol_get_obj (symbolP
)->local
= 1;
487 input_line_pointer
++;
489 if (*input_line_pointer
== '\n')
494 demand_empty_rest_of_line ();
498 obj_elf_weak (ignore
)
499 int ignore ATTRIBUTE_UNUSED
;
507 name
= input_line_pointer
;
508 c
= get_symbol_end ();
509 symbolP
= symbol_find_or_make (name
);
510 *input_line_pointer
= c
;
512 S_SET_WEAK (symbolP
);
513 symbol_get_obj (symbolP
)->local
= 1;
516 input_line_pointer
++;
518 if (*input_line_pointer
== '\n')
523 demand_empty_rest_of_line ();
527 obj_elf_visibility (visibility
)
534 elf_symbol_type
*elfsym
;
538 name
= input_line_pointer
;
539 c
= get_symbol_end ();
540 symbolP
= symbol_find_or_make (name
);
541 *input_line_pointer
= c
;
545 bfdsym
= symbol_get_bfdsym (symbolP
);
546 elfsym
= elf_symbol_from (bfd_asymbol_bfd (bfdsym
), bfdsym
);
550 elfsym
->internal_elf_sym
.st_other
= visibility
;
554 input_line_pointer
++;
558 if (*input_line_pointer
== '\n')
564 demand_empty_rest_of_line ();
567 static segT previous_section
;
568 static int previous_subsection
;
572 struct section_stack
*next
;
574 int subseg
, prev_subseg
;
577 static struct section_stack
*section_stack
;
579 /* Handle the .section pseudo-op. This code supports two different
582 The first is found on Solaris, and looks like
583 .section ".sec1",#alloc,#execinstr,#write
584 Here the names after '#' are the SHF_* flags to turn on for the
585 section. I'm not sure how it determines the SHT_* type (BFD
586 doesn't really give us control over the type, anyhow).
588 The second format is found on UnixWare, and probably most SVR4
589 machines, and looks like
590 .section .sec1,"a",@progbits
591 The quoted string may contain any combination of a, w, x, and
592 represents the SHF_* flags to turn on for the section. The string
593 beginning with '@' can be progbits or nobits. There should be
594 other possibilities, but I don't know what they are. In any case,
595 BFD doesn't really let us set the section type. */
597 /* Certain named sections have particular defined types, listed on p.
599 struct special_section
606 static struct special_section
const special_sections
[] =
608 { ".bss", SHT_NOBITS
, SHF_ALLOC
+ SHF_WRITE
},
609 { ".comment", SHT_PROGBITS
, 0 },
610 { ".data", SHT_PROGBITS
, SHF_ALLOC
+ SHF_WRITE
},
611 { ".data1", SHT_PROGBITS
, SHF_ALLOC
+ SHF_WRITE
},
612 { ".debug", SHT_PROGBITS
, 0 },
613 { ".fini", SHT_PROGBITS
, SHF_ALLOC
+ SHF_EXECINSTR
},
614 { ".init", SHT_PROGBITS
, SHF_ALLOC
+ SHF_EXECINSTR
},
615 { ".line", SHT_PROGBITS
, 0 },
616 { ".note", SHT_NOTE
, 0 },
617 { ".rodata", SHT_PROGBITS
, SHF_ALLOC
},
618 { ".rodata1", SHT_PROGBITS
, SHF_ALLOC
},
619 { ".tbss", SHT_NOBITS
, SHF_ALLOC
+ SHF_WRITE
+ SHF_TLS
},
620 { ".tdata", SHT_PROGBITS
, SHF_ALLOC
+ SHF_WRITE
+ SHF_TLS
},
621 { ".text", SHT_PROGBITS
, SHF_ALLOC
+ SHF_EXECINSTR
},
623 /* FIXME: The current gcc, as of 2002-03-03, will emit
625 .section .init_array,"aw",@progbits
627 for __attribute__ ((section (".init_array"))). "@progbits" marks
628 the incorrect section type. For now, we make them with
629 SHT_PROGBITS. BFD will fix the section type. Gcc should be changed
635 { ".init_array",SHT_INIT_ARRAY
, SHF_ALLOC
+ SHF_WRITE
},
636 { ".fini_array",SHT_FINI_ARRAY
, SHF_ALLOC
+ SHF_WRITE
},
637 { ".preinit_array",SHT_PREINIT_ARRAY
, SHF_ALLOC
+ SHF_WRITE
},
639 { ".init_array",SHT_PROGBITS
, SHF_ALLOC
+ SHF_WRITE
},
640 { ".fini_array",SHT_PROGBITS
, SHF_ALLOC
+ SHF_WRITE
},
641 { ".preinit_array",SHT_PROGBITS
, SHF_ALLOC
+ SHF_WRITE
},
644 #ifdef ELF_TC_SPECIAL_SECTIONS
645 ELF_TC_SPECIAL_SECTIONS
649 /* The following section names are special, but they can not
650 reasonably appear in assembler code. Some of the attributes are
651 processor dependent. */
652 { ".dynamic", SHT_DYNAMIC
, SHF_ALLOC
/* + SHF_WRITE */ },
653 { ".dynstr", SHT_STRTAB
, SHF_ALLOC
},
654 { ".dynsym", SHT_DYNSYM
, SHF_ALLOC
},
655 { ".got", SHT_PROGBITS
, 0 },
656 { ".hash", SHT_HASH
, SHF_ALLOC
},
657 { ".interp", SHT_PROGBITS
, /* SHF_ALLOC */ },
658 { ".plt", SHT_PROGBITS
, 0 },
659 { ".shstrtab",SHT_STRTAB
, 0 },
660 { ".strtab", SHT_STRTAB
, /* SHF_ALLOC */ },
661 { ".symtab", SHT_SYMTAB
, /* SHF_ALLOC */ },
668 obj_elf_change_section (name
, type
, attr
, entsize
, group_name
, linkonce
, push
)
673 const char *group_name
;
682 #ifdef md_flush_pending_output
683 md_flush_pending_output ();
686 /* Switch to the section, creating it if necessary. */
689 struct section_stack
*elt
;
690 elt
= xmalloc (sizeof (struct section_stack
));
691 elt
->next
= section_stack
;
693 elt
->prev_seg
= previous_section
;
694 elt
->subseg
= now_subseg
;
695 elt
->prev_subseg
= previous_subsection
;
698 previous_section
= now_seg
;
699 previous_subsection
= now_subseg
;
701 old_sec
= bfd_get_section_by_name (stdoutput
, name
);
702 sec
= subseg_new (name
, 0);
704 /* See if this is one of the special sections. */
705 for (i
= 0; special_sections
[i
].name
!= NULL
; i
++)
706 if (strcmp (name
, special_sections
[i
].name
) == 0)
708 if (type
== SHT_NULL
)
709 type
= special_sections
[i
].type
;
710 else if (type
!= special_sections
[i
].type
)
714 as_warn (_("setting incorrect section type for %s"), name
);
718 as_warn (_("ignoring incorrect section type for %s"), name
);
719 type
= special_sections
[i
].type
;
722 if ((attr
&~ special_sections
[i
].attributes
) != 0
725 /* As a GNU extension, we permit a .note section to be
726 allocatable. If the linker sees an allocateable .note
727 section, it will create a PT_NOTE segment in the output
729 if (strcmp (name
, ".note") != 0
730 || attr
!= SHF_ALLOC
)
731 as_warn (_("setting incorrect section attributes for %s"),
734 attr
|= special_sections
[i
].attributes
;
738 /* Convert ELF type and flags to BFD flags. */
740 | ((attr
& SHF_WRITE
) ? 0 : SEC_READONLY
)
741 | ((attr
& SHF_ALLOC
) ? SEC_ALLOC
: 0)
742 | (((attr
& SHF_ALLOC
) && type
!= SHT_NOBITS
) ? SEC_LOAD
: 0)
743 | ((attr
& SHF_EXECINSTR
) ? SEC_CODE
: 0)
744 | ((attr
& SHF_MERGE
) ? SEC_MERGE
: 0)
745 | ((attr
& SHF_STRINGS
) ? SEC_STRINGS
: 0)
746 | ((attr
& SHF_TLS
) ? SEC_THREAD_LOCAL
: 0));
747 #ifdef md_elf_section_flags
748 flags
= md_elf_section_flags (flags
, attr
, type
);
755 /* Prevent SEC_HAS_CONTENTS from being inadvertently set. */
756 if (type
== SHT_NOBITS
)
757 seg_info (sec
)->bss
= 1;
759 bfd_set_section_flags (stdoutput
, sec
, flags
);
760 if (flags
& SEC_MERGE
)
761 sec
->entsize
= entsize
;
762 elf_group_name (sec
) = group_name
;
763 elf_linkonce_p (sec
) = linkonce
;
765 /* Add a symbol for this section to the symbol table. */
766 secsym
= symbol_find (name
);
768 symbol_set_bfdsym (secsym
, sec
->symbol
);
770 symbol_table_insert (section_symbol (sec
));
774 /* If section attributes are specified the second time we see a
775 particular section, then check that they are the same as we
776 saw the first time. */
777 if (((old_sec
->flags
^ flags
)
778 & (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
| SEC_CODE
779 | SEC_EXCLUDE
| SEC_SORT_ENTRIES
| SEC_MERGE
| SEC_STRINGS
781 || linkonce
!= elf_linkonce_p (sec
))
782 as_warn (_("ignoring changed section attributes for %s"), name
);
783 if ((flags
& SEC_MERGE
) && old_sec
->entsize
!= (unsigned) entsize
)
784 as_warn (_("ignoring changed section entity size for %s"), name
);
785 if ((attr
& SHF_GROUP
) != 0
786 && strcmp (elf_group_name (old_sec
), group_name
) != 0)
787 as_warn (_("ignoring new section group for %s"), name
);
790 #ifdef md_elf_section_change_hook
791 md_elf_section_change_hook ();
796 obj_elf_parse_section_letters (str
, len
)
813 attr
|= SHF_EXECINSTR
;
829 if (*(str
- 1) == 'a')
832 if (len
> 1 && str
[1] == 's')
841 char *bad_msg
= _("unrecognized .section attribute: want a,w,x,M,S,G,T");
842 #ifdef md_elf_section_letter
843 int md_attr
= md_elf_section_letter (*str
, &bad_msg
);
849 as_warn ("%s", bad_msg
);
862 obj_elf_section_word (str
, len
)
866 if (len
== 5 && strncmp (str
, "write", 5) == 0)
868 if (len
== 5 && strncmp (str
, "alloc", 5) == 0)
870 if (len
== 9 && strncmp (str
, "execinstr", 9) == 0)
871 return SHF_EXECINSTR
;
873 #ifdef md_elf_section_word
875 int md_attr
= md_elf_section_word (str
, len
);
881 as_warn (_("unrecognized section attribute"));
886 obj_elf_section_type (str
, len
)
890 if (len
== 8 && strncmp (str
, "progbits", 8) == 0)
892 if (len
== 6 && strncmp (str
, "nobits", 6) == 0)
895 #ifdef md_elf_section_type
897 int md_type
= md_elf_section_type (str
, len
);
903 as_warn (_("unrecognized section type"));
907 /* Get name of section. */
909 obj_elf_section_name ()
914 if (*input_line_pointer
== '"')
918 name
= demand_copy_C_string (&dummy
);
921 ignore_rest_of_line ();
927 char *end
= input_line_pointer
;
929 while (0 == strchr ("\n\t,; ", *end
))
931 if (end
== input_line_pointer
)
933 as_warn (_("missing name"));
934 ignore_rest_of_line ();
938 name
= xmalloc (end
- input_line_pointer
+ 1);
939 memcpy (name
, input_line_pointer
, end
- input_line_pointer
);
940 name
[end
- input_line_pointer
] = '\0';
941 input_line_pointer
= end
;
948 obj_elf_section (push
)
951 char *name
, *group_name
, *beg
;
952 int type
, attr
, dummy
;
961 #ifdef md_flush_pending_output
962 md_flush_pending_output ();
965 previous_section
= now_seg
;
966 previous_subsection
= now_subseg
;
968 s_mri_sect (&mri_type
);
970 #ifdef md_elf_section_change_hook
971 md_elf_section_change_hook ();
976 #endif /* ! defined (TC_I370) */
978 name
= obj_elf_section_name ();
987 if (*input_line_pointer
== ',')
989 /* Skip the comma. */
990 ++input_line_pointer
;
993 if (*input_line_pointer
== '"')
995 beg
= demand_copy_C_string (&dummy
);
998 ignore_rest_of_line ();
1001 attr
|= obj_elf_parse_section_letters (beg
, strlen (beg
));
1004 if (*input_line_pointer
== ',')
1007 char *save
= input_line_pointer
;
1009 ++input_line_pointer
;
1011 c
= *input_line_pointer
;
1014 beg
= demand_copy_C_string (&dummy
);
1017 ignore_rest_of_line ();
1020 type
= obj_elf_section_type (beg
, strlen (beg
));
1022 else if (c
== '@' || c
== '%')
1024 beg
= ++input_line_pointer
;
1025 c
= get_symbol_end ();
1026 *input_line_pointer
= c
;
1027 type
= obj_elf_section_type (beg
, input_line_pointer
- beg
);
1030 input_line_pointer
= save
;
1034 if ((attr
& SHF_MERGE
) != 0 && *input_line_pointer
== ',')
1036 ++input_line_pointer
;
1038 entsize
= get_absolute_expression ();
1042 as_warn (_("invalid merge entity size"));
1047 else if ((attr
& SHF_MERGE
) != 0)
1049 as_warn (_("entity size for SHF_MERGE not specified"));
1053 if ((attr
& SHF_GROUP
) != 0 && *input_line_pointer
== ',')
1055 ++input_line_pointer
;
1056 group_name
= obj_elf_section_name ();
1057 if (group_name
== NULL
)
1059 else if (strncmp (input_line_pointer
, ",comdat", 7) == 0)
1061 input_line_pointer
+= 7;
1064 else if (strncmp (name
, ".gnu.linkonce", 13) == 0)
1067 else if ((attr
& SHF_GROUP
) != 0)
1069 as_warn (_("group name for SHF_GROUP not specified"));
1080 if (*input_line_pointer
!= '#')
1082 as_warn (_("character following name is not '#'"));
1083 ignore_rest_of_line ();
1086 beg
= ++input_line_pointer
;
1087 c
= get_symbol_end ();
1088 *input_line_pointer
= c
;
1090 attr
|= obj_elf_section_word (beg
, input_line_pointer
- beg
);
1094 while (*input_line_pointer
++ == ',');
1095 --input_line_pointer
;
1099 demand_empty_rest_of_line ();
1101 obj_elf_change_section (name
, type
, attr
, entsize
, group_name
, linkonce
, push
);
1104 /* Change to the .data section. */
1110 #ifdef md_flush_pending_output
1111 md_flush_pending_output ();
1114 previous_section
= now_seg
;
1115 previous_subsection
= now_subseg
;
1118 #ifdef md_elf_section_change_hook
1119 md_elf_section_change_hook ();
1123 /* Change to the .text section. */
1129 #ifdef md_flush_pending_output
1130 md_flush_pending_output ();
1133 previous_section
= now_seg
;
1134 previous_subsection
= now_subseg
;
1137 #ifdef md_elf_section_change_hook
1138 md_elf_section_change_hook ();
1143 obj_elf_subsection (ignore
)
1144 int ignore ATTRIBUTE_UNUSED
;
1148 #ifdef md_flush_pending_output
1149 md_flush_pending_output ();
1152 previous_section
= now_seg
;
1153 previous_subsection
= now_subseg
;
1155 temp
= get_absolute_expression ();
1156 subseg_set (now_seg
, (subsegT
) temp
);
1157 demand_empty_rest_of_line ();
1159 #ifdef md_elf_section_change_hook
1160 md_elf_section_change_hook ();
1164 /* This can be called from the processor backends if they change
1168 obj_elf_section_change_hook ()
1170 previous_section
= now_seg
;
1171 previous_subsection
= now_subseg
;
1175 obj_elf_previous (ignore
)
1176 int ignore ATTRIBUTE_UNUSED
;
1181 if (previous_section
== 0)
1183 as_warn (_(".previous without corresponding .section; ignored"));
1187 #ifdef md_flush_pending_output
1188 md_flush_pending_output ();
1191 new_section
= previous_section
;
1192 new_subsection
= previous_subsection
;
1193 previous_section
= now_seg
;
1194 previous_subsection
= now_subseg
;
1195 subseg_set (new_section
, new_subsection
);
1197 #ifdef md_elf_section_change_hook
1198 md_elf_section_change_hook ();
1203 obj_elf_popsection (xxx
)
1204 int xxx ATTRIBUTE_UNUSED
;
1206 struct section_stack
*top
= section_stack
;
1210 as_warn (_(".popsection without corresponding .pushsection; ignored"));
1214 #ifdef md_flush_pending_output
1215 md_flush_pending_output ();
1218 section_stack
= top
->next
;
1219 previous_section
= top
->prev_seg
;
1220 previous_subsection
= top
->prev_subseg
;
1221 subseg_set (top
->seg
, top
->subseg
);
1224 #ifdef md_elf_section_change_hook
1225 md_elf_section_change_hook ();
1230 obj_elf_line (ignore
)
1231 int ignore ATTRIBUTE_UNUSED
;
1233 /* Assume delimiter is part of expression. BSD4.2 as fails with
1234 delightful bug, so we are not being incompatible here. */
1235 new_logical_line ((char *) NULL
, (int) (get_absolute_expression ()));
1236 demand_empty_rest_of_line ();
1239 /* This handles the .symver pseudo-op, which is used to specify a
1240 symbol version. The syntax is ``.symver NAME,SYMVERNAME''.
1241 SYMVERNAME may contain ELF_VER_CHR ('@') characters. This
1242 pseudo-op causes the assembler to emit a symbol named SYMVERNAME
1243 with the same value as the symbol NAME. */
1246 obj_elf_symver (ignore
)
1247 int ignore ATTRIBUTE_UNUSED
;
1254 name
= input_line_pointer
;
1255 c
= get_symbol_end ();
1257 sym
= symbol_find_or_make (name
);
1259 *input_line_pointer
= c
;
1262 if (*input_line_pointer
!= ',')
1264 as_bad (_("expected comma after name in .symver"));
1265 ignore_rest_of_line ();
1269 ++input_line_pointer
;
1270 name
= input_line_pointer
;
1272 /* Temporarily include '@' in symbol names. */
1273 old_lexat
= lex_type
[(unsigned char) '@'];
1274 lex_type
[(unsigned char) '@'] |= LEX_NAME
;
1275 c
= get_symbol_end ();
1276 lex_type
[(unsigned char) '@'] = old_lexat
;
1278 if (symbol_get_obj (sym
)->versioned_name
== NULL
)
1280 symbol_get_obj (sym
)->versioned_name
= xstrdup (name
);
1282 *input_line_pointer
= c
;
1284 if (strchr (symbol_get_obj (sym
)->versioned_name
,
1285 ELF_VER_CHR
) == NULL
)
1287 as_bad (_("missing version name in `%s' for symbol `%s'"),
1288 symbol_get_obj (sym
)->versioned_name
,
1290 ignore_rest_of_line ();
1296 if (strcmp (symbol_get_obj (sym
)->versioned_name
, name
))
1298 as_bad (_("multiple versions [`%s'|`%s'] for symbol `%s'"),
1299 name
, symbol_get_obj (sym
)->versioned_name
,
1301 ignore_rest_of_line ();
1305 *input_line_pointer
= c
;
1308 demand_empty_rest_of_line ();
1311 /* This handles the .vtable_inherit pseudo-op, which is used to indicate
1312 to the linker the hierarchy in which a particular table resides. The
1313 syntax is ".vtable_inherit CHILDNAME, PARENTNAME". */
1316 obj_elf_vtable_inherit (ignore
)
1317 int ignore ATTRIBUTE_UNUSED
;
1319 char *cname
, *pname
;
1320 symbolS
*csym
, *psym
;
1323 if (*input_line_pointer
== '#')
1324 ++input_line_pointer
;
1326 cname
= input_line_pointer
;
1327 c
= get_symbol_end ();
1328 csym
= symbol_find (cname
);
1330 /* GCFIXME: should check that we don't have two .vtable_inherits for
1331 the same child symbol. Also, we can currently only do this if the
1332 child symbol is already exists and is placed in a fragment. */
1334 if (csym
== NULL
|| symbol_get_frag (csym
) == NULL
)
1336 as_bad ("expected `%s' to have already been set for .vtable_inherit",
1341 *input_line_pointer
= c
;
1344 if (*input_line_pointer
!= ',')
1346 as_bad ("expected comma after name in .vtable_inherit");
1347 ignore_rest_of_line ();
1351 ++input_line_pointer
;
1354 if (*input_line_pointer
== '#')
1355 ++input_line_pointer
;
1357 if (input_line_pointer
[0] == '0'
1358 && (input_line_pointer
[1] == '\0'
1359 || ISSPACE (input_line_pointer
[1])))
1361 psym
= section_symbol (absolute_section
);
1362 ++input_line_pointer
;
1366 pname
= input_line_pointer
;
1367 c
= get_symbol_end ();
1368 psym
= symbol_find_or_make (pname
);
1369 *input_line_pointer
= c
;
1372 demand_empty_rest_of_line ();
1377 assert (symbol_get_value_expression (csym
)->X_op
== O_constant
);
1378 return fix_new (symbol_get_frag (csym
),
1379 symbol_get_value_expression (csym
)->X_add_number
,
1380 0, psym
, 0, 0, BFD_RELOC_VTABLE_INHERIT
);
1383 /* This handles the .vtable_entry pseudo-op, which is used to indicate
1384 to the linker that a vtable slot was used. The syntax is
1385 ".vtable_entry tablename, offset". */
1388 obj_elf_vtable_entry (ignore
)
1389 int ignore ATTRIBUTE_UNUSED
;
1396 if (*input_line_pointer
== '#')
1397 ++input_line_pointer
;
1399 name
= input_line_pointer
;
1400 c
= get_symbol_end ();
1401 sym
= symbol_find_or_make (name
);
1402 *input_line_pointer
= c
;
1405 if (*input_line_pointer
!= ',')
1407 as_bad ("expected comma after name in .vtable_entry");
1408 ignore_rest_of_line ();
1412 ++input_line_pointer
;
1413 if (*input_line_pointer
== '#')
1414 ++input_line_pointer
;
1416 offset
= get_absolute_expression ();
1418 demand_empty_rest_of_line ();
1420 return fix_new (frag_now
, frag_now_fix (), 0, sym
, offset
, 0,
1421 BFD_RELOC_VTABLE_ENTRY
);
1425 elf_obj_read_begin_hook ()
1427 #ifdef NEED_ECOFF_DEBUG
1428 if (ECOFF_DEBUGGING
)
1429 ecoff_read_begin_hook ();
1434 elf_obj_symbol_new_hook (symbolP
)
1437 struct elf_obj_sy
*sy_obj
;
1439 sy_obj
= symbol_get_obj (symbolP
);
1440 sy_obj
->size
= NULL
;
1441 sy_obj
->versioned_name
= NULL
;
1443 #ifdef NEED_ECOFF_DEBUG
1444 if (ECOFF_DEBUGGING
)
1445 ecoff_symbol_new_hook (symbolP
);
1449 /* When setting one symbol equal to another, by default we probably
1450 want them to have the same "size", whatever it means in the current
1454 elf_copy_symbol_attributes (dest
, src
)
1455 symbolS
*dest
, *src
;
1457 struct elf_obj_sy
*srcelf
= symbol_get_obj (src
);
1458 struct elf_obj_sy
*destelf
= symbol_get_obj (dest
);
1461 if (destelf
->size
== NULL
)
1463 (expressionS
*) xmalloc (sizeof (expressionS
));
1464 *destelf
->size
= *srcelf
->size
;
1468 if (destelf
->size
!= NULL
)
1469 free (destelf
->size
);
1470 destelf
->size
= NULL
;
1472 S_SET_SIZE (dest
, S_GET_SIZE (src
));
1473 /* Don't copy visibility. */
1474 S_SET_OTHER (dest
, (ELF_ST_VISIBILITY (S_GET_OTHER (dest
))
1475 | (S_GET_OTHER (src
) & ~ELF_ST_VISIBILITY (-1))));
1479 obj_elf_version (ignore
)
1480 int ignore ATTRIBUTE_UNUSED
;
1485 asection
*seg
= now_seg
;
1486 subsegT subseg
= now_subseg
;
1487 Elf_Internal_Note i_note
;
1488 Elf_External_Note e_note
;
1489 asection
*note_secp
= (asection
*) NULL
;
1493 if (*input_line_pointer
== '\"')
1495 ++input_line_pointer
; /* -> 1st char of string. */
1496 name
= input_line_pointer
;
1498 while (is_a_char (c
= next_char_of_string ()))
1500 c
= *input_line_pointer
;
1501 *input_line_pointer
= '\0';
1502 *(input_line_pointer
- 1) = '\0';
1503 *input_line_pointer
= c
;
1505 /* create the .note section */
1507 note_secp
= subseg_new (".note", 0);
1508 bfd_set_section_flags (stdoutput
,
1510 SEC_HAS_CONTENTS
| SEC_READONLY
);
1512 /* process the version string */
1514 len
= strlen (name
);
1516 i_note
.namesz
= ((len
+ 1) + 3) & ~3; /* round this to word boundary */
1517 i_note
.descsz
= 0; /* no description */
1518 i_note
.type
= NT_VERSION
;
1519 p
= frag_more (sizeof (e_note
.namesz
));
1520 md_number_to_chars (p
, (valueT
) i_note
.namesz
, sizeof (e_note
.namesz
));
1521 p
= frag_more (sizeof (e_note
.descsz
));
1522 md_number_to_chars (p
, (valueT
) i_note
.descsz
, sizeof (e_note
.descsz
));
1523 p
= frag_more (sizeof (e_note
.type
));
1524 md_number_to_chars (p
, (valueT
) i_note
.type
, sizeof (e_note
.type
));
1525 p
= frag_more (len
+ 1);
1528 frag_align (2, 0, 0);
1530 subseg_set (seg
, subseg
);
1534 as_bad (_("expected quoted string"));
1536 demand_empty_rest_of_line ();
1540 obj_elf_size (ignore
)
1541 int ignore ATTRIBUTE_UNUSED
;
1543 char *name
= input_line_pointer
;
1544 char c
= get_symbol_end ();
1549 p
= input_line_pointer
;
1552 if (*input_line_pointer
!= ',')
1555 as_bad (_("expected comma after name `%s' in .size directive"), name
);
1557 ignore_rest_of_line ();
1560 input_line_pointer
++;
1562 if (exp
.X_op
== O_absent
)
1564 as_bad (_("missing expression in .size directive"));
1565 exp
.X_op
= O_constant
;
1566 exp
.X_add_number
= 0;
1569 sym
= symbol_find_or_make (name
);
1571 if (exp
.X_op
== O_constant
)
1573 S_SET_SIZE (sym
, exp
.X_add_number
);
1574 if (symbol_get_obj (sym
)->size
)
1576 xfree (symbol_get_obj (sym
)->size
);
1577 symbol_get_obj (sym
)->size
= NULL
;
1582 symbol_get_obj (sym
)->size
=
1583 (expressionS
*) xmalloc (sizeof (expressionS
));
1584 *symbol_get_obj (sym
)->size
= exp
;
1586 demand_empty_rest_of_line ();
1589 /* Handle the ELF .type pseudo-op. This sets the type of a symbol.
1590 There are five syntaxes:
1592 The first (used on Solaris) is
1594 The second (used on UnixWare) is
1596 The third (reportedly to be used on Irix 6.0) is
1598 The fourth (used on NetBSD/Arm and Linux/ARM) is
1600 The fifth (used on SVR4/860) is
1601 .type SYM,"function"
1605 obj_elf_type (ignore
)
1606 int ignore ATTRIBUTE_UNUSED
;
1611 const char *typename
;
1613 elf_symbol_type
*elfsym
;
1615 name
= input_line_pointer
;
1616 c
= get_symbol_end ();
1617 sym
= symbol_find_or_make (name
);
1618 elfsym
= (elf_symbol_type
*) symbol_get_bfdsym (sym
);
1619 *input_line_pointer
= c
;
1622 if (*input_line_pointer
== ',')
1623 ++input_line_pointer
;
1626 if ( *input_line_pointer
== '#'
1627 || *input_line_pointer
== '@'
1628 || *input_line_pointer
== '"'
1629 || *input_line_pointer
== '%')
1630 ++input_line_pointer
;
1632 typename
= input_line_pointer
;
1633 c
= get_symbol_end ();
1636 if (strcmp (typename
, "function") == 0
1637 || strcmp (typename
, "STT_FUNC") == 0)
1638 type
= BSF_FUNCTION
;
1639 else if (strcmp (typename
, "object") == 0
1640 || strcmp (typename
, "STT_OBJECT") == 0)
1642 #ifdef md_elf_symbol_type
1643 else if ((type
= md_elf_symbol_type (typename
, sym
, elfsym
)) != -1)
1647 as_bad (_("unrecognized symbol type \"%s\""), typename
);
1649 *input_line_pointer
= c
;
1651 if (*input_line_pointer
== '"')
1652 ++input_line_pointer
;
1654 elfsym
->symbol
.flags
|= type
;
1656 demand_empty_rest_of_line ();
1660 obj_elf_ident (ignore
)
1661 int ignore ATTRIBUTE_UNUSED
;
1663 static segT comment_section
;
1664 segT old_section
= now_seg
;
1665 int old_subsection
= now_subseg
;
1667 #ifdef md_flush_pending_output
1668 md_flush_pending_output ();
1671 if (!comment_section
)
1674 comment_section
= subseg_new (".comment", 0);
1675 bfd_set_section_flags (stdoutput
, comment_section
,
1676 SEC_READONLY
| SEC_HAS_CONTENTS
);
1681 subseg_set (comment_section
, 0);
1683 subseg_set (old_section
, old_subsection
);
1686 #ifdef INIT_STAB_SECTION
1688 /* The first entry in a .stabs section is special. */
1691 obj_elf_init_stab_section (seg
)
1697 unsigned int stroff
;
1699 /* Force the section to align to a longword boundary. Without this,
1700 UnixWare ar crashes. */
1701 bfd_set_section_alignment (stdoutput
, seg
, 2);
1703 /* Make space for this first symbol. */
1707 as_where (&file
, (unsigned int *) NULL
);
1708 stabstr_name
= (char *) xmalloc (strlen (segment_name (seg
)) + 4);
1709 strcpy (stabstr_name
, segment_name (seg
));
1710 strcat (stabstr_name
, "str");
1711 stroff
= get_stab_string_offset (file
, stabstr_name
);
1713 md_number_to_chars (p
, stroff
, 4);
1714 seg_info (seg
)->stabu
.p
= p
;
1719 /* Fill in the counts in the first entry in a .stabs section. */
1722 adjust_stab_sections (abfd
, sec
, xxx
)
1725 PTR xxx ATTRIBUTE_UNUSED
;
1732 if (strncmp (".stab", sec
->name
, 5))
1734 if (!strcmp ("str", sec
->name
+ strlen (sec
->name
) - 3))
1737 name
= (char *) alloca (strlen (sec
->name
) + 4);
1738 strcpy (name
, sec
->name
);
1739 strcat (name
, "str");
1740 strsec
= bfd_get_section_by_name (abfd
, name
);
1742 strsz
= bfd_section_size (abfd
, strsec
);
1745 nsyms
= bfd_section_size (abfd
, sec
) / 12 - 1;
1747 p
= seg_info (sec
)->stabu
.p
;
1750 bfd_h_put_16 (abfd
, (bfd_vma
) nsyms
, (bfd_byte
*) p
+ 6);
1751 bfd_h_put_32 (abfd
, (bfd_vma
) strsz
, (bfd_byte
*) p
+ 8);
1754 #ifdef NEED_ECOFF_DEBUG
1756 /* This function is called by the ECOFF code. It is supposed to
1757 record the external symbol information so that the backend can
1758 write it out correctly. The ELF backend doesn't actually handle
1759 this at the moment, so we do it ourselves. We save the information
1763 elf_ecoff_set_ext (sym
, ext
)
1765 struct ecoff_extr
*ext
;
1767 symbol_get_bfdsym (sym
)->udata
.p
= (PTR
) ext
;
1770 /* This function is called by bfd_ecoff_debug_externals. It is
1771 supposed to *EXT to the external symbol information, and return
1772 whether the symbol should be used at all. */
1775 elf_get_extr (sym
, ext
)
1779 if (sym
->udata
.p
== NULL
)
1781 *ext
= *(EXTR
*) sym
->udata
.p
;
1785 /* This function is called by bfd_ecoff_debug_externals. It has
1786 nothing to do for ELF. */
1790 elf_set_index (sym
, indx
)
1791 asymbol
*sym ATTRIBUTE_UNUSED
;
1792 bfd_size_type indx ATTRIBUTE_UNUSED
;
1796 #endif /* NEED_ECOFF_DEBUG */
1799 elf_frob_symbol (symp
, puntp
)
1803 struct elf_obj_sy
*sy_obj
;
1805 #ifdef NEED_ECOFF_DEBUG
1806 if (ECOFF_DEBUGGING
)
1807 ecoff_frob_symbol (symp
);
1810 sy_obj
= symbol_get_obj (symp
);
1812 if (sy_obj
->size
!= NULL
)
1814 switch (sy_obj
->size
->X_op
)
1818 (S_GET_VALUE (sy_obj
->size
->X_add_symbol
)
1819 + sy_obj
->size
->X_add_number
1820 - S_GET_VALUE (sy_obj
->size
->X_op_symbol
)));
1824 (S_GET_VALUE (sy_obj
->size
->X_add_symbol
)
1825 + sy_obj
->size
->X_add_number
));
1828 as_bad (_(".size expression too complicated to fix up"));
1831 free (sy_obj
->size
);
1832 sy_obj
->size
= NULL
;
1835 if (sy_obj
->versioned_name
!= NULL
)
1839 p
= strchr (sy_obj
->versioned_name
, ELF_VER_CHR
);
1842 /* This symbol was given a new name with the .symver directive.
1844 If this is an external reference, just rename the symbol to
1845 include the version string. This will make the relocs be
1846 against the correct versioned symbol.
1848 If this is a definition, add an alias. FIXME: Using an alias
1849 will permit the debugging information to refer to the right
1850 symbol. However, it's not clear whether it is the best
1853 if (! S_IS_DEFINED (symp
))
1855 /* Verify that the name isn't using the @@ syntax--this is
1856 reserved for definitions of the default version to link
1858 if (p
[1] == ELF_VER_CHR
)
1860 as_bad (_("invalid attempt to declare external version name as default in symbol `%s'"),
1861 sy_obj
->versioned_name
);
1864 S_SET_NAME (symp
, sy_obj
->versioned_name
);
1868 if (p
[1] == ELF_VER_CHR
&& p
[2] == ELF_VER_CHR
)
1872 /* The @@@ syntax is a special case. It renames the
1873 symbol name to versioned_name with one `@' removed. */
1874 l
= strlen (&p
[3]) + 1;
1875 memmove (&p
[2], &p
[3], l
);
1876 S_SET_NAME (symp
, sy_obj
->versioned_name
);
1882 /* FIXME: Creating a new symbol here is risky. We're
1883 in the final loop over the symbol table. We can
1884 get away with it only because the symbol goes to
1885 the end of the list, where the loop will still see
1886 it. It would probably be better to do this in
1887 obj_frob_file_before_adjust. */
1889 symp2
= symbol_find_or_make (sy_obj
->versioned_name
);
1891 /* Now we act as though we saw symp2 = sym. */
1893 S_SET_SEGMENT (symp2
, S_GET_SEGMENT (symp
));
1895 /* Subtracting out the frag address here is a hack
1896 because we are in the middle of the final loop. */
1899 - symbol_get_frag (symp
)->fr_address
));
1901 symbol_set_frag (symp2
, symbol_get_frag (symp
));
1903 /* This will copy over the size information. */
1904 copy_symbol_attributes (symp2
, symp
);
1906 S_SET_OTHER (symp2
, S_GET_OTHER (symp
));
1908 if (S_IS_WEAK (symp
))
1911 if (S_IS_EXTERNAL (symp
))
1912 S_SET_EXTERNAL (symp2
);
1917 /* Double check weak symbols. */
1918 if (S_IS_WEAK (symp
))
1920 if (S_IS_COMMON (symp
))
1921 as_bad (_("symbol `%s' can not be both weak and common"),
1926 /* The Irix 5 and 6 assemblers set the type of any common symbol and
1927 any undefined non-function symbol to STT_OBJECT. We try to be
1928 compatible, since newer Irix 5 and 6 linkers care. However, we
1929 only set undefined symbols to be STT_OBJECT if we are on Irix,
1930 because that is the only time gcc will generate the necessary
1931 .global directives to mark functions. */
1933 if (S_IS_COMMON (symp
))
1934 symbol_get_bfdsym (symp
)->flags
|= BSF_OBJECT
;
1936 if (strstr (TARGET_OS
, "irix") != NULL
1937 && ! S_IS_DEFINED (symp
)
1938 && (symbol_get_bfdsym (symp
)->flags
& BSF_FUNCTION
) == 0)
1939 symbol_get_bfdsym (symp
)->flags
|= BSF_OBJECT
;
1943 /* If TC_PPC is defined, we used to force the type of a symbol to be
1944 BSF_OBJECT if it was otherwise unset. This was required by some
1945 version of VxWorks. Thomas de Lellis <tdel@windriver.com> says
1946 that this is no longer needed, so it is now commented out. */
1947 if ((symbol_get_bfdsym (symp
)->flags
1948 & (BSF_FUNCTION
| BSF_FILE
| BSF_SECTION_SYM
)) == 0
1949 && S_IS_DEFINED (symp
))
1950 symbol_get_bfdsym (symp
)->flags
|= BSF_OBJECT
;
1956 asection
**head
; /* Section lists. */
1957 unsigned int *elt_count
; /* Number of sections in each list. */
1958 unsigned int num_group
; /* Number of lists. */
1961 /* Called via bfd_map_over_sections. If SEC is a member of a group,
1962 add it to a list of sections belonging to the group. INF is a
1963 pointer to a struct group_list, which is where we store the head of
1967 build_group_lists (abfd
, sec
, inf
)
1968 bfd
*abfd ATTRIBUTE_UNUSED
;
1972 struct group_list
*list
= (struct group_list
*) inf
;
1973 const char *group_name
= elf_group_name (sec
);
1976 if (group_name
== NULL
)
1979 /* If this group already has a list, add the section to the head of
1981 for (i
= 0; i
< list
->num_group
; i
++)
1983 if (strcmp (group_name
, elf_group_name (list
->head
[i
])) == 0)
1985 elf_next_in_group (sec
) = list
->head
[i
];
1986 list
->head
[i
] = sec
;
1987 list
->elt_count
[i
] += 1;
1992 /* New group. Make the arrays bigger in chunks to minimize calls to
1994 i
= list
->num_group
;
1997 unsigned int newsize
= i
+ 128;
1998 list
->head
= xrealloc (list
->head
, newsize
* sizeof (*list
->head
));
1999 list
->elt_count
= xrealloc (list
->elt_count
,
2000 newsize
* sizeof (*list
->elt_count
));
2002 list
->head
[i
] = sec
;
2003 list
->elt_count
[i
] = 1;
2004 list
->num_group
+= 1;
2010 struct group_list list
;
2013 bfd_map_over_sections (stdoutput
, adjust_stab_sections
, (PTR
) 0);
2015 /* Go find section groups. */
2018 list
.elt_count
= NULL
;
2019 bfd_map_over_sections (stdoutput
, build_group_lists
, (PTR
) &list
);
2021 /* Make the SHT_GROUP sections that describe each section group. We
2022 can't set up the section contents here yet, because elf section
2023 indices have yet to be calculated. elf.c:set_group_contents does
2024 the rest of the work. */
2025 for (i
= 0; i
< list
.num_group
; i
++)
2027 const char *group_name
= elf_group_name (list
.head
[i
]);
2028 const char *sec_name
;
2034 flags
= SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
| SEC_GROUP
;
2035 for (s
= list
.head
[i
]; s
!= NULL
; s
= elf_next_in_group (s
))
2036 if (elf_linkonce_p (s
) != ((flags
& SEC_LINK_ONCE
) != 0))
2038 flags
|= SEC_LINK_ONCE
| SEC_LINK_DUPLICATES_DISCARD
;
2039 if (s
!= list
.head
[i
])
2041 as_warn (_("assuming all members of group `%s' are COMDAT"),
2047 sec_name
= group_name
;
2048 sy
= symbol_find_exact (group_name
);
2051 && (sy
== symbol_lastP
2052 || (sy
->sy_next
!= NULL
2053 && sy
->sy_next
->sy_previous
== sy
)))
2056 sec_name
= ".group";
2058 s
= subseg_force_new (sec_name
, 0);
2060 || !bfd_set_section_flags (stdoutput
, s
, flags
)
2061 || !bfd_set_section_alignment (stdoutput
, s
, 2))
2063 as_fatal (_("can't create group: %s"),
2064 bfd_errmsg (bfd_get_error ()));
2067 /* Pass a pointer to the first section in this group. */
2068 elf_next_in_group (s
) = list
.head
[i
];
2070 elf_group_id (s
) = sy
->bsym
;
2072 s
->_raw_size
= 4 * (list
.elt_count
[i
] + 1);
2073 s
->contents
= frag_more (s
->_raw_size
);
2074 frag_now
->fr_fix
= frag_now_fix_octets ();
2077 #ifdef elf_tc_final_processing
2078 elf_tc_final_processing ();
2082 /* It removes any unneeded versioned symbols from the symbol table. */
2085 elf_frob_file_before_adjust ()
2091 for (symp
= symbol_rootP
; symp
; symp
= symbol_next (symp
))
2092 if (!S_IS_DEFINED (symp
))
2094 if (symbol_get_obj (symp
)->versioned_name
)
2098 /* The @@@ syntax is a special case. If the symbol is
2099 not defined, 2 `@'s will be removed from the
2102 p
= strchr (symbol_get_obj (symp
)->versioned_name
,
2105 if (p
[1] == ELF_VER_CHR
&& p
[2] == ELF_VER_CHR
)
2107 size_t l
= strlen (&p
[3]) + 1;
2108 memmove (&p
[1], &p
[3], l
);
2110 if (symbol_used_p (symp
) == 0
2111 && symbol_used_in_reloc_p (symp
) == 0)
2112 symbol_remove (symp
, &symbol_rootP
, &symbol_lastP
);
2115 /* If there was .weak foo, but foo was neither defined nor
2116 used anywhere, remove it. */
2118 else if (S_IS_WEAK (symp
)
2119 && symbol_used_p (symp
) == 0
2120 && symbol_used_in_reloc_p (symp
) == 0)
2121 symbol_remove (symp
, &symbol_rootP
, &symbol_lastP
);
2126 /* It is required that we let write_relocs have the opportunity to
2127 optimize away fixups before output has begun, since it is possible
2128 to eliminate all fixups for a section and thus we never should
2129 have generated the relocation section. */
2132 elf_frob_file_after_relocs ()
2134 #ifdef NEED_ECOFF_DEBUG
2135 if (ECOFF_DEBUGGING
)
2136 /* Generate the ECOFF debugging information. */
2138 const struct ecoff_debug_swap
*debug_swap
;
2139 struct ecoff_debug_info debug
;
2144 = get_elf_backend_data (stdoutput
)->elf_backend_ecoff_debug_swap
;
2145 know (debug_swap
!= (const struct ecoff_debug_swap
*) NULL
);
2146 ecoff_build_debug (&debug
.symbolic_header
, &buf
, debug_swap
);
2148 /* Set up the pointers in debug. */
2149 #define SET(ptr, offset, type) \
2150 debug.ptr = (type) (buf + debug.symbolic_header.offset)
2152 SET (line
, cbLineOffset
, unsigned char *);
2153 SET (external_dnr
, cbDnOffset
, PTR
);
2154 SET (external_pdr
, cbPdOffset
, PTR
);
2155 SET (external_sym
, cbSymOffset
, PTR
);
2156 SET (external_opt
, cbOptOffset
, PTR
);
2157 SET (external_aux
, cbAuxOffset
, union aux_ext
*);
2158 SET (ss
, cbSsOffset
, char *);
2159 SET (external_fdr
, cbFdOffset
, PTR
);
2160 SET (external_rfd
, cbRfdOffset
, PTR
);
2161 /* ssext and external_ext are set up just below. */
2165 /* Set up the external symbols. */
2166 debug
.ssext
= debug
.ssext_end
= NULL
;
2167 debug
.external_ext
= debug
.external_ext_end
= NULL
;
2168 if (! bfd_ecoff_debug_externals (stdoutput
, &debug
, debug_swap
, true,
2169 elf_get_extr
, elf_set_index
))
2170 as_fatal (_("failed to set up debugging information: %s"),
2171 bfd_errmsg (bfd_get_error ()));
2173 sec
= bfd_get_section_by_name (stdoutput
, ".mdebug");
2174 assert (sec
!= NULL
);
2176 know (stdoutput
->output_has_begun
== false);
2178 /* We set the size of the section, call bfd_set_section_contents
2179 to force the ELF backend to allocate a file position, and then
2180 write out the data. FIXME: Is this really the best way to do
2182 sec
->_raw_size
= bfd_ecoff_debug_size (stdoutput
, &debug
, debug_swap
);
2184 /* Pass BUF to bfd_set_section_contents because this will
2185 eventually become a call to fwrite, and ISO C prohibits
2186 passing a NULL pointer to a stdio function even if the
2187 pointer will not be used. */
2188 if (! bfd_set_section_contents (stdoutput
, sec
, (PTR
) buf
,
2189 (file_ptr
) 0, (bfd_size_type
) 0))
2190 as_fatal (_("can't start writing .mdebug section: %s"),
2191 bfd_errmsg (bfd_get_error ()));
2193 know (stdoutput
->output_has_begun
== true);
2194 know (sec
->filepos
!= 0);
2196 if (! bfd_ecoff_write_debug (stdoutput
, &debug
, debug_swap
,
2198 as_fatal (_("could not write .mdebug section: %s"),
2199 bfd_errmsg (bfd_get_error ()));
2201 #endif /* NEED_ECOFF_DEBUG */
2206 /* Heavily plagarized from obj_elf_version. The idea is to emit the
2207 SCO specific identifier in the .notes section to satisfy the SCO
2210 This looks more complicated than it really is. As opposed to the
2211 "obvious" solution, this should handle the cross dev cases
2212 correctly. (i.e, hosting on a 64 bit big endian processor, but
2213 generating SCO Elf code) Efficiency isn't a concern, as there
2214 should be exactly one of these sections per object module.
2216 SCO OpenServer 5 identifies it's ELF modules with a standard ELF
2219 int_32 namesz = 4 ; Name size
2220 int_32 descsz = 12 ; Descriptive information
2222 char name[4] = "SCO" ; Originator name ALWAYS SCO + NULL
2223 int_32 version = (major ver # << 16) | version of tools ;
2224 int_32 source = (tool_id << 16 ) | 1 ;
2225 int_32 info = 0 ; These are set by the SCO tools, but we
2226 don't know enough about the source
2227 environment to set them. SCO ld currently
2228 ignores them, and recommends we set them
2231 #define SCO_MAJOR_VERSION 0x1
2232 #define SCO_MINOR_VERSION 0x1
2242 asection
*seg
= now_seg
;
2243 subsegT subseg
= now_subseg
;
2244 Elf_Internal_Note i_note
;
2245 Elf_External_Note e_note
;
2246 asection
*note_secp
= (asection
*) NULL
;
2249 /* create the .note section */
2251 note_secp
= subseg_new (".note", 0);
2252 bfd_set_section_flags (stdoutput
,
2254 SEC_HAS_CONTENTS
| SEC_READONLY
);
2256 /* process the version string */
2259 i_note
.descsz
= 12; /* 12 descriptive bytes */
2260 i_note
.type
= NT_VERSION
; /* Contains a version string */
2262 p
= frag_more (sizeof (i_note
.namesz
));
2263 md_number_to_chars (p
, (valueT
) i_note
.namesz
, 4);
2265 p
= frag_more (sizeof (i_note
.descsz
));
2266 md_number_to_chars (p
, (valueT
) i_note
.descsz
, 4);
2268 p
= frag_more (sizeof (i_note
.type
));
2269 md_number_to_chars (p
, (valueT
) i_note
.type
, 4);
2274 /* Note: this is the version number of the ELF we're representing */
2276 md_number_to_chars (p
, (SCO_MAJOR_VERSION
<< 16) | (SCO_MINOR_VERSION
), 4);
2278 /* Here, we pick a magic number for ourselves (yes, I "registered"
2279 it with SCO. The bottom bit shows that we are compat with the
2282 md_number_to_chars (p
, 0x4c520000 | 0x0001, 4);
2284 /* If we knew (or cared) what the source language options were, we'd
2285 fill them in here. SCO has given us permission to ignore these
2286 and just set them to zero. */
2288 md_number_to_chars (p
, 0x0000, 4);
2290 frag_align (2, 0, 0);
2292 /* We probably can't restore the current segment, for there likely
2295 subseg_set (seg
, subseg
);
2299 #endif /* SCO_ELF */
2302 elf_separate_stab_sections ()
2304 #ifdef NEED_ECOFF_DEBUG
2305 return (!ECOFF_DEBUGGING
);
2312 elf_init_stab_section (seg
)
2315 #ifdef NEED_ECOFF_DEBUG
2316 if (!ECOFF_DEBUGGING
)
2318 obj_elf_init_stab_section (seg
);
2321 const struct format_ops elf_format_ops
=
2323 bfd_target_elf_flavour
,
2324 0, /* dfl_leading_underscore */
2325 1, /* emit_section_symbols */
2330 elf_frob_file_before_adjust
,
2331 0, /* obj_frob_file_before_fix */
2332 elf_frob_file_after_relocs
,
2333 elf_s_get_size
, elf_s_set_size
,
2334 elf_s_get_align
, elf_s_set_align
,
2341 elf_copy_symbol_attributes
,
2342 #ifdef NEED_ECOFF_DEBUG
2343 ecoff_generate_asm_lineno
,
2346 0, /* generate_asm_lineno */
2347 0, /* process_stab */
2349 elf_separate_stab_sections
,
2350 elf_init_stab_section
,
2351 elf_sec_sym_ok_for_reloc
,
2353 #ifdef NEED_ECOFF_DEBUG
2356 0, /* ecoff_set_ext */
2358 elf_obj_read_begin_hook
,
2359 elf_obj_symbol_new_hook