gas/ELF: don't accumulate .type settings
[external/binutils.git] / gas / config / obj-elf.c
1 /* ELF object file format
2    Copyright (C) 1992-2019 Free Software Foundation, Inc.
3
4    This file is part of GAS, the GNU Assembler.
5
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.
10
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.
15
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
19    02110-1301, USA.  */
20
21 #define OBJ_HEADER "obj-elf.h"
22 #include "as.h"
23 #include "safe-ctype.h"
24 #include "subsegs.h"
25 #include "obstack.h"
26 #include "dwarf2dbg.h"
27
28 #ifndef ECOFF_DEBUGGING
29 #define ECOFF_DEBUGGING 0
30 #else
31 #define NEED_ECOFF_DEBUG
32 #endif
33
34 #ifdef NEED_ECOFF_DEBUG
35 #include "ecoff.h"
36 #endif
37
38 #ifdef TC_ALPHA
39 #include "elf/alpha.h"
40 #endif
41
42 #ifdef TC_MIPS
43 #include "elf/mips.h"
44 #endif
45
46 #ifdef TC_PPC
47 #include "elf/ppc.h"
48 #endif
49
50 #ifdef TC_I386
51 #include "elf/x86-64.h"
52 #endif
53
54 #ifdef TC_MEP
55 #include "elf/mep.h"
56 #endif
57
58 #ifdef TC_NIOS2
59 #include "elf/nios2.h"
60 #endif
61
62 #ifdef TC_PRU
63 #include "elf/pru.h"
64 #endif
65
66 static void obj_elf_line (int);
67 static void obj_elf_size (int);
68 static void obj_elf_type (int);
69 static void obj_elf_ident (int);
70 static void obj_elf_weak (int);
71 static void obj_elf_local (int);
72 static void obj_elf_visibility (int);
73 static void obj_elf_symver (int);
74 static void obj_elf_subsection (int);
75 static void obj_elf_popsection (int);
76 static void obj_elf_gnu_attribute (int);
77 static void obj_elf_tls_common (int);
78 static void obj_elf_lcomm (int);
79 static void obj_elf_struct (int);
80
81 static const pseudo_typeS elf_pseudo_table[] =
82 {
83   {"comm", obj_elf_common, 0},
84   {"common", obj_elf_common, 1},
85   {"ident", obj_elf_ident, 0},
86   {"lcomm", obj_elf_lcomm, 0},
87   {"local", obj_elf_local, 0},
88   {"previous", obj_elf_previous, 0},
89   {"section", obj_elf_section, 0},
90   {"section.s", obj_elf_section, 0},
91   {"sect", obj_elf_section, 0},
92   {"sect.s", obj_elf_section, 0},
93   {"pushsection", obj_elf_section, 1},
94   {"popsection", obj_elf_popsection, 0},
95   {"size", obj_elf_size, 0},
96   {"type", obj_elf_type, 0},
97   {"version", obj_elf_version, 0},
98   {"weak", obj_elf_weak, 0},
99
100   /* These define symbol visibility.  */
101   {"internal", obj_elf_visibility, STV_INTERNAL},
102   {"hidden", obj_elf_visibility, STV_HIDDEN},
103   {"protected", obj_elf_visibility, STV_PROTECTED},
104
105   /* These are used for stabs-in-elf configurations.  */
106   {"line", obj_elf_line, 0},
107
108   /* This is a GNU extension to handle symbol versions.  */
109   {"symver", obj_elf_symver, 0},
110
111   /* A GNU extension to change subsection only.  */
112   {"subsection", obj_elf_subsection, 0},
113
114   /* These are GNU extensions to aid in garbage collecting C++ vtables.  */
115   {"vtable_inherit", obj_elf_vtable_inherit, 0},
116   {"vtable_entry", obj_elf_vtable_entry, 0},
117
118   /* A GNU extension for object attributes.  */
119   {"gnu_attribute", obj_elf_gnu_attribute, 0},
120
121   /* These are used for dwarf.  */
122   {"2byte", cons, 2},
123   {"4byte", cons, 4},
124   {"8byte", cons, 8},
125   /* These are used for dwarf2.  */
126   { "file", dwarf2_directive_file, 0 },
127   { "loc",  dwarf2_directive_loc,  0 },
128   { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
129
130   /* We need to trap the section changing calls to handle .previous.  */
131   {"data", obj_elf_data, 0},
132   {"offset", obj_elf_struct, 0},
133   {"struct", obj_elf_struct, 0},
134   {"text", obj_elf_text, 0},
135
136   {"tls_common", obj_elf_tls_common, 0},
137
138   /* End sentinel.  */
139   {NULL, NULL, 0},
140 };
141
142 static const pseudo_typeS ecoff_debug_pseudo_table[] =
143 {
144 #ifdef NEED_ECOFF_DEBUG
145   /* COFF style debugging information for ECOFF. .ln is not used; .loc
146      is used instead.  */
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 },
154
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 },
160
161   /* ECOFF specific debugging information.  */
162   { "aent",     ecoff_directive_ent,    1 },
163   { "begin",    ecoff_directive_begin,  0 },
164   { "bend",     ecoff_directive_bend,   0 },
165   { "end",      ecoff_directive_end,    0 },
166   { "ent",      ecoff_directive_ent,    0 },
167   { "fmask",    ecoff_directive_fmask,  0 },
168   { "frame",    ecoff_directive_frame,  0 },
169   { "loc",      ecoff_directive_loc,    0 },
170   { "mask",     ecoff_directive_mask,   0 },
171
172   /* Other ECOFF directives.  */
173   { "extern",   ecoff_directive_extern, 0 },
174
175   /* These are used on Irix.  I don't know how to implement them.  */
176   { "alias",    s_ignore,               0 },
177   { "bgnb",     s_ignore,               0 },
178   { "endb",     s_ignore,               0 },
179   { "lab",      s_ignore,               0 },
180   { "noalias",  s_ignore,               0 },
181   { "verstamp", s_ignore,               0 },
182   { "vreg",     s_ignore,               0 },
183 #endif
184
185   {NULL, NULL, 0}                       /* end sentinel */
186 };
187
188 #undef NO_RELOC
189 #include "aout/aout64.h"
190
191 /* This is called when the assembler starts.  */
192
193 asection *elf_com_section_ptr;
194
195 void
196 elf_begin (void)
197 {
198   asection *s;
199
200   /* Add symbols for the known sections to the symbol table.  */
201   s = bfd_get_section_by_name (stdoutput, TEXT_SECTION_NAME);
202   symbol_table_insert (section_symbol (s));
203   s = bfd_get_section_by_name (stdoutput, DATA_SECTION_NAME);
204   symbol_table_insert (section_symbol (s));
205   s = bfd_get_section_by_name (stdoutput, BSS_SECTION_NAME);
206   symbol_table_insert (section_symbol (s));
207   elf_com_section_ptr = bfd_com_section_ptr;
208 }
209
210 void
211 elf_pop_insert (void)
212 {
213   pop_insert (elf_pseudo_table);
214   if (ECOFF_DEBUGGING)
215     pop_insert (ecoff_debug_pseudo_table);
216 }
217
218 static bfd_vma
219 elf_s_get_size (symbolS *sym)
220 {
221   return S_GET_SIZE (sym);
222 }
223
224 static void
225 elf_s_set_size (symbolS *sym, bfd_vma sz)
226 {
227   S_SET_SIZE (sym, sz);
228 }
229
230 static bfd_vma
231 elf_s_get_align (symbolS *sym)
232 {
233   return S_GET_ALIGN (sym);
234 }
235
236 static void
237 elf_s_set_align (symbolS *sym, bfd_vma align)
238 {
239   S_SET_ALIGN (sym, align);
240 }
241
242 int
243 elf_s_get_other (symbolS *sym)
244 {
245   return elf_symbol (symbol_get_bfdsym (sym))->internal_elf_sym.st_other;
246 }
247
248 static void
249 elf_s_set_other (symbolS *sym, int other)
250 {
251   S_SET_OTHER (sym, other);
252 }
253
254 static int
255 elf_sec_sym_ok_for_reloc (asection *sec)
256 {
257   return obj_sec_sym_ok_for_reloc (sec);
258 }
259
260 void
261 elf_file_symbol (const char *s, int appfile)
262 {
263   asymbol *bsym;
264
265   if (!appfile
266       || symbol_rootP == NULL
267       || (bsym = symbol_get_bfdsym (symbol_rootP)) == NULL
268       || (bsym->flags & BSF_FILE) == 0)
269     {
270       symbolS *sym;
271       size_t name_length;
272
273       sym = symbol_new (s, absolute_section, 0, NULL);
274       symbol_set_frag (sym, &zero_address_frag);
275
276       name_length = strlen (s);
277       if (name_length > strlen (S_GET_NAME (sym)))
278         {
279           obstack_grow (&notes, s, name_length + 1);
280           S_SET_NAME (sym, (const char *) obstack_finish (&notes));
281         }
282       else
283         strcpy ((char *) S_GET_NAME (sym), s);
284
285       symbol_get_bfdsym (sym)->flags |= BSF_FILE;
286
287       if (symbol_rootP != sym
288           && ((bsym = symbol_get_bfdsym (symbol_rootP)) == NULL
289               || (bsym->flags & BSF_FILE) == 0))
290         {
291           symbol_remove (sym, &symbol_rootP, &symbol_lastP);
292           symbol_insert (sym, symbol_rootP, &symbol_rootP, &symbol_lastP);
293         }
294
295 #ifdef DEBUG
296       verify_symbol_chain (symbol_rootP, symbol_lastP);
297 #endif
298     }
299
300 #ifdef NEED_ECOFF_DEBUG
301   ecoff_new_file (s, appfile);
302 #endif
303 }
304
305 /* Called from read.c:s_comm after we've parsed .comm symbol, size.
306    Parse a possible alignment value.  */
307
308 symbolS *
309 elf_common_parse (int ignore ATTRIBUTE_UNUSED, symbolS *symbolP, addressT size)
310 {
311   addressT align = 0;
312   int is_local = symbol_get_obj (symbolP)->local;
313
314   if (*input_line_pointer == ',')
315     {
316       char *save = input_line_pointer;
317
318       input_line_pointer++;
319       SKIP_WHITESPACE ();
320
321       if (*input_line_pointer == '"')
322         {
323           /* For sparc.  Accept .common symbol, length, "bss"  */
324           input_line_pointer++;
325           /* Some use the dot, some don't.  */
326           if (*input_line_pointer == '.')
327             input_line_pointer++;
328           /* Some say data, some say bss.  */
329           if (strncmp (input_line_pointer, "bss\"", 4) == 0)
330             input_line_pointer += 4;
331           else if (strncmp (input_line_pointer, "data\"", 5) == 0)
332             input_line_pointer += 5;
333           else
334             {
335               char *p = input_line_pointer;
336               char c;
337
338               while (*--p != '"')
339                 ;
340               while (!is_end_of_line[(unsigned char) *input_line_pointer])
341                 if (*input_line_pointer++ == '"')
342                   break;
343               c = *input_line_pointer;
344               *input_line_pointer = '\0';
345               as_bad (_("bad .common segment %s"), p);
346               *input_line_pointer = c;
347               ignore_rest_of_line ();
348               return NULL;
349             }
350           /* ??? Don't ask me why these are always global.  */
351           is_local = 0;
352         }
353       else
354         {
355           input_line_pointer = save;
356           align = parse_align (is_local);
357           if (align == (addressT) -1)
358             return NULL;
359         }
360     }
361
362   if (is_local)
363     {
364       bss_alloc (symbolP, size, align);
365       S_CLEAR_EXTERNAL (symbolP);
366     }
367   else
368     {
369       S_SET_VALUE (symbolP, size);
370       S_SET_ALIGN (symbolP, align);
371       S_SET_EXTERNAL (symbolP);
372       S_SET_SEGMENT (symbolP, elf_com_section_ptr);
373     }
374
375   symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
376
377   return symbolP;
378 }
379
380 void
381 obj_elf_common (int is_common)
382 {
383   if (flag_mri && is_common)
384     s_mri_common (0);
385   else
386     s_comm_internal (0, elf_common_parse);
387 }
388
389 static void
390 obj_elf_tls_common (int ignore ATTRIBUTE_UNUSED)
391 {
392   symbolS *symbolP = s_comm_internal (0, elf_common_parse);
393
394   if (symbolP)
395     symbol_get_bfdsym (symbolP)->flags |= BSF_THREAD_LOCAL;
396 }
397
398 static void
399 obj_elf_lcomm (int ignore ATTRIBUTE_UNUSED)
400 {
401   symbolS *symbolP = s_comm_internal (0, s_lcomm_internal);
402
403   if (symbolP)
404     symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
405 }
406
407 static symbolS *
408 get_sym_from_input_line_and_check (void)
409 {
410   char *name;
411   char c;
412   symbolS *sym;
413
414   c = get_symbol_name (& name);
415   sym = symbol_find_or_make (name);
416   *input_line_pointer = c;
417   SKIP_WHITESPACE_AFTER_NAME ();
418
419   /* There is no symbol name if input_line_pointer has not moved.  */
420   if (name == input_line_pointer)
421     as_bad (_("Missing symbol name in directive"));
422   return sym;
423 }
424
425 static void
426 obj_elf_local (int ignore ATTRIBUTE_UNUSED)
427 {
428   int c;
429   symbolS *symbolP;
430
431   do
432     {
433       symbolP = get_sym_from_input_line_and_check ();
434       c = *input_line_pointer;
435       S_CLEAR_EXTERNAL (symbolP);
436       symbol_get_obj (symbolP)->local = 1;
437       if (c == ',')
438         {
439           input_line_pointer++;
440           SKIP_WHITESPACE ();
441           if (*input_line_pointer == '\n')
442             c = '\n';
443         }
444     }
445   while (c == ',');
446   demand_empty_rest_of_line ();
447 }
448
449 static void
450 obj_elf_weak (int ignore ATTRIBUTE_UNUSED)
451 {
452   int c;
453   symbolS *symbolP;
454
455   do
456     {
457       symbolP = get_sym_from_input_line_and_check ();
458       c = *input_line_pointer;
459       S_SET_WEAK (symbolP);
460       if (c == ',')
461         {
462           input_line_pointer++;
463           SKIP_WHITESPACE ();
464           if (*input_line_pointer == '\n')
465             c = '\n';
466         }
467     }
468   while (c == ',');
469   demand_empty_rest_of_line ();
470 }
471
472 static void
473 obj_elf_visibility (int visibility)
474 {
475   int c;
476   symbolS *symbolP;
477   asymbol *bfdsym;
478   elf_symbol_type *elfsym;
479
480   do
481     {
482       symbolP = get_sym_from_input_line_and_check ();
483
484       bfdsym = symbol_get_bfdsym (symbolP);
485       elfsym = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym);
486
487       gas_assert (elfsym);
488
489       elfsym->internal_elf_sym.st_other &= ~3;
490       elfsym->internal_elf_sym.st_other |= visibility;
491
492       c = *input_line_pointer;
493       if (c == ',')
494         {
495           input_line_pointer ++;
496
497           SKIP_WHITESPACE ();
498
499           if (*input_line_pointer == '\n')
500             c = '\n';
501         }
502     }
503   while (c == ',');
504
505   demand_empty_rest_of_line ();
506 }
507
508 static segT previous_section;
509 static int previous_subsection;
510
511 struct section_stack
512 {
513   struct section_stack *next;
514   segT seg, prev_seg;
515   int subseg, prev_subseg;
516 };
517
518 static struct section_stack *section_stack;
519
520 /* Match both section group name and the sh_info field.  */
521 struct section_match
522 {
523   const char *group_name;
524   unsigned int info;
525 };
526
527 static bfd_boolean
528 get_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
529 {
530   struct section_match *match = (struct section_match *) inf;
531   const char *gname = match->group_name;
532   const char *group_name = elf_group_name (sec);
533   unsigned int info = elf_section_data (sec)->this_hdr.sh_info;
534
535   return (info == match->info
536           && (group_name == gname
537               || (group_name != NULL
538                   && gname != NULL
539                   && strcmp (group_name, gname) == 0)));
540 }
541
542 /* Handle the .section pseudo-op.  This code supports two different
543    syntaxes.
544
545    The first is found on Solaris, and looks like
546        .section ".sec1",#alloc,#execinstr,#write
547    Here the names after '#' are the SHF_* flags to turn on for the
548    section.  I'm not sure how it determines the SHT_* type (BFD
549    doesn't really give us control over the type, anyhow).
550
551    The second format is found on UnixWare, and probably most SVR4
552    machines, and looks like
553        .section .sec1,"a",@progbits
554    The quoted string may contain any combination of a, w, x, and
555    represents the SHF_* flags to turn on for the section.  The string
556    beginning with '@' can be progbits or nobits.  There should be
557    other possibilities, but I don't know what they are.  In any case,
558    BFD doesn't really let us set the section type.  */
559
560 void
561 obj_elf_change_section (const char *name,
562                         unsigned int type,
563                         unsigned int info,
564                         bfd_vma attr,
565                         int entsize,
566                         const char *group_name,
567                         int linkonce,
568                         int push)
569 {
570   asection *old_sec;
571   segT sec;
572   flagword flags;
573   const struct elf_backend_data *bed;
574   const struct bfd_elf_special_section *ssect;
575   struct section_match match;
576
577 #ifdef md_flush_pending_output
578   md_flush_pending_output ();
579 #endif
580
581   /* Switch to the section, creating it if necessary.  */
582   if (push)
583     {
584       struct section_stack *elt;
585       elt = XNEW (struct section_stack);
586       elt->next = section_stack;
587       elt->seg = now_seg;
588       elt->prev_seg = previous_section;
589       elt->subseg = now_subseg;
590       elt->prev_subseg = previous_subsection;
591       section_stack = elt;
592     }
593   previous_section = now_seg;
594   previous_subsection = now_subseg;
595
596   match.group_name = group_name;
597   match.info = info;
598   old_sec = bfd_get_section_by_name_if (stdoutput, name, get_section,
599                                         (void *) &match);
600   if (old_sec)
601     {
602       sec = old_sec;
603       subseg_set (sec, 0);
604     }
605   else
606     sec = subseg_force_new (name, 0);
607
608   bed = get_elf_backend_data (stdoutput);
609   ssect = (*bed->get_sec_type_attr) (stdoutput, sec);
610
611   if (ssect != NULL)
612     {
613       bfd_boolean override = FALSE;
614
615       if (type == SHT_NULL)
616         type = ssect->type;
617       else if (type != ssect->type)
618         {
619           if (old_sec == NULL
620               /* Some older versions of gcc will emit
621
622                  .section .init_array,"aw",@progbits
623
624                  for __attribute__ ((section (".init_array"))).
625                  "@progbits" is incorrect.  Also for x86-64 large bss
626                  sections, some older versions of gcc will emit
627
628                  .section .lbss,"aw",@progbits
629
630                  "@progbits" is incorrect.  */
631 #ifdef TC_I386
632               && (bed->s->arch_size != 64
633                   || !(ssect->attr & SHF_X86_64_LARGE))
634 #endif
635               && ssect->type != SHT_INIT_ARRAY
636               && ssect->type != SHT_FINI_ARRAY
637               && ssect->type != SHT_PREINIT_ARRAY)
638             {
639               /* We allow to specify any type for a .note section.  */
640               if (ssect->type != SHT_NOTE
641                   /* Processor and application defined types are allowed too.  */
642                   && type < SHT_LOPROC)
643                 as_warn (_("setting incorrect section type for %s"),
644                          name);
645             }
646           else
647             {
648               as_warn (_("ignoring incorrect section type for %s"),
649                        name);
650               type = ssect->type;
651             }
652         }
653
654       if (old_sec == NULL && ((attr & ~(SHF_MASKOS | SHF_MASKPROC))
655                               & ~ssect->attr) != 0)
656         {
657           /* As a GNU extension, we permit a .note section to be
658              allocatable.  If the linker sees an allocatable .note
659              section, it will create a PT_NOTE segment in the output
660              file.  We also allow "x" for .note.GNU-stack.  */
661           if (ssect->type == SHT_NOTE
662               && (attr == SHF_ALLOC || attr == SHF_EXECINSTR))
663             ;
664           /* Allow different SHF_MERGE and SHF_STRINGS if we have
665              something like .rodata.str.  */
666           else if (ssect->suffix_length == -2
667                    && name[ssect->prefix_length] == '.'
668                    && (attr
669                        & ~ssect->attr
670                        & ~SHF_MERGE
671                        & ~SHF_STRINGS) == 0)
672             ;
673           /* .interp, .strtab and .symtab can have SHF_ALLOC.  */
674           else if (attr == SHF_ALLOC
675                    && (strcmp (name, ".interp") == 0
676                        || strcmp (name, ".strtab") == 0
677                        || strcmp (name, ".symtab") == 0))
678             override = TRUE;
679           /* .note.GNU-stack can have SHF_EXECINSTR.  */
680           else if (attr == SHF_EXECINSTR
681                    && strcmp (name, ".note.GNU-stack") == 0)
682             override = TRUE;
683 #ifdef TC_ALPHA
684           /* A section on Alpha may have SHF_ALPHA_GPREL.  */
685           else if ((attr & ~ssect->attr) == SHF_ALPHA_GPREL)
686             override = TRUE;
687 #endif
688 #ifdef TC_RX
689           else if (attr == (SHF_EXECINSTR | SHF_WRITE | SHF_ALLOC)
690                    && (ssect->type == SHT_INIT_ARRAY
691                        || ssect->type == SHT_FINI_ARRAY
692                        || ssect->type == SHT_PREINIT_ARRAY))
693             /* RX init/fini arrays can and should have the "awx" attributes set.  */
694             ;
695 #endif
696           else
697             {
698               if (group_name == NULL)
699                 as_warn (_("setting incorrect section attributes for %s"),
700                          name);
701               override = TRUE;
702             }
703         }
704
705       if (!override && old_sec == NULL)
706         attr |= ssect->attr;
707     }
708
709   if ((attr & (SHF_ALLOC | SHF_GNU_MBIND)) == SHF_GNU_MBIND)
710     as_fatal (_("SHF_ALLOC isn't set for GNU_MBIND section: %s"), name);
711
712   /* Convert ELF type and flags to BFD flags.  */
713   flags = (SEC_RELOC
714            | ((attr & SHF_WRITE) ? 0 : SEC_READONLY)
715            | ((attr & SHF_ALLOC) ? SEC_ALLOC : 0)
716            | (((attr & SHF_ALLOC) && type != SHT_NOBITS) ? SEC_LOAD : 0)
717            | ((attr & SHF_EXECINSTR) ? SEC_CODE : 0)
718            | ((attr & SHF_MERGE) ? SEC_MERGE : 0)
719            | ((attr & SHF_STRINGS) ? SEC_STRINGS : 0)
720            | ((attr & SHF_EXCLUDE) ? SEC_EXCLUDE: 0)
721            | ((attr & SHF_TLS) ? SEC_THREAD_LOCAL : 0));
722 #ifdef md_elf_section_flags
723   flags = md_elf_section_flags (flags, attr, type);
724 #endif
725
726   if (linkonce)
727     flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
728
729   if (old_sec == NULL)
730     {
731       symbolS *secsym;
732
733       if (type == SHT_NULL)
734         type = bfd_elf_get_default_section_type (flags);
735       elf_section_type (sec) = type;
736       elf_section_flags (sec) = attr;
737       elf_section_data (sec)->this_hdr.sh_info = info;
738
739       /* Prevent SEC_HAS_CONTENTS from being inadvertently set.  */
740       if (type == SHT_NOBITS)
741         seg_info (sec)->bss = 1;
742
743       bfd_set_section_flags (stdoutput, sec, flags);
744       if (flags & SEC_MERGE)
745         sec->entsize = entsize;
746       elf_group_name (sec) = group_name;
747
748       /* Add a symbol for this section to the symbol table.  */
749       secsym = symbol_find (name);
750       if (secsym != NULL)
751         symbol_set_bfdsym (secsym, sec->symbol);
752       else
753         symbol_table_insert (section_symbol (sec));
754     }
755   else
756     {
757       if (type != SHT_NULL
758           && (unsigned) type != elf_section_type (old_sec))
759         as_warn (_("ignoring changed section type for %s"), name);
760
761       if (attr != 0)
762         {
763           /* If section attributes are specified the second time we see a
764              particular section, then check that they are the same as we
765              saw the first time.  */
766           if (((old_sec->flags ^ flags)
767                & (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
768                   | SEC_EXCLUDE | SEC_SORT_ENTRIES | SEC_MERGE | SEC_STRINGS
769                   | SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD
770                   | SEC_THREAD_LOCAL)))
771             as_warn (_("ignoring changed section attributes for %s"), name);
772           else
773             /* FIXME: Maybe we should consider removing a previously set
774                processor or application specific attribute as suspicious ?  */
775             elf_section_flags (sec) = attr;
776
777           if ((flags & SEC_MERGE) && old_sec->entsize != (unsigned) entsize)
778             as_warn (_("ignoring changed section entity size for %s"), name);
779         }
780     }
781
782 #ifdef md_elf_section_change_hook
783   md_elf_section_change_hook ();
784 #endif
785 }
786
787 static bfd_vma
788 obj_elf_parse_section_letters (char *str, size_t len, bfd_boolean *is_clone)
789 {
790   bfd_vma attr = 0;
791   *is_clone = FALSE;
792
793   while (len > 0)
794     {
795       switch (*str)
796         {
797         case 'a':
798           attr |= SHF_ALLOC;
799           break;
800         case 'e':
801           attr |= SHF_EXCLUDE;
802           break;
803         case 'w':
804           attr |= SHF_WRITE;
805           break;
806         case 'x':
807           attr |= SHF_EXECINSTR;
808           break;
809         case 'M':
810           attr |= SHF_MERGE;
811           break;
812         case 'S':
813           attr |= SHF_STRINGS;
814           break;
815         case 'G':
816           attr |= SHF_GROUP;
817           break;
818         case 'T':
819           attr |= SHF_TLS;
820           break;
821         case 'd':
822           attr |= SHF_GNU_MBIND;
823           break;
824         case '?':
825           *is_clone = TRUE;
826           break;
827         /* Compatibility.  */
828         case 'm':
829           if (*(str - 1) == 'a')
830             {
831               attr |= SHF_MERGE;
832               if (len > 1 && str[1] == 's')
833                 {
834                   attr |= SHF_STRINGS;
835                   str++, len--;
836                 }
837               break;
838             }
839           /* Fall through.  */
840         default:
841           {
842             const char *bad_msg = _("unrecognized .section attribute:"
843                                     " want a,e,w,x,M,S,G,T or number");
844 #ifdef md_elf_section_letter
845             bfd_vma md_attr = md_elf_section_letter (*str, &bad_msg);
846             if (md_attr != (bfd_vma) -1)
847               attr |= md_attr;
848             else
849 #endif
850               if (ISDIGIT (*str))
851                 {
852                   char * end;
853
854                   attr |= strtoul (str, & end, 0);
855                   /* Update str and len, allowing for the fact that
856                      we will execute str++ and len-- below.  */
857                   end --;
858                   len -= (end - str);
859                   str = end;
860                 }
861               else
862                 as_fatal ("%s", bad_msg);
863           }
864           break;
865         }
866       str++, len--;
867     }
868
869   return attr;
870 }
871
872 static int
873 obj_elf_section_type (char *str, size_t len, bfd_boolean warn)
874 {
875   if (len == 8 && strncmp (str, "progbits", 8) == 0)
876     return SHT_PROGBITS;
877   if (len == 6 && strncmp (str, "nobits", 6) == 0)
878     return SHT_NOBITS;
879   if (len == 4 && strncmp (str, "note", 4) == 0)
880     return SHT_NOTE;
881   if (len == 10 && strncmp (str, "init_array", 10) == 0)
882     return SHT_INIT_ARRAY;
883   if (len == 10 && strncmp (str, "fini_array", 10) == 0)
884     return SHT_FINI_ARRAY;
885   if (len == 13 && strncmp (str, "preinit_array", 13) == 0)
886     return SHT_PREINIT_ARRAY;
887
888 #ifdef md_elf_section_type
889   {
890     int md_type = md_elf_section_type (str, len);
891     if (md_type >= 0)
892       return md_type;
893   }
894 #endif
895
896   if (ISDIGIT (*str))
897     {
898       char * end;
899       int type = strtoul (str, & end, 0);
900
901       if (warn && (size_t) (end - str) != len)
902         as_warn (_("extraneous characters at end of numeric section type"));
903
904       return type;
905     }
906
907   if (warn)
908     as_warn (_("unrecognized section type"));
909   return 0;
910 }
911
912 static bfd_vma
913 obj_elf_section_word (char *str, size_t len, int *type)
914 {
915   int ret;
916
917   if (len == 5 && strncmp (str, "write", 5) == 0)
918     return SHF_WRITE;
919   if (len == 5 && strncmp (str, "alloc", 5) == 0)
920     return SHF_ALLOC;
921   if (len == 9 && strncmp (str, "execinstr", 9) == 0)
922     return SHF_EXECINSTR;
923   if (len == 7 && strncmp (str, "exclude", 7) == 0)
924     return SHF_EXCLUDE;
925   if (len == 3 && strncmp (str, "tls", 3) == 0)
926     return SHF_TLS;
927
928 #ifdef md_elf_section_word
929   {
930     bfd_vma md_attr = md_elf_section_word (str, len);
931     if (md_attr > 0)
932       return md_attr;
933   }
934 #endif
935
936   ret = obj_elf_section_type (str, len, FALSE);
937   if (ret != 0)
938     *type = ret;
939   else
940     as_warn (_("unrecognized section attribute"));
941
942   return 0;
943 }
944
945 /* Get name of section.  */
946 const char *
947 obj_elf_section_name (void)
948 {
949   char *name;
950
951   SKIP_WHITESPACE ();
952   if (*input_line_pointer == '"')
953     {
954       int dummy;
955
956       name = demand_copy_C_string (&dummy);
957       if (name == NULL)
958         {
959           ignore_rest_of_line ();
960           return NULL;
961         }
962     }
963   else
964     {
965       char *end = input_line_pointer;
966
967       while (0 == strchr ("\n\t,; ", *end))
968         end++;
969       if (end == input_line_pointer)
970         {
971           as_bad (_("missing name"));
972           ignore_rest_of_line ();
973           return NULL;
974         }
975
976       name = xmemdup0 (input_line_pointer, end - input_line_pointer);
977
978       while (flag_sectname_subst)
979         {
980           char *subst = strchr (name, '%');
981           if (subst && subst[1] == 'S')
982             {
983               int oldlen = strlen (name);
984               int substlen = strlen (now_seg->name);
985               int newlen = oldlen - 2 + substlen;
986               char *newname = XNEWVEC (char, newlen + 1);
987               int headlen = subst - name;
988               memcpy (newname, name, headlen);
989               strcpy (newname + headlen, now_seg->name);
990               strcat (newname + headlen, subst + 2);
991               xfree (name);
992               name = newname;
993             }
994           else
995             break;
996         }
997
998 #ifdef tc_canonicalize_section_name
999       name = tc_canonicalize_section_name (name);
1000 #endif
1001       input_line_pointer = end;
1002     }
1003   SKIP_WHITESPACE ();
1004   return name;
1005 }
1006
1007 void
1008 obj_elf_section (int push)
1009 {
1010   const char *name, *group_name;
1011   char *beg;
1012   int type, dummy;
1013   bfd_vma attr;
1014   int entsize;
1015   int linkonce;
1016   subsegT new_subsection = -1;
1017   unsigned int info = 0;
1018
1019   if (flag_mri)
1020     {
1021       char mri_type;
1022
1023 #ifdef md_flush_pending_output
1024       md_flush_pending_output ();
1025 #endif
1026
1027       previous_section = now_seg;
1028       previous_subsection = now_subseg;
1029
1030       s_mri_sect (&mri_type);
1031
1032 #ifdef md_elf_section_change_hook
1033       md_elf_section_change_hook ();
1034 #endif
1035
1036       return;
1037     }
1038
1039   name = obj_elf_section_name ();
1040   if (name == NULL)
1041     return;
1042   type = SHT_NULL;
1043   attr = 0;
1044   group_name = NULL;
1045   entsize = 0;
1046   linkonce = 0;
1047
1048   if (*input_line_pointer == ',')
1049     {
1050       /* Skip the comma.  */
1051       ++input_line_pointer;
1052       SKIP_WHITESPACE ();
1053
1054       if (push && ISDIGIT (*input_line_pointer))
1055         {
1056           /* .pushsection has an optional subsection.  */
1057           new_subsection = (subsegT) get_absolute_expression ();
1058
1059           SKIP_WHITESPACE ();
1060
1061           /* Stop if we don't see a comma.  */
1062           if (*input_line_pointer != ',')
1063             goto done;
1064
1065           /* Skip the comma.  */
1066           ++input_line_pointer;
1067           SKIP_WHITESPACE ();
1068         }
1069
1070       if (*input_line_pointer == '"')
1071         {
1072           bfd_boolean is_clone;
1073
1074           beg = demand_copy_C_string (&dummy);
1075           if (beg == NULL)
1076             {
1077               ignore_rest_of_line ();
1078               return;
1079             }
1080           attr |= obj_elf_parse_section_letters (beg, strlen (beg), &is_clone);
1081
1082           SKIP_WHITESPACE ();
1083           if (*input_line_pointer == ',')
1084             {
1085               char c;
1086               char *save = input_line_pointer;
1087
1088               ++input_line_pointer;
1089               SKIP_WHITESPACE ();
1090               c = *input_line_pointer;
1091               if (c == '"')
1092                 {
1093                   beg = demand_copy_C_string (&dummy);
1094                   if (beg == NULL)
1095                     {
1096                       ignore_rest_of_line ();
1097                       return;
1098                     }
1099                   type = obj_elf_section_type (beg, strlen (beg), TRUE);
1100                 }
1101               else if (c == '@' || c == '%')
1102                 {
1103                   ++input_line_pointer;
1104
1105                   if (ISDIGIT (* input_line_pointer))
1106                     {
1107                       type = strtoul (input_line_pointer, & input_line_pointer, 0);
1108                     }
1109                   else
1110                     {
1111                       c = get_symbol_name (& beg);
1112                       (void) restore_line_pointer (c);
1113                       type = obj_elf_section_type (beg, input_line_pointer - beg, TRUE);
1114                     }
1115                 }
1116               else
1117                 input_line_pointer = save;
1118             }
1119
1120           SKIP_WHITESPACE ();
1121           if ((attr & SHF_MERGE) != 0 && *input_line_pointer == ',')
1122             {
1123               ++input_line_pointer;
1124               SKIP_WHITESPACE ();
1125               entsize = get_absolute_expression ();
1126               SKIP_WHITESPACE ();
1127               if (entsize < 0)
1128                 {
1129                   as_warn (_("invalid merge entity size"));
1130                   attr &= ~SHF_MERGE;
1131                   entsize = 0;
1132                 }
1133             }
1134           else if ((attr & SHF_MERGE) != 0)
1135             {
1136               as_warn (_("entity size for SHF_MERGE not specified"));
1137               attr &= ~SHF_MERGE;
1138             }
1139
1140           if ((attr & SHF_GROUP) != 0 && is_clone)
1141             {
1142               as_warn (_("? section flag ignored with G present"));
1143               is_clone = FALSE;
1144             }
1145           if ((attr & SHF_GROUP) != 0 && *input_line_pointer == ',')
1146             {
1147               ++input_line_pointer;
1148               group_name = obj_elf_section_name ();
1149               if (group_name == NULL)
1150                 attr &= ~SHF_GROUP;
1151               else if (*input_line_pointer == ',')
1152                 {
1153                   ++input_line_pointer;
1154                   SKIP_WHITESPACE ();
1155                   if (strncmp (input_line_pointer, "comdat", 6) == 0)
1156                     {
1157                       input_line_pointer += 6;
1158                       linkonce = 1;
1159                     }
1160                 }
1161               else if (strncmp (name, ".gnu.linkonce", 13) == 0)
1162                 linkonce = 1;
1163             }
1164           else if ((attr & SHF_GROUP) != 0)
1165             {
1166               as_warn (_("group name for SHF_GROUP not specified"));
1167               attr &= ~SHF_GROUP;
1168             }
1169
1170           if (is_clone)
1171             {
1172               const char *now_group = elf_group_name (now_seg);
1173               if (now_group != NULL)
1174                 {
1175                   group_name = xstrdup (now_group);
1176                   linkonce = (now_seg->flags & SEC_LINK_ONCE) != 0;
1177                 }
1178             }
1179
1180           if ((attr & SHF_GNU_MBIND) != 0 && *input_line_pointer == ',')
1181             {
1182               ++input_line_pointer;
1183               SKIP_WHITESPACE ();
1184               if (ISDIGIT (* input_line_pointer))
1185                 {
1186                   char *t = input_line_pointer;
1187                   info = strtoul (input_line_pointer,
1188                                   &input_line_pointer, 0);
1189                   if (info == (unsigned int) -1)
1190                     {
1191                       as_warn (_("unsupported mbind section info: %s"), t);
1192                       info = 0;
1193                     }
1194                 }
1195             }
1196         }
1197       else
1198         {
1199           do
1200             {
1201               char c;
1202
1203               SKIP_WHITESPACE ();
1204               if (*input_line_pointer != '#')
1205                 {
1206                   as_bad (_("character following name is not '#'"));
1207                   ignore_rest_of_line ();
1208                   return;
1209                 }
1210               ++input_line_pointer;
1211               c = get_symbol_name (& beg);
1212               (void) restore_line_pointer (c);
1213
1214               attr |= obj_elf_section_word (beg, input_line_pointer - beg, & type);
1215
1216               SKIP_WHITESPACE ();
1217             }
1218           while (*input_line_pointer++ == ',');
1219           --input_line_pointer;
1220         }
1221     }
1222
1223 done:
1224   demand_empty_rest_of_line ();
1225
1226   obj_elf_change_section (name, type, info, attr, entsize, group_name,
1227                           linkonce, push);
1228
1229   if (push && new_subsection != -1)
1230     subseg_set (now_seg, new_subsection);
1231 }
1232
1233 /* Change to the .data section.  */
1234
1235 void
1236 obj_elf_data (int i)
1237 {
1238 #ifdef md_flush_pending_output
1239   md_flush_pending_output ();
1240 #endif
1241
1242   previous_section = now_seg;
1243   previous_subsection = now_subseg;
1244   s_data (i);
1245
1246 #ifdef md_elf_section_change_hook
1247   md_elf_section_change_hook ();
1248 #endif
1249 }
1250
1251 /* Change to the .text section.  */
1252
1253 void
1254 obj_elf_text (int i)
1255 {
1256 #ifdef md_flush_pending_output
1257   md_flush_pending_output ();
1258 #endif
1259
1260   previous_section = now_seg;
1261   previous_subsection = now_subseg;
1262   s_text (i);
1263
1264 #ifdef md_elf_section_change_hook
1265   md_elf_section_change_hook ();
1266 #endif
1267 }
1268
1269 /* Change to the *ABS* section.  */
1270
1271 void
1272 obj_elf_struct (int i)
1273 {
1274 #ifdef md_flush_pending_output
1275   md_flush_pending_output ();
1276 #endif
1277
1278   previous_section = now_seg;
1279   previous_subsection = now_subseg;
1280   s_struct (i);
1281
1282 #ifdef md_elf_section_change_hook
1283   md_elf_section_change_hook ();
1284 #endif
1285 }
1286
1287 static void
1288 obj_elf_subsection (int ignore ATTRIBUTE_UNUSED)
1289 {
1290   int temp;
1291
1292 #ifdef md_flush_pending_output
1293   md_flush_pending_output ();
1294 #endif
1295
1296   previous_section = now_seg;
1297   previous_subsection = now_subseg;
1298
1299   temp = get_absolute_expression ();
1300   subseg_set (now_seg, (subsegT) temp);
1301   demand_empty_rest_of_line ();
1302
1303 #ifdef md_elf_section_change_hook
1304   md_elf_section_change_hook ();
1305 #endif
1306 }
1307
1308 /* This can be called from the processor backends if they change
1309    sections.  */
1310
1311 void
1312 obj_elf_section_change_hook (void)
1313 {
1314   previous_section = now_seg;
1315   previous_subsection = now_subseg;
1316 }
1317
1318 void
1319 obj_elf_previous (int ignore ATTRIBUTE_UNUSED)
1320 {
1321   segT new_section;
1322   int new_subsection;
1323
1324   if (previous_section == 0)
1325     {
1326       as_warn (_(".previous without corresponding .section; ignored"));
1327       return;
1328     }
1329
1330 #ifdef md_flush_pending_output
1331   md_flush_pending_output ();
1332 #endif
1333
1334   new_section = previous_section;
1335   new_subsection = previous_subsection;
1336   previous_section = now_seg;
1337   previous_subsection = now_subseg;
1338   subseg_set (new_section, new_subsection);
1339
1340 #ifdef md_elf_section_change_hook
1341   md_elf_section_change_hook ();
1342 #endif
1343 }
1344
1345 static void
1346 obj_elf_popsection (int xxx ATTRIBUTE_UNUSED)
1347 {
1348   struct section_stack *top = section_stack;
1349
1350   if (top == NULL)
1351     {
1352       as_warn (_(".popsection without corresponding .pushsection; ignored"));
1353       return;
1354     }
1355
1356 #ifdef md_flush_pending_output
1357   md_flush_pending_output ();
1358 #endif
1359
1360   section_stack = top->next;
1361   previous_section = top->prev_seg;
1362   previous_subsection = top->prev_subseg;
1363   subseg_set (top->seg, top->subseg);
1364   free (top);
1365
1366 #ifdef md_elf_section_change_hook
1367   md_elf_section_change_hook ();
1368 #endif
1369 }
1370
1371 static void
1372 obj_elf_line (int ignore ATTRIBUTE_UNUSED)
1373 {
1374   /* Assume delimiter is part of expression.  BSD4.2 as fails with
1375      delightful bug, so we are not being incompatible here.  */
1376   new_logical_line (NULL, get_absolute_expression ());
1377   demand_empty_rest_of_line ();
1378 }
1379
1380 /* This handles the .symver pseudo-op, which is used to specify a
1381    symbol version.  The syntax is ``.symver NAME,SYMVERNAME''.
1382    SYMVERNAME may contain ELF_VER_CHR ('@') characters.  This
1383    pseudo-op causes the assembler to emit a symbol named SYMVERNAME
1384    with the same value as the symbol NAME.  */
1385
1386 static void
1387 obj_elf_symver (int ignore ATTRIBUTE_UNUSED)
1388 {
1389   char *name;
1390   char c;
1391   char old_lexat;
1392   symbolS *sym;
1393
1394   sym = get_sym_from_input_line_and_check ();
1395
1396   if (*input_line_pointer != ',')
1397     {
1398       as_bad (_("expected comma after name in .symver"));
1399       ignore_rest_of_line ();
1400       return;
1401     }
1402
1403   ++input_line_pointer;
1404   SKIP_WHITESPACE ();
1405
1406   /* Temporarily include '@' in symbol names.  */
1407   old_lexat = lex_type[(unsigned char) '@'];
1408   lex_type[(unsigned char) '@'] |= LEX_NAME;
1409   c = get_symbol_name (& name);
1410   lex_type[(unsigned char) '@'] = old_lexat;
1411
1412   if (S_IS_COMMON (sym))
1413     {
1414       as_bad (_("`%s' can't be versioned to common symbol '%s'"),
1415               name, S_GET_NAME (sym));
1416       ignore_rest_of_line ();
1417       return;
1418     }
1419
1420   if (symbol_get_obj (sym)->versioned_name == NULL)
1421     {
1422       symbol_get_obj (sym)->versioned_name = xstrdup (name);
1423
1424       (void) restore_line_pointer (c);
1425
1426       if (strchr (symbol_get_obj (sym)->versioned_name,
1427                   ELF_VER_CHR) == NULL)
1428         {
1429           as_bad (_("missing version name in `%s' for symbol `%s'"),
1430                   symbol_get_obj (sym)->versioned_name,
1431                   S_GET_NAME (sym));
1432           ignore_rest_of_line ();
1433           return;
1434         }
1435     }
1436   else
1437     {
1438       if (strcmp (symbol_get_obj (sym)->versioned_name, name))
1439         {
1440           as_bad (_("multiple versions [`%s'|`%s'] for symbol `%s'"),
1441                   name, symbol_get_obj (sym)->versioned_name,
1442                   S_GET_NAME (sym));
1443           ignore_rest_of_line ();
1444           return;
1445         }
1446
1447       (void) restore_line_pointer (c);
1448     }
1449
1450   demand_empty_rest_of_line ();
1451 }
1452
1453 /* This handles the .vtable_inherit pseudo-op, which is used to indicate
1454    to the linker the hierarchy in which a particular table resides.  The
1455    syntax is ".vtable_inherit CHILDNAME, PARENTNAME".  */
1456
1457 struct fix *
1458 obj_elf_get_vtable_inherit (void)
1459 {
1460   char *cname, *pname;
1461   symbolS *csym, *psym;
1462   char c, bad = 0;
1463
1464   if (*input_line_pointer == '#')
1465     ++input_line_pointer;
1466
1467   c = get_symbol_name (& cname);
1468   csym = symbol_find (cname);
1469
1470   /* GCFIXME: should check that we don't have two .vtable_inherits for
1471      the same child symbol.  Also, we can currently only do this if the
1472      child symbol is already exists and is placed in a fragment.  */
1473
1474   if (csym == NULL || symbol_get_frag (csym) == NULL)
1475     {
1476       as_bad (_("expected `%s' to have already been set for .vtable_inherit"),
1477               cname);
1478       bad = 1;
1479     }
1480
1481   *input_line_pointer = c;
1482
1483   SKIP_WHITESPACE_AFTER_NAME ();
1484   if (*input_line_pointer != ',')
1485     {
1486       as_bad (_("expected comma after name in .vtable_inherit"));
1487       ignore_rest_of_line ();
1488       return NULL;
1489     }
1490
1491   ++input_line_pointer;
1492   SKIP_WHITESPACE ();
1493
1494   if (*input_line_pointer == '#')
1495     ++input_line_pointer;
1496
1497   if (input_line_pointer[0] == '0'
1498       && (input_line_pointer[1] == '\0'
1499           || ISSPACE (input_line_pointer[1])))
1500     {
1501       psym = section_symbol (absolute_section);
1502       ++input_line_pointer;
1503     }
1504   else
1505     {
1506       c = get_symbol_name (& pname);
1507       psym = symbol_find_or_make (pname);
1508       restore_line_pointer (c);
1509     }
1510
1511   demand_empty_rest_of_line ();
1512
1513   if (bad)
1514     return NULL;
1515
1516   gas_assert (symbol_get_value_expression (csym)->X_op == O_constant);
1517   return fix_new (symbol_get_frag (csym),
1518                   symbol_get_value_expression (csym)->X_add_number,
1519                   0, psym, 0, 0, BFD_RELOC_VTABLE_INHERIT);
1520 }
1521
1522 /* This is a version of obj_elf_get_vtable_inherit() that is
1523    suitable for use in struct _pseudo_type tables.  */
1524
1525 void
1526 obj_elf_vtable_inherit (int ignore ATTRIBUTE_UNUSED)
1527 {
1528   (void) obj_elf_get_vtable_inherit ();
1529 }
1530
1531 /* This handles the .vtable_entry pseudo-op, which is used to indicate
1532    to the linker that a vtable slot was used.  The syntax is
1533    ".vtable_entry tablename, offset".  */
1534
1535 struct fix *
1536 obj_elf_get_vtable_entry (void)
1537 {
1538   symbolS *sym;
1539   offsetT offset;
1540
1541   if (*input_line_pointer == '#')
1542     ++input_line_pointer;
1543
1544   sym = get_sym_from_input_line_and_check ();
1545   if (*input_line_pointer != ',')
1546     {
1547       as_bad (_("expected comma after name in .vtable_entry"));
1548       ignore_rest_of_line ();
1549       return NULL;
1550     }
1551
1552   ++input_line_pointer;
1553   if (*input_line_pointer == '#')
1554     ++input_line_pointer;
1555
1556   offset = get_absolute_expression ();
1557
1558   demand_empty_rest_of_line ();
1559
1560   return fix_new (frag_now, frag_now_fix (), 0, sym, offset, 0,
1561                   BFD_RELOC_VTABLE_ENTRY);
1562 }
1563
1564 /* This is a version of obj_elf_get_vtable_entry() that is
1565    suitable for use in struct _pseudo_type tables.  */
1566
1567 void
1568 obj_elf_vtable_entry (int ignore ATTRIBUTE_UNUSED)
1569 {
1570   (void) obj_elf_get_vtable_entry ();
1571 }
1572
1573 #define skip_whitespace(str)  do { if (*(str) == ' ') ++(str); } while (0)
1574
1575 static inline int
1576 skip_past_char (char ** str, char c)
1577 {
1578   if (**str == c)
1579     {
1580       (*str)++;
1581       return 0;
1582     }
1583   else
1584     return -1;
1585 }
1586 #define skip_past_comma(str) skip_past_char (str, ',')
1587
1588 /* A list of attributes that have been explicitly set by the assembly code.
1589    VENDOR is the vendor id, BASE is the tag shifted right by the number
1590    of bits in MASK, and bit N of MASK is set if tag BASE+N has been set.  */
1591 struct recorded_attribute_info {
1592   struct recorded_attribute_info *next;
1593   int vendor;
1594   unsigned int base;
1595   unsigned long mask;
1596 };
1597 static struct recorded_attribute_info *recorded_attributes;
1598
1599 /* Record that we have seen an explicit specification of attribute TAG
1600    for vendor VENDOR.  */
1601
1602 static void
1603 record_attribute (int vendor, unsigned int tag)
1604 {
1605   unsigned int base;
1606   unsigned long mask;
1607   struct recorded_attribute_info *rai;
1608
1609   base = tag / (8 * sizeof (rai->mask));
1610   mask = 1UL << (tag % (8 * sizeof (rai->mask)));
1611   for (rai = recorded_attributes; rai; rai = rai->next)
1612     if (rai->vendor == vendor && rai->base == base)
1613       {
1614         rai->mask |= mask;
1615         return;
1616       }
1617
1618   rai = XNEW (struct recorded_attribute_info);
1619   rai->next = recorded_attributes;
1620   rai->vendor = vendor;
1621   rai->base = base;
1622   rai->mask = mask;
1623   recorded_attributes = rai;
1624 }
1625
1626 /* Return true if we have seen an explicit specification of attribute TAG
1627    for vendor VENDOR.  */
1628
1629 bfd_boolean
1630 obj_elf_seen_attribute (int vendor, unsigned int tag)
1631 {
1632   unsigned int base;
1633   unsigned long mask;
1634   struct recorded_attribute_info *rai;
1635
1636   base = tag / (8 * sizeof (rai->mask));
1637   mask = 1UL << (tag % (8 * sizeof (rai->mask)));
1638   for (rai = recorded_attributes; rai; rai = rai->next)
1639     if (rai->vendor == vendor && rai->base == base)
1640       return (rai->mask & mask) != 0;
1641   return FALSE;
1642 }
1643
1644 /* Parse an attribute directive for VENDOR.
1645    Returns the attribute number read, or zero on error.  */
1646
1647 int
1648 obj_elf_vendor_attribute (int vendor)
1649 {
1650   expressionS exp;
1651   int type;
1652   int tag;
1653   unsigned int i = 0;
1654   char *s = NULL;
1655
1656   /* Read the first number or name.  */
1657   skip_whitespace (input_line_pointer);
1658   s = input_line_pointer;
1659   if (ISDIGIT (*input_line_pointer))
1660     {
1661       expression (& exp);
1662       if (exp.X_op != O_constant)
1663         goto bad;
1664       tag = exp.X_add_number;
1665     }
1666   else
1667     {
1668       char *name;
1669
1670       /* A name may contain '_', but no other punctuation.  */
1671       for (; ISALNUM (*input_line_pointer) || *input_line_pointer == '_';
1672            ++input_line_pointer)
1673         i++;
1674       if (i == 0)
1675         goto bad;
1676
1677       name = xstrndup (s, i);
1678
1679 #ifndef CONVERT_SYMBOLIC_ATTRIBUTE
1680 #define CONVERT_SYMBOLIC_ATTRIBUTE(a) -1
1681 #endif
1682
1683       tag = CONVERT_SYMBOLIC_ATTRIBUTE (name);
1684       if (tag == -1)
1685         {
1686           as_bad (_("Attribute name not recognised: %s"), name);
1687           ignore_rest_of_line ();
1688           free (name);
1689           return 0;
1690         }
1691       free (name);
1692     }
1693
1694   type = _bfd_elf_obj_attrs_arg_type (stdoutput, vendor, tag);
1695
1696   if (skip_past_comma (&input_line_pointer) == -1)
1697     goto bad;
1698   if (type & 1)
1699     {
1700       expression (& exp);
1701       if (exp.X_op != O_constant)
1702         {
1703           as_bad (_("expected numeric constant"));
1704           ignore_rest_of_line ();
1705           return 0;
1706         }
1707       i = exp.X_add_number;
1708     }
1709   if ((type & 3) == 3
1710       && skip_past_comma (&input_line_pointer) == -1)
1711     {
1712       as_bad (_("expected comma"));
1713       ignore_rest_of_line ();
1714       return 0;
1715     }
1716   if (type & 2)
1717     {
1718       int len;
1719
1720       skip_whitespace (input_line_pointer);
1721       if (*input_line_pointer != '"')
1722         goto bad_string;
1723       s = demand_copy_C_string (&len);
1724     }
1725
1726   record_attribute (vendor, tag);
1727   switch (type & 3)
1728     {
1729     case 3:
1730       bfd_elf_add_obj_attr_int_string (stdoutput, vendor, tag, i, s);
1731       break;
1732     case 2:
1733       bfd_elf_add_obj_attr_string (stdoutput, vendor, tag, s);
1734       break;
1735     case 1:
1736       bfd_elf_add_obj_attr_int (stdoutput, vendor, tag, i);
1737       break;
1738     default:
1739       abort ();
1740     }
1741
1742   demand_empty_rest_of_line ();
1743   return tag;
1744 bad_string:
1745   as_bad (_("bad string constant"));
1746   ignore_rest_of_line ();
1747   return 0;
1748 bad:
1749   as_bad (_("expected <tag> , <value>"));
1750   ignore_rest_of_line ();
1751   return 0;
1752 }
1753
1754 /* Parse a .gnu_attribute directive.  */
1755
1756 static void
1757 obj_elf_gnu_attribute (int ignored ATTRIBUTE_UNUSED)
1758 {
1759   obj_elf_vendor_attribute (OBJ_ATTR_GNU);
1760 }
1761
1762 void
1763 elf_obj_read_begin_hook (void)
1764 {
1765 #ifdef NEED_ECOFF_DEBUG
1766   if (ECOFF_DEBUGGING)
1767     ecoff_read_begin_hook ();
1768 #endif
1769 }
1770
1771 void
1772 elf_obj_symbol_new_hook (symbolS *symbolP)
1773 {
1774   struct elf_obj_sy *sy_obj;
1775
1776   sy_obj = symbol_get_obj (symbolP);
1777   sy_obj->size = NULL;
1778   sy_obj->versioned_name = NULL;
1779
1780 #ifdef NEED_ECOFF_DEBUG
1781   if (ECOFF_DEBUGGING)
1782     ecoff_symbol_new_hook (symbolP);
1783 #endif
1784 }
1785
1786 /* When setting one symbol equal to another, by default we probably
1787    want them to have the same "size", whatever it means in the current
1788    context.  */
1789
1790 void
1791 elf_copy_symbol_attributes (symbolS *dest, symbolS *src)
1792 {
1793   struct elf_obj_sy *srcelf = symbol_get_obj (src);
1794   struct elf_obj_sy *destelf = symbol_get_obj (dest);
1795   if (srcelf->size)
1796     {
1797       if (destelf->size == NULL)
1798         destelf->size = XNEW (expressionS);
1799       *destelf->size = *srcelf->size;
1800     }
1801   else
1802     {
1803       if (destelf->size != NULL)
1804         free (destelf->size);
1805       destelf->size = NULL;
1806     }
1807   S_SET_SIZE (dest, S_GET_SIZE (src));
1808   /* Don't copy visibility.  */
1809   S_SET_OTHER (dest, (ELF_ST_VISIBILITY (S_GET_OTHER (dest))
1810                       | (S_GET_OTHER (src) & ~ELF_ST_VISIBILITY (-1))));
1811 }
1812
1813 void
1814 obj_elf_version (int ignore ATTRIBUTE_UNUSED)
1815 {
1816   char *name;
1817   unsigned int c;
1818   char *p;
1819   asection *seg = now_seg;
1820   subsegT subseg = now_subseg;
1821   Elf_Internal_Note i_note;
1822   Elf_External_Note e_note;
1823   asection *note_secp = NULL;
1824
1825   SKIP_WHITESPACE ();
1826   if (*input_line_pointer == '\"')
1827     {
1828       unsigned int len;
1829
1830       ++input_line_pointer;     /* -> 1st char of string.  */
1831       name = input_line_pointer;
1832
1833       while (is_a_char (c = next_char_of_string ()))
1834         ;
1835       c = *input_line_pointer;
1836       *input_line_pointer = '\0';
1837       *(input_line_pointer - 1) = '\0';
1838       *input_line_pointer = c;
1839
1840       /* Create the .note section.  */
1841       note_secp = subseg_new (".note", 0);
1842       bfd_set_section_flags (stdoutput,
1843                              note_secp,
1844                              SEC_HAS_CONTENTS | SEC_READONLY);
1845       record_alignment (note_secp, 2);
1846
1847       /* Process the version string.  */
1848       len = strlen (name) + 1;
1849
1850       /* PR 3456: Although the name field is padded out to an 4-byte
1851          boundary, the namesz field should not be adjusted.  */
1852       i_note.namesz = len;
1853       i_note.descsz = 0;        /* No description.  */
1854       i_note.type = NT_VERSION;
1855       p = frag_more (sizeof (e_note.namesz));
1856       md_number_to_chars (p, i_note.namesz, sizeof (e_note.namesz));
1857       p = frag_more (sizeof (e_note.descsz));
1858       md_number_to_chars (p, i_note.descsz, sizeof (e_note.descsz));
1859       p = frag_more (sizeof (e_note.type));
1860       md_number_to_chars (p, i_note.type, sizeof (e_note.type));
1861       p = frag_more (len);
1862       memcpy (p, name, len);
1863
1864       frag_align (2, 0, 0);
1865
1866       subseg_set (seg, subseg);
1867     }
1868   else
1869     as_bad (_("expected quoted string"));
1870
1871   demand_empty_rest_of_line ();
1872 }
1873
1874 static void
1875 obj_elf_size (int ignore ATTRIBUTE_UNUSED)
1876 {
1877   char *name;
1878   char c = get_symbol_name (&name);
1879   char *p;
1880   expressionS exp;
1881   symbolS *sym;
1882
1883   p = input_line_pointer;
1884   *p = c;
1885   SKIP_WHITESPACE_AFTER_NAME ();
1886   if (*input_line_pointer != ',')
1887     {
1888       *p = 0;
1889       as_bad (_("expected comma after name `%s' in .size directive"), name);
1890       *p = c;
1891       ignore_rest_of_line ();
1892       return;
1893     }
1894   input_line_pointer++;
1895   expression (&exp);
1896   if (exp.X_op == O_absent)
1897     {
1898       as_bad (_("missing expression in .size directive"));
1899       exp.X_op = O_constant;
1900       exp.X_add_number = 0;
1901     }
1902   *p = 0;
1903   sym = symbol_find_or_make (name);
1904   *p = c;
1905   if (exp.X_op == O_constant)
1906     {
1907       S_SET_SIZE (sym, exp.X_add_number);
1908       if (symbol_get_obj (sym)->size)
1909         {
1910           xfree (symbol_get_obj (sym)->size);
1911           symbol_get_obj (sym)->size = NULL;
1912         }
1913     }
1914   else
1915     {
1916       symbol_get_obj (sym)->size = XNEW (expressionS);
1917       *symbol_get_obj (sym)->size = exp;
1918     }
1919   demand_empty_rest_of_line ();
1920 }
1921
1922 /* Handle the ELF .type pseudo-op.  This sets the type of a symbol.
1923    There are six syntaxes:
1924
1925    The first (used on Solaris) is
1926        .type SYM,#function
1927    The second (used on UnixWare) is
1928        .type SYM,@function
1929    The third (reportedly to be used on Irix 6.0) is
1930        .type SYM STT_FUNC
1931    The fourth (used on NetBSD/Arm and Linux/ARM) is
1932        .type SYM,%function
1933    The fifth (used on SVR4/860) is
1934        .type SYM,"function"
1935    The sixth (emitted by recent SunPRO under Solaris) is
1936        .type SYM,[0-9]
1937    where the integer is the STT_* value.
1938    */
1939
1940 static char *
1941 obj_elf_type_name (char *cp)
1942 {
1943   char *p;
1944
1945   p = input_line_pointer;
1946   if (*input_line_pointer >= '0'
1947       && *input_line_pointer <= '9')
1948     {
1949       while (*input_line_pointer >= '0'
1950              && *input_line_pointer <= '9')
1951         ++input_line_pointer;
1952       *cp = *input_line_pointer;
1953       *input_line_pointer = '\0';
1954     }
1955   else
1956     *cp = get_symbol_name (&p);
1957
1958   return p;
1959 }
1960
1961 static void
1962 obj_elf_type (int ignore ATTRIBUTE_UNUSED)
1963 {
1964   char c;
1965   int type;
1966   const char *type_name;
1967   symbolS *sym;
1968   elf_symbol_type *elfsym;
1969
1970   sym = get_sym_from_input_line_and_check ();
1971   c = *input_line_pointer;
1972   elfsym = (elf_symbol_type *) symbol_get_bfdsym (sym);
1973
1974   if (*input_line_pointer == ',')
1975     ++input_line_pointer;
1976
1977   SKIP_WHITESPACE ();
1978   if (   *input_line_pointer == '#'
1979       || *input_line_pointer == '@'
1980       || *input_line_pointer == '"'
1981       || *input_line_pointer == '%')
1982     ++input_line_pointer;
1983
1984   type_name = obj_elf_type_name (& c);
1985
1986   type = 0;
1987   if (strcmp (type_name, "function") == 0
1988       || strcmp (type_name, "2") == 0
1989       || strcmp (type_name, "STT_FUNC") == 0)
1990     type = BSF_FUNCTION;
1991   else if (strcmp (type_name, "object") == 0
1992            || strcmp (type_name, "1") == 0
1993            || strcmp (type_name, "STT_OBJECT") == 0)
1994     type = BSF_OBJECT;
1995   else if (strcmp (type_name, "tls_object") == 0
1996            || strcmp (type_name, "6") == 0
1997            || strcmp (type_name, "STT_TLS") == 0)
1998     type = BSF_OBJECT | BSF_THREAD_LOCAL;
1999   else if (strcmp (type_name, "notype") == 0
2000            || strcmp (type_name, "0") == 0
2001            || strcmp (type_name, "STT_NOTYPE") == 0)
2002     ;
2003   else if (strcmp (type_name, "common") == 0
2004            || strcmp (type_name, "5") == 0
2005            || strcmp (type_name, "STT_COMMON") == 0)
2006     {
2007       type = BSF_OBJECT;
2008
2009       if (! S_IS_COMMON (sym))
2010         {
2011           if (S_IS_VOLATILE (sym))
2012             {
2013               sym = symbol_clone (sym, 1);
2014               S_SET_SEGMENT (sym, bfd_com_section_ptr);
2015               S_SET_VALUE (sym, 0);
2016               S_SET_EXTERNAL (sym);
2017               symbol_set_frag (sym, &zero_address_frag);
2018               S_CLEAR_VOLATILE (sym);
2019             }
2020           else if (S_IS_DEFINED (sym) || symbol_equated_p (sym))
2021             as_bad (_("symbol '%s' is already defined"), S_GET_NAME (sym));
2022           else
2023             {
2024               /* FIXME: Is it safe to just change the section ?  */
2025               S_SET_SEGMENT (sym, bfd_com_section_ptr);
2026               S_SET_VALUE (sym, 0);
2027               S_SET_EXTERNAL (sym);
2028             }
2029         }
2030     }
2031   else if (strcmp (type_name, "gnu_indirect_function") == 0
2032            || strcmp (type_name, "10") == 0
2033            || strcmp (type_name, "STT_GNU_IFUNC") == 0)
2034     {
2035       const struct elf_backend_data *bed;
2036
2037       bed = get_elf_backend_data (stdoutput);
2038       if (!(bed->elf_osabi == ELFOSABI_GNU
2039             || bed->elf_osabi == ELFOSABI_FREEBSD
2040             /* GNU is still using the default value 0.  */
2041             || bed->elf_osabi == ELFOSABI_NONE))
2042         as_bad (_("symbol type \"%s\" is supported only by GNU and FreeBSD targets"),
2043                 type_name);
2044       type = BSF_FUNCTION | BSF_GNU_INDIRECT_FUNCTION;
2045     }
2046   else if (strcmp (type_name, "gnu_unique_object") == 0)
2047     {
2048       struct elf_backend_data *bed;
2049
2050       bed = (struct elf_backend_data *) get_elf_backend_data (stdoutput);
2051       if (!(bed->elf_osabi == ELFOSABI_GNU
2052             /* GNU is still using the default value 0.  */
2053             || bed->elf_osabi == ELFOSABI_NONE))
2054         as_bad (_("symbol type \"%s\" is supported only by GNU targets"),
2055                 type_name);
2056       type = BSF_OBJECT | BSF_GNU_UNIQUE;
2057       /* PR 10549: Always set OSABI field to GNU for objects containing unique symbols.  */
2058       bed->elf_osabi = ELFOSABI_GNU;
2059     }
2060 #ifdef md_elf_symbol_type
2061   else if ((type = md_elf_symbol_type (type_name, sym, elfsym)) != -1)
2062     ;
2063 #endif
2064   else
2065     as_bad (_("unrecognized symbol type \"%s\""), type_name);
2066
2067   *input_line_pointer = c;
2068
2069   if (*input_line_pointer == '"')
2070     ++input_line_pointer;
2071
2072 #ifdef md_elf_symbol_type_change
2073   if (!md_elf_symbol_type_change (sym, elfsym, type))
2074 #endif
2075     {
2076       flagword mask = BSF_FUNCTION | BSF_OBJECT;
2077
2078       if (type != BSF_FUNCTION)
2079         mask |= BSF_GNU_INDIRECT_FUNCTION;
2080       if (type != BSF_OBJECT)
2081         {
2082           mask |= BSF_GNU_UNIQUE | BSF_THREAD_LOCAL;
2083
2084           if (S_IS_COMMON (sym))
2085             {
2086               as_bad (_("cannot change type of common symbol '%s'"),
2087                       S_GET_NAME (sym));
2088               mask = type = 0;
2089             }
2090         }
2091
2092       /* Don't warn when changing to STT_NOTYPE.  */
2093       if (type)
2094         {
2095           flagword new = (elfsym->symbol.flags & ~mask) | type;
2096
2097           if (new != (elfsym->symbol.flags | type))
2098             as_warn (_("symbol '%s' already has its type set"), S_GET_NAME (sym));
2099           elfsym->symbol.flags = new;
2100         }
2101       else
2102         elfsym->symbol.flags &= ~mask;
2103     }
2104
2105   demand_empty_rest_of_line ();
2106 }
2107
2108 static void
2109 obj_elf_ident (int ignore ATTRIBUTE_UNUSED)
2110 {
2111   static segT comment_section;
2112   segT old_section = now_seg;
2113   int old_subsection = now_subseg;
2114
2115 #ifdef md_flush_pending_output
2116   md_flush_pending_output ();
2117 #endif
2118
2119   if (!comment_section)
2120     {
2121       char *p;
2122       comment_section = subseg_new (".comment", 0);
2123       bfd_set_section_flags (stdoutput, comment_section,
2124                              SEC_READONLY | SEC_HAS_CONTENTS
2125                              | SEC_MERGE | SEC_STRINGS);
2126       comment_section->entsize = 1;
2127 #ifdef md_elf_section_change_hook
2128       md_elf_section_change_hook ();
2129 #endif
2130       p = frag_more (1);
2131       *p = 0;
2132     }
2133   else
2134     subseg_set (comment_section, 0);
2135   stringer (8 + 1);
2136   subseg_set (old_section, old_subsection);
2137 }
2138
2139 #ifdef INIT_STAB_SECTION
2140
2141 /* The first entry in a .stabs section is special.  */
2142
2143 void
2144 obj_elf_init_stab_section (segT seg)
2145 {
2146   const char *file;
2147   char *p;
2148   char *stabstr_name;
2149   unsigned int stroff;
2150
2151   /* Force the section to align to a longword boundary.  Without this,
2152      UnixWare ar crashes.  */
2153   bfd_set_section_alignment (stdoutput, seg, 2);
2154
2155   /* Make space for this first symbol.  */
2156   p = frag_more (12);
2157   /* Zero it out.  */
2158   memset (p, 0, 12);
2159   file = as_where (NULL);
2160   stabstr_name = concat (segment_name (seg), "str", (char *) NULL);
2161   stroff = get_stab_string_offset (file, stabstr_name, TRUE);
2162   know (stroff == 1 || (stroff == 0 && file[0] == '\0'));
2163   md_number_to_chars (p, stroff, 4);
2164   seg_info (seg)->stabu.p = p;
2165 }
2166
2167 #endif
2168
2169 /* Fill in the counts in the first entry in a .stabs section.  */
2170
2171 static void
2172 adjust_stab_sections (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
2173 {
2174   char *name;
2175   asection *strsec;
2176   char *p;
2177   int strsz, nsyms;
2178
2179   if (strncmp (".stab", sec->name, 5))
2180     return;
2181   if (!strcmp ("str", sec->name + strlen (sec->name) - 3))
2182     return;
2183
2184   name = concat (sec->name, "str", NULL);
2185   strsec = bfd_get_section_by_name (abfd, name);
2186   if (strsec)
2187     strsz = bfd_section_size (abfd, strsec);
2188   else
2189     strsz = 0;
2190   nsyms = bfd_section_size (abfd, sec) / 12 - 1;
2191
2192   p = seg_info (sec)->stabu.p;
2193   gas_assert (p != 0);
2194
2195   bfd_h_put_16 (abfd, nsyms, p + 6);
2196   bfd_h_put_32 (abfd, strsz, p + 8);
2197   free (name);
2198 }
2199
2200 #ifdef NEED_ECOFF_DEBUG
2201
2202 /* This function is called by the ECOFF code.  It is supposed to
2203    record the external symbol information so that the backend can
2204    write it out correctly.  The ELF backend doesn't actually handle
2205    this at the moment, so we do it ourselves.  We save the information
2206    in the symbol.  */
2207
2208 #ifdef OBJ_MAYBE_ELF
2209 static
2210 #endif
2211 void
2212 elf_ecoff_set_ext (symbolS *sym, struct ecoff_extr *ext)
2213 {
2214   symbol_get_bfdsym (sym)->udata.p = ext;
2215 }
2216
2217 /* This function is called by bfd_ecoff_debug_externals.  It is
2218    supposed to *EXT to the external symbol information, and return
2219    whether the symbol should be used at all.  */
2220
2221 static bfd_boolean
2222 elf_get_extr (asymbol *sym, EXTR *ext)
2223 {
2224   if (sym->udata.p == NULL)
2225     return FALSE;
2226   *ext = *(EXTR *) sym->udata.p;
2227   return TRUE;
2228 }
2229
2230 /* This function is called by bfd_ecoff_debug_externals.  It has
2231    nothing to do for ELF.  */
2232
2233 static void
2234 elf_set_index (asymbol *sym ATTRIBUTE_UNUSED,
2235                bfd_size_type indx ATTRIBUTE_UNUSED)
2236 {
2237 }
2238
2239 #endif /* NEED_ECOFF_DEBUG */
2240
2241 void
2242 elf_frob_symbol (symbolS *symp, int *puntp)
2243 {
2244   struct elf_obj_sy *sy_obj;
2245   expressionS *size;
2246
2247 #ifdef NEED_ECOFF_DEBUG
2248   if (ECOFF_DEBUGGING)
2249     ecoff_frob_symbol (symp);
2250 #endif
2251
2252   sy_obj = symbol_get_obj (symp);
2253
2254   size = sy_obj->size;
2255   if (size != NULL)
2256     {
2257       if (resolve_expression (size)
2258           && size->X_op == O_constant)
2259         S_SET_SIZE (symp, size->X_add_number);
2260       else
2261         {
2262           if (!flag_allow_nonconst_size)
2263             as_bad (_(".size expression for %s "
2264                       "does not evaluate to a constant"), S_GET_NAME (symp));
2265           else
2266             as_warn (_(".size expression for %s "
2267                        "does not evaluate to a constant"), S_GET_NAME (symp));
2268         }
2269       free (sy_obj->size);
2270       sy_obj->size = NULL;
2271     }
2272
2273   if (sy_obj->versioned_name != NULL)
2274     {
2275       char *p;
2276
2277       p = strchr (sy_obj->versioned_name, ELF_VER_CHR);
2278       if (p == NULL)
2279         /* We will have already reported an error about a missing version.  */
2280         *puntp = TRUE;
2281
2282       /* This symbol was given a new name with the .symver directive.
2283
2284          If this is an external reference, just rename the symbol to
2285          include the version string.  This will make the relocs be
2286          against the correct versioned symbol.
2287
2288          If this is a definition, add an alias.  FIXME: Using an alias
2289          will permit the debugging information to refer to the right
2290          symbol.  However, it's not clear whether it is the best
2291          approach.  */
2292
2293       else if (! S_IS_DEFINED (symp))
2294         {
2295           /* Verify that the name isn't using the @@ syntax--this is
2296              reserved for definitions of the default version to link
2297              against.  */
2298           if (p[1] == ELF_VER_CHR)
2299             {
2300               as_bad (_("invalid attempt to declare external version name"
2301                         " as default in symbol `%s'"),
2302                       sy_obj->versioned_name);
2303               *puntp = TRUE;
2304             }
2305           S_SET_NAME (symp, sy_obj->versioned_name);
2306         }
2307       else
2308         {
2309           if (p[1] == ELF_VER_CHR && p[2] == ELF_VER_CHR)
2310             {
2311               size_t l;
2312
2313               /* The @@@ syntax is a special case. It renames the
2314                  symbol name to versioned_name with one `@' removed.  */
2315               l = strlen (&p[3]) + 1;
2316               memmove (&p[2], &p[3], l);
2317               S_SET_NAME (symp, sy_obj->versioned_name);
2318             }
2319           else
2320             {
2321               symbolS *symp2;
2322
2323               /* FIXME: Creating a new symbol here is risky.  We're
2324                  in the final loop over the symbol table.  We can
2325                  get away with it only because the symbol goes to
2326                  the end of the list, where the loop will still see
2327                  it.  It would probably be better to do this in
2328                  obj_frob_file_before_adjust.  */
2329
2330               symp2 = symbol_find_or_make (sy_obj->versioned_name);
2331
2332               /* Now we act as though we saw symp2 = sym.  */
2333               if (S_IS_COMMON (symp))
2334                 {
2335                   as_bad (_("`%s' can't be versioned to common symbol '%s'"),
2336                           sy_obj->versioned_name, S_GET_NAME (symp));
2337                   *puntp = TRUE;
2338                   return;
2339                 }
2340
2341               S_SET_SEGMENT (symp2, S_GET_SEGMENT (symp));
2342
2343               /* Subtracting out the frag address here is a hack
2344                  because we are in the middle of the final loop.  */
2345               S_SET_VALUE (symp2,
2346                            (S_GET_VALUE (symp)
2347                             - symbol_get_frag (symp)->fr_address));
2348
2349               symbol_set_frag (symp2, symbol_get_frag (symp));
2350
2351               /* This will copy over the size information.  */
2352               copy_symbol_attributes (symp2, symp);
2353
2354               S_SET_OTHER (symp2, S_GET_OTHER (symp));
2355
2356               if (S_IS_WEAK (symp))
2357                 S_SET_WEAK (symp2);
2358
2359               if (S_IS_EXTERNAL (symp))
2360                 S_SET_EXTERNAL (symp2);
2361             }
2362         }
2363     }
2364
2365   /* Double check weak symbols.  */
2366   if (S_IS_WEAK (symp))
2367     {
2368       if (S_IS_COMMON (symp))
2369         as_bad (_("symbol `%s' can not be both weak and common"),
2370                 S_GET_NAME (symp));
2371     }
2372
2373 #ifdef TC_MIPS
2374   /* The Irix 5 and 6 assemblers set the type of any common symbol and
2375      any undefined non-function symbol to STT_OBJECT.  We try to be
2376      compatible, since newer Irix 5 and 6 linkers care.  However, we
2377      only set undefined symbols to be STT_OBJECT if we are on Irix,
2378      because that is the only time gcc will generate the necessary
2379      .global directives to mark functions.  */
2380
2381   if (S_IS_COMMON (symp))
2382     symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
2383
2384   if (strstr (TARGET_OS, "irix") != NULL
2385       && ! S_IS_DEFINED (symp)
2386       && (symbol_get_bfdsym (symp)->flags & BSF_FUNCTION) == 0)
2387     symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
2388 #endif
2389 }
2390
2391 struct group_list
2392 {
2393   asection **head;              /* Section lists.  */
2394   unsigned int num_group;       /* Number of lists.  */
2395   struct hash_control *indexes; /* Maps group name to index in head array.  */
2396 };
2397
2398 static struct group_list groups;
2399
2400 /* Called via bfd_map_over_sections.  If SEC is a member of a group,
2401    add it to a list of sections belonging to the group.  INF is a
2402    pointer to a struct group_list, which is where we store the head of
2403    each list.  */
2404
2405 static void
2406 build_group_lists (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
2407 {
2408   struct group_list *list = (struct group_list *) inf;
2409   const char *group_name = elf_group_name (sec);
2410   unsigned int i;
2411   unsigned int *elem_idx;
2412   unsigned int *idx_ptr;
2413
2414   if (group_name == NULL)
2415     return;
2416
2417   /* If this group already has a list, add the section to the head of
2418      the list.  */
2419   elem_idx = (unsigned int *) hash_find (list->indexes, group_name);
2420   if (elem_idx != NULL)
2421     {
2422       elf_next_in_group (sec) = list->head[*elem_idx];
2423       list->head[*elem_idx] = sec;
2424       return;
2425     }
2426
2427   /* New group.  Make the arrays bigger in chunks to minimize calls to
2428      realloc.  */
2429   i = list->num_group;
2430   if ((i & 127) == 0)
2431     {
2432       unsigned int newsize = i + 128;
2433       list->head = XRESIZEVEC (asection *, list->head, newsize);
2434     }
2435   list->head[i] = sec;
2436   list->num_group += 1;
2437
2438   /* Add index to hash.  */
2439   idx_ptr = XNEW (unsigned int);
2440   *idx_ptr = i;
2441   hash_insert (list->indexes, group_name, idx_ptr);
2442 }
2443
2444 static void free_section_idx (const char *key ATTRIBUTE_UNUSED, void *val)
2445 {
2446   free ((unsigned int *) val);
2447 }
2448
2449 /* Create symbols for group signature.  */
2450
2451 void
2452 elf_adjust_symtab (void)
2453 {
2454   unsigned int i;
2455
2456   /* Go find section groups.  */
2457   groups.num_group = 0;
2458   groups.head = NULL;
2459   groups.indexes = hash_new ();
2460   bfd_map_over_sections (stdoutput, build_group_lists, &groups);
2461
2462   /* Make the SHT_GROUP sections that describe each section group.  We
2463      can't set up the section contents here yet, because elf section
2464      indices have yet to be calculated.  elf.c:set_group_contents does
2465      the rest of the work.  */
2466  for (i = 0; i < groups.num_group; i++)
2467     {
2468       const char *group_name = elf_group_name (groups.head[i]);
2469       const char *sec_name;
2470       asection *s;
2471       flagword flags;
2472       struct symbol *sy;
2473
2474       flags = SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_GROUP;
2475       for (s = groups.head[i]; s != NULL; s = elf_next_in_group (s))
2476         if ((s->flags ^ flags) & SEC_LINK_ONCE)
2477           {
2478             flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
2479             if (s != groups.head[i])
2480               {
2481                 as_warn (_("assuming all members of group `%s' are COMDAT"),
2482                          group_name);
2483                 break;
2484               }
2485           }
2486
2487       sec_name = ".group";
2488       s = subseg_force_new (sec_name, 0);
2489       if (s == NULL
2490           || !bfd_set_section_flags (stdoutput, s, flags)
2491           || !bfd_set_section_alignment (stdoutput, s, 2))
2492         {
2493           as_fatal (_("can't create group: %s"),
2494                     bfd_errmsg (bfd_get_error ()));
2495         }
2496       elf_section_type (s) = SHT_GROUP;
2497
2498       /* Pass a pointer to the first section in this group.  */
2499       elf_next_in_group (s) = groups.head[i];
2500       elf_sec_group (groups.head[i]) = s;
2501       /* Make sure that the signature symbol for the group has the
2502          name of the group.  */
2503       sy = symbol_find_exact (group_name);
2504       if (!sy || !symbol_on_chain (sy, symbol_rootP, symbol_lastP))
2505         {
2506           /* Create the symbol now.  */
2507           sy = symbol_new (group_name, now_seg, (valueT) 0, frag_now);
2508 #ifdef TE_SOLARIS
2509           /* Before Solaris 11 build 154, Sun ld rejects local group
2510              signature symbols, so make them weak hidden instead.  */
2511           symbol_get_bfdsym (sy)->flags |= BSF_WEAK;
2512           S_SET_OTHER (sy, STV_HIDDEN);
2513 #else
2514           symbol_get_obj (sy)->local = 1;
2515 #endif
2516           symbol_table_insert (sy);
2517         }
2518       elf_group_id (s) = symbol_get_bfdsym (sy);
2519     }
2520 }
2521
2522 void
2523 elf_frob_file (void)
2524 {
2525   bfd_map_over_sections (stdoutput, adjust_stab_sections, NULL);
2526
2527 #ifdef elf_tc_final_processing
2528   elf_tc_final_processing ();
2529 #endif
2530 }
2531
2532 /* It removes any unneeded versioned symbols from the symbol table.  */
2533
2534 void
2535 elf_frob_file_before_adjust (void)
2536 {
2537   if (symbol_rootP)
2538     {
2539       symbolS *symp;
2540
2541       for (symp = symbol_rootP; symp; symp = symbol_next (symp))
2542         if (!S_IS_DEFINED (symp))
2543           {
2544             if (symbol_get_obj (symp)->versioned_name)
2545               {
2546                 char *p;
2547
2548                 /* The @@@ syntax is a special case. If the symbol is
2549                    not defined, 2 `@'s will be removed from the
2550                    versioned_name.  */
2551
2552                 p = strchr (symbol_get_obj (symp)->versioned_name,
2553                             ELF_VER_CHR);
2554                 if (p != NULL && p[1] == ELF_VER_CHR && p[2] == ELF_VER_CHR)
2555                   {
2556                     size_t l = strlen (&p[3]) + 1;
2557                     memmove (&p[1], &p[3], l);
2558                   }
2559                 if (symbol_used_p (symp) == 0
2560                     && symbol_used_in_reloc_p (symp) == 0)
2561                   symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2562               }
2563
2564             /* If there was .weak foo, but foo was neither defined nor
2565                used anywhere, remove it.  */
2566
2567             else if (S_IS_WEAK (symp)
2568                      && symbol_used_p (symp) == 0
2569                      && symbol_used_in_reloc_p (symp) == 0)
2570               symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2571           }
2572     }
2573 }
2574
2575 /* It is required that we let write_relocs have the opportunity to
2576    optimize away fixups before output has begun, since it is possible
2577    to eliminate all fixups for a section and thus we never should
2578    have generated the relocation section.  */
2579
2580 void
2581 elf_frob_file_after_relocs (void)
2582 {
2583   unsigned int i;
2584
2585   /* Set SHT_GROUP section size.  */
2586   for (i = 0; i < groups.num_group; i++)
2587     {
2588       asection *s, *head, *group;
2589       bfd_size_type size;
2590
2591       head = groups.head[i];
2592       size = 4;
2593       for (s = head; s != NULL; s = elf_next_in_group (s))
2594         size += (s->flags & SEC_RELOC) != 0 ? 8 : 4;
2595
2596       group = elf_sec_group (head);
2597       subseg_set (group, 0);
2598       bfd_set_section_size (stdoutput, group, size);
2599       group->contents = (unsigned char *) frag_more (size);
2600       frag_now->fr_fix = frag_now_fix_octets ();
2601       frag_wane (frag_now);
2602     }
2603
2604   /* Cleanup hash.  */
2605   hash_traverse (groups.indexes, free_section_idx);
2606   hash_die (groups.indexes);
2607
2608 #ifdef NEED_ECOFF_DEBUG
2609   if (ECOFF_DEBUGGING)
2610     /* Generate the ECOFF debugging information.  */
2611     {
2612       const struct ecoff_debug_swap *debug_swap;
2613       struct ecoff_debug_info debug;
2614       char *buf;
2615       asection *sec;
2616
2617       debug_swap
2618         = get_elf_backend_data (stdoutput)->elf_backend_ecoff_debug_swap;
2619       know (debug_swap != NULL);
2620       ecoff_build_debug (&debug.symbolic_header, &buf, debug_swap);
2621
2622       /* Set up the pointers in debug.  */
2623 #define SET(ptr, offset, type) \
2624     debug.ptr = (type) (buf + debug.symbolic_header.offset)
2625
2626       SET (line, cbLineOffset, unsigned char *);
2627       SET (external_dnr, cbDnOffset, void *);
2628       SET (external_pdr, cbPdOffset, void *);
2629       SET (external_sym, cbSymOffset, void *);
2630       SET (external_opt, cbOptOffset, void *);
2631       SET (external_aux, cbAuxOffset, union aux_ext *);
2632       SET (ss, cbSsOffset, char *);
2633       SET (external_fdr, cbFdOffset, void *);
2634       SET (external_rfd, cbRfdOffset, void *);
2635       /* ssext and external_ext are set up just below.  */
2636
2637 #undef SET
2638
2639       /* Set up the external symbols.  */
2640       debug.ssext = debug.ssext_end = NULL;
2641       debug.external_ext = debug.external_ext_end = NULL;
2642       if (! bfd_ecoff_debug_externals (stdoutput, &debug, debug_swap, TRUE,
2643                                        elf_get_extr, elf_set_index))
2644         as_fatal (_("failed to set up debugging information: %s"),
2645                   bfd_errmsg (bfd_get_error ()));
2646
2647       sec = bfd_get_section_by_name (stdoutput, ".mdebug");
2648       gas_assert (sec != NULL);
2649
2650       know (!stdoutput->output_has_begun);
2651
2652       /* We set the size of the section, call bfd_set_section_contents
2653          to force the ELF backend to allocate a file position, and then
2654          write out the data.  FIXME: Is this really the best way to do
2655          this?  */
2656       bfd_set_section_size
2657         (stdoutput, sec, bfd_ecoff_debug_size (stdoutput, &debug, debug_swap));
2658
2659       /* Pass BUF to bfd_set_section_contents because this will
2660          eventually become a call to fwrite, and ISO C prohibits
2661          passing a NULL pointer to a stdio function even if the
2662          pointer will not be used.  */
2663       if (! bfd_set_section_contents (stdoutput, sec, buf, 0, 0))
2664         as_fatal (_("can't start writing .mdebug section: %s"),
2665                   bfd_errmsg (bfd_get_error ()));
2666
2667       know (stdoutput->output_has_begun);
2668       know (sec->filepos != 0);
2669
2670       if (! bfd_ecoff_write_debug (stdoutput, &debug, debug_swap,
2671                                    sec->filepos))
2672         as_fatal (_("could not write .mdebug section: %s"),
2673                   bfd_errmsg (bfd_get_error ()));
2674     }
2675 #endif /* NEED_ECOFF_DEBUG */
2676 }
2677
2678 static void
2679 elf_generate_asm_lineno (void)
2680 {
2681 #ifdef NEED_ECOFF_DEBUG
2682   if (ECOFF_DEBUGGING)
2683     ecoff_generate_asm_lineno ();
2684 #endif
2685 }
2686
2687 static void
2688 elf_process_stab (segT sec ATTRIBUTE_UNUSED,
2689                   int what ATTRIBUTE_UNUSED,
2690                   const char *string ATTRIBUTE_UNUSED,
2691                   int type ATTRIBUTE_UNUSED,
2692                   int other ATTRIBUTE_UNUSED,
2693                   int desc ATTRIBUTE_UNUSED)
2694 {
2695 #ifdef NEED_ECOFF_DEBUG
2696   if (ECOFF_DEBUGGING)
2697     ecoff_stab (sec, what, string, type, other, desc);
2698 #endif
2699 }
2700
2701 static int
2702 elf_separate_stab_sections (void)
2703 {
2704 #ifdef NEED_ECOFF_DEBUG
2705   return (!ECOFF_DEBUGGING);
2706 #else
2707   return 1;
2708 #endif
2709 }
2710
2711 static void
2712 elf_init_stab_section (segT seg)
2713 {
2714 #ifdef NEED_ECOFF_DEBUG
2715   if (!ECOFF_DEBUGGING)
2716 #endif
2717     obj_elf_init_stab_section (seg);
2718 }
2719
2720 const struct format_ops elf_format_ops =
2721 {
2722   bfd_target_elf_flavour,
2723   0,    /* dfl_leading_underscore */
2724   1,    /* emit_section_symbols */
2725   elf_begin,
2726   elf_file_symbol,
2727   elf_frob_symbol,
2728   elf_frob_file,
2729   elf_frob_file_before_adjust,
2730   0,    /* obj_frob_file_before_fix */
2731   elf_frob_file_after_relocs,
2732   elf_s_get_size, elf_s_set_size,
2733   elf_s_get_align, elf_s_set_align,
2734   elf_s_get_other,
2735   elf_s_set_other,
2736   0,    /* s_get_desc */
2737   0,    /* s_set_desc */
2738   0,    /* s_get_type */
2739   0,    /* s_set_type */
2740   elf_copy_symbol_attributes,
2741   elf_generate_asm_lineno,
2742   elf_process_stab,
2743   elf_separate_stab_sections,
2744   elf_init_stab_section,
2745   elf_sec_sym_ok_for_reloc,
2746   elf_pop_insert,
2747 #ifdef NEED_ECOFF_DEBUG
2748   elf_ecoff_set_ext,
2749 #else
2750   0,    /* ecoff_set_ext */
2751 #endif
2752   elf_obj_read_begin_hook,
2753   elf_obj_symbol_new_hook,
2754   0,
2755   elf_adjust_symtab
2756 };