Move struc-symbol.h to symbols.c
[external/binutils.git] / gas / config / obj-elf.c
1 /* ELF object file format
2    Copyright (C) 1992-2018 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   elfsym->symbol.flags |= type;
2073
2074   demand_empty_rest_of_line ();
2075 }
2076
2077 static void
2078 obj_elf_ident (int ignore ATTRIBUTE_UNUSED)
2079 {
2080   static segT comment_section;
2081   segT old_section = now_seg;
2082   int old_subsection = now_subseg;
2083
2084 #ifdef md_flush_pending_output
2085   md_flush_pending_output ();
2086 #endif
2087
2088   if (!comment_section)
2089     {
2090       char *p;
2091       comment_section = subseg_new (".comment", 0);
2092       bfd_set_section_flags (stdoutput, comment_section,
2093                              SEC_READONLY | SEC_HAS_CONTENTS
2094                              | SEC_MERGE | SEC_STRINGS);
2095       comment_section->entsize = 1;
2096 #ifdef md_elf_section_change_hook
2097       md_elf_section_change_hook ();
2098 #endif
2099       p = frag_more (1);
2100       *p = 0;
2101     }
2102   else
2103     subseg_set (comment_section, 0);
2104   stringer (8 + 1);
2105   subseg_set (old_section, old_subsection);
2106 }
2107
2108 #ifdef INIT_STAB_SECTION
2109
2110 /* The first entry in a .stabs section is special.  */
2111
2112 void
2113 obj_elf_init_stab_section (segT seg)
2114 {
2115   const char *file;
2116   char *p;
2117   char *stabstr_name;
2118   unsigned int stroff;
2119
2120   /* Force the section to align to a longword boundary.  Without this,
2121      UnixWare ar crashes.  */
2122   bfd_set_section_alignment (stdoutput, seg, 2);
2123
2124   /* Make space for this first symbol.  */
2125   p = frag_more (12);
2126   /* Zero it out.  */
2127   memset (p, 0, 12);
2128   file = as_where (NULL);
2129   stabstr_name = concat (segment_name (seg), "str", (char *) NULL);
2130   stroff = get_stab_string_offset (file, stabstr_name);
2131   know (stroff == 1 || (stroff == 0 && file[0] == '\0'));
2132   md_number_to_chars (p, stroff, 4);
2133   seg_info (seg)->stabu.p = p;
2134 }
2135
2136 #endif
2137
2138 /* Fill in the counts in the first entry in a .stabs section.  */
2139
2140 static void
2141 adjust_stab_sections (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
2142 {
2143   char *name;
2144   asection *strsec;
2145   char *p;
2146   int strsz, nsyms;
2147
2148   if (strncmp (".stab", sec->name, 5))
2149     return;
2150   if (!strcmp ("str", sec->name + strlen (sec->name) - 3))
2151     return;
2152
2153   name = concat (sec->name, "str", NULL);
2154   strsec = bfd_get_section_by_name (abfd, name);
2155   if (strsec)
2156     strsz = bfd_section_size (abfd, strsec);
2157   else
2158     strsz = 0;
2159   nsyms = bfd_section_size (abfd, sec) / 12 - 1;
2160
2161   p = seg_info (sec)->stabu.p;
2162   gas_assert (p != 0);
2163
2164   bfd_h_put_16 (abfd, nsyms, p + 6);
2165   bfd_h_put_32 (abfd, strsz, p + 8);
2166   free (name);
2167 }
2168
2169 #ifdef NEED_ECOFF_DEBUG
2170
2171 /* This function is called by the ECOFF code.  It is supposed to
2172    record the external symbol information so that the backend can
2173    write it out correctly.  The ELF backend doesn't actually handle
2174    this at the moment, so we do it ourselves.  We save the information
2175    in the symbol.  */
2176
2177 #ifdef OBJ_MAYBE_ELF
2178 static
2179 #endif
2180 void
2181 elf_ecoff_set_ext (symbolS *sym, struct ecoff_extr *ext)
2182 {
2183   symbol_get_bfdsym (sym)->udata.p = ext;
2184 }
2185
2186 /* This function is called by bfd_ecoff_debug_externals.  It is
2187    supposed to *EXT to the external symbol information, and return
2188    whether the symbol should be used at all.  */
2189
2190 static bfd_boolean
2191 elf_get_extr (asymbol *sym, EXTR *ext)
2192 {
2193   if (sym->udata.p == NULL)
2194     return FALSE;
2195   *ext = *(EXTR *) sym->udata.p;
2196   return TRUE;
2197 }
2198
2199 /* This function is called by bfd_ecoff_debug_externals.  It has
2200    nothing to do for ELF.  */
2201
2202 static void
2203 elf_set_index (asymbol *sym ATTRIBUTE_UNUSED,
2204                bfd_size_type indx ATTRIBUTE_UNUSED)
2205 {
2206 }
2207
2208 #endif /* NEED_ECOFF_DEBUG */
2209
2210 void
2211 elf_frob_symbol (symbolS *symp, int *puntp)
2212 {
2213   struct elf_obj_sy *sy_obj;
2214   expressionS *size;
2215
2216 #ifdef NEED_ECOFF_DEBUG
2217   if (ECOFF_DEBUGGING)
2218     ecoff_frob_symbol (symp);
2219 #endif
2220
2221   sy_obj = symbol_get_obj (symp);
2222
2223   size = sy_obj->size;
2224   if (size != NULL)
2225     {
2226       if (resolve_expression (size)
2227           && size->X_op == O_constant)
2228         S_SET_SIZE (symp, size->X_add_number);
2229       else
2230         {
2231           if (!flag_allow_nonconst_size)
2232             as_bad (_(".size expression for %s "
2233                       "does not evaluate to a constant"), S_GET_NAME (symp));
2234           else
2235             as_warn (_(".size expression for %s "
2236                        "does not evaluate to a constant"), S_GET_NAME (symp));
2237         }
2238       free (sy_obj->size);
2239       sy_obj->size = NULL;
2240     }
2241
2242   if (sy_obj->versioned_name != NULL)
2243     {
2244       char *p;
2245
2246       p = strchr (sy_obj->versioned_name, ELF_VER_CHR);
2247       if (p == NULL)
2248         /* We will have already reported an error about a missing version.  */
2249         *puntp = TRUE;
2250
2251       /* This symbol was given a new name with the .symver directive.
2252
2253          If this is an external reference, just rename the symbol to
2254          include the version string.  This will make the relocs be
2255          against the correct versioned symbol.
2256
2257          If this is a definition, add an alias.  FIXME: Using an alias
2258          will permit the debugging information to refer to the right
2259          symbol.  However, it's not clear whether it is the best
2260          approach.  */
2261
2262       else if (! S_IS_DEFINED (symp))
2263         {
2264           /* Verify that the name isn't using the @@ syntax--this is
2265              reserved for definitions of the default version to link
2266              against.  */
2267           if (p[1] == ELF_VER_CHR)
2268             {
2269               as_bad (_("invalid attempt to declare external version name"
2270                         " as default in symbol `%s'"),
2271                       sy_obj->versioned_name);
2272               *puntp = TRUE;
2273             }
2274           S_SET_NAME (symp, sy_obj->versioned_name);
2275         }
2276       else
2277         {
2278           if (p[1] == ELF_VER_CHR && p[2] == ELF_VER_CHR)
2279             {
2280               size_t l;
2281
2282               /* The @@@ syntax is a special case. It renames the
2283                  symbol name to versioned_name with one `@' removed.  */
2284               l = strlen (&p[3]) + 1;
2285               memmove (&p[2], &p[3], l);
2286               S_SET_NAME (symp, sy_obj->versioned_name);
2287             }
2288           else
2289             {
2290               symbolS *symp2;
2291
2292               /* FIXME: Creating a new symbol here is risky.  We're
2293                  in the final loop over the symbol table.  We can
2294                  get away with it only because the symbol goes to
2295                  the end of the list, where the loop will still see
2296                  it.  It would probably be better to do this in
2297                  obj_frob_file_before_adjust.  */
2298
2299               symp2 = symbol_find_or_make (sy_obj->versioned_name);
2300
2301               /* Now we act as though we saw symp2 = sym.  */
2302               if (S_IS_COMMON (symp))
2303                 {
2304                   as_bad (_("`%s' can't be versioned to common symbol '%s'"),
2305                           sy_obj->versioned_name, S_GET_NAME (symp));
2306                   *puntp = TRUE;
2307                   return;
2308                 }
2309
2310               S_SET_SEGMENT (symp2, S_GET_SEGMENT (symp));
2311
2312               /* Subtracting out the frag address here is a hack
2313                  because we are in the middle of the final loop.  */
2314               S_SET_VALUE (symp2,
2315                            (S_GET_VALUE (symp)
2316                             - symbol_get_frag (symp)->fr_address));
2317
2318               symbol_set_frag (symp2, symbol_get_frag (symp));
2319
2320               /* This will copy over the size information.  */
2321               copy_symbol_attributes (symp2, symp);
2322
2323               S_SET_OTHER (symp2, S_GET_OTHER (symp));
2324
2325               if (S_IS_WEAK (symp))
2326                 S_SET_WEAK (symp2);
2327
2328               if (S_IS_EXTERNAL (symp))
2329                 S_SET_EXTERNAL (symp2);
2330             }
2331         }
2332     }
2333
2334   /* Double check weak symbols.  */
2335   if (S_IS_WEAK (symp))
2336     {
2337       if (S_IS_COMMON (symp))
2338         as_bad (_("symbol `%s' can not be both weak and common"),
2339                 S_GET_NAME (symp));
2340     }
2341
2342 #ifdef TC_MIPS
2343   /* The Irix 5 and 6 assemblers set the type of any common symbol and
2344      any undefined non-function symbol to STT_OBJECT.  We try to be
2345      compatible, since newer Irix 5 and 6 linkers care.  However, we
2346      only set undefined symbols to be STT_OBJECT if we are on Irix,
2347      because that is the only time gcc will generate the necessary
2348      .global directives to mark functions.  */
2349
2350   if (S_IS_COMMON (symp))
2351     symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
2352
2353   if (strstr (TARGET_OS, "irix") != NULL
2354       && ! S_IS_DEFINED (symp)
2355       && (symbol_get_bfdsym (symp)->flags & BSF_FUNCTION) == 0)
2356     symbol_get_bfdsym (symp)->flags |= BSF_OBJECT;
2357 #endif
2358 }
2359
2360 struct group_list
2361 {
2362   asection **head;              /* Section lists.  */
2363   unsigned int num_group;       /* Number of lists.  */
2364   struct hash_control *indexes; /* Maps group name to index in head array.  */
2365 };
2366
2367 static struct group_list groups;
2368
2369 /* Called via bfd_map_over_sections.  If SEC is a member of a group,
2370    add it to a list of sections belonging to the group.  INF is a
2371    pointer to a struct group_list, which is where we store the head of
2372    each list.  */
2373
2374 static void
2375 build_group_lists (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
2376 {
2377   struct group_list *list = (struct group_list *) inf;
2378   const char *group_name = elf_group_name (sec);
2379   unsigned int i;
2380   unsigned int *elem_idx;
2381   unsigned int *idx_ptr;
2382
2383   if (group_name == NULL)
2384     return;
2385
2386   /* If this group already has a list, add the section to the head of
2387      the list.  */
2388   elem_idx = (unsigned int *) hash_find (list->indexes, group_name);
2389   if (elem_idx != NULL)
2390     {
2391       elf_next_in_group (sec) = list->head[*elem_idx];
2392       list->head[*elem_idx] = sec;
2393       return;
2394     }
2395
2396   /* New group.  Make the arrays bigger in chunks to minimize calls to
2397      realloc.  */
2398   i = list->num_group;
2399   if ((i & 127) == 0)
2400     {
2401       unsigned int newsize = i + 128;
2402       list->head = XRESIZEVEC (asection *, list->head, newsize);
2403     }
2404   list->head[i] = sec;
2405   list->num_group += 1;
2406
2407   /* Add index to hash.  */
2408   idx_ptr = XNEW (unsigned int);
2409   *idx_ptr = i;
2410   hash_insert (list->indexes, group_name, idx_ptr);
2411 }
2412
2413 static void free_section_idx (const char *key ATTRIBUTE_UNUSED, void *val)
2414 {
2415   free ((unsigned int *) val);
2416 }
2417
2418 /* Create symbols for group signature.  */
2419
2420 void
2421 elf_adjust_symtab (void)
2422 {
2423   unsigned int i;
2424
2425   /* Go find section groups.  */
2426   groups.num_group = 0;
2427   groups.head = NULL;
2428   groups.indexes = hash_new ();
2429   bfd_map_over_sections (stdoutput, build_group_lists, &groups);
2430
2431   /* Make the SHT_GROUP sections that describe each section group.  We
2432      can't set up the section contents here yet, because elf section
2433      indices have yet to be calculated.  elf.c:set_group_contents does
2434      the rest of the work.  */
2435  for (i = 0; i < groups.num_group; i++)
2436     {
2437       const char *group_name = elf_group_name (groups.head[i]);
2438       const char *sec_name;
2439       asection *s;
2440       flagword flags;
2441       struct symbol *sy;
2442
2443       flags = SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_GROUP;
2444       for (s = groups.head[i]; s != NULL; s = elf_next_in_group (s))
2445         if ((s->flags ^ flags) & SEC_LINK_ONCE)
2446           {
2447             flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
2448             if (s != groups.head[i])
2449               {
2450                 as_warn (_("assuming all members of group `%s' are COMDAT"),
2451                          group_name);
2452                 break;
2453               }
2454           }
2455
2456       sec_name = ".group";
2457       s = subseg_force_new (sec_name, 0);
2458       if (s == NULL
2459           || !bfd_set_section_flags (stdoutput, s, flags)
2460           || !bfd_set_section_alignment (stdoutput, s, 2))
2461         {
2462           as_fatal (_("can't create group: %s"),
2463                     bfd_errmsg (bfd_get_error ()));
2464         }
2465       elf_section_type (s) = SHT_GROUP;
2466
2467       /* Pass a pointer to the first section in this group.  */
2468       elf_next_in_group (s) = groups.head[i];
2469       elf_sec_group (groups.head[i]) = s;
2470       /* Make sure that the signature symbol for the group has the
2471          name of the group.  */
2472       sy = symbol_find_exact (group_name);
2473       if (!sy || !symbol_on_chain (sy, symbol_rootP, symbol_lastP))
2474         {
2475           /* Create the symbol now.  */
2476           sy = symbol_new (group_name, now_seg, (valueT) 0, frag_now);
2477 #ifdef TE_SOLARIS
2478           /* Before Solaris 11 build 154, Sun ld rejects local group
2479              signature symbols, so make them weak hidden instead.  */
2480           symbol_get_bfdsym (sy)->flags |= BSF_WEAK;
2481           S_SET_OTHER (sy, STV_HIDDEN);
2482 #else
2483           symbol_get_obj (sy)->local = 1;
2484 #endif
2485           symbol_table_insert (sy);
2486         }
2487       elf_group_id (s) = symbol_get_bfdsym (sy);
2488     }
2489 }
2490
2491 void
2492 elf_frob_file (void)
2493 {
2494   bfd_map_over_sections (stdoutput, adjust_stab_sections, NULL);
2495
2496 #ifdef elf_tc_final_processing
2497   elf_tc_final_processing ();
2498 #endif
2499 }
2500
2501 /* It removes any unneeded versioned symbols from the symbol table.  */
2502
2503 void
2504 elf_frob_file_before_adjust (void)
2505 {
2506   if (symbol_rootP)
2507     {
2508       symbolS *symp;
2509
2510       for (symp = symbol_rootP; symp; symp = symbol_next (symp))
2511         if (!S_IS_DEFINED (symp))
2512           {
2513             if (symbol_get_obj (symp)->versioned_name)
2514               {
2515                 char *p;
2516
2517                 /* The @@@ syntax is a special case. If the symbol is
2518                    not defined, 2 `@'s will be removed from the
2519                    versioned_name.  */
2520
2521                 p = strchr (symbol_get_obj (symp)->versioned_name,
2522                             ELF_VER_CHR);
2523                 if (p != NULL && p[1] == ELF_VER_CHR && p[2] == ELF_VER_CHR)
2524                   {
2525                     size_t l = strlen (&p[3]) + 1;
2526                     memmove (&p[1], &p[3], l);
2527                   }
2528                 if (symbol_used_p (symp) == 0
2529                     && symbol_used_in_reloc_p (symp) == 0)
2530                   symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2531               }
2532
2533             /* If there was .weak foo, but foo was neither defined nor
2534                used anywhere, remove it.  */
2535
2536             else if (S_IS_WEAK (symp)
2537                      && symbol_used_p (symp) == 0
2538                      && symbol_used_in_reloc_p (symp) == 0)
2539               symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2540           }
2541     }
2542 }
2543
2544 /* It is required that we let write_relocs have the opportunity to
2545    optimize away fixups before output has begun, since it is possible
2546    to eliminate all fixups for a section and thus we never should
2547    have generated the relocation section.  */
2548
2549 void
2550 elf_frob_file_after_relocs (void)
2551 {
2552   unsigned int i;
2553
2554   /* Set SHT_GROUP section size.  */
2555   for (i = 0; i < groups.num_group; i++)
2556     {
2557       asection *s, *head, *group;
2558       bfd_size_type size;
2559
2560       head = groups.head[i];
2561       size = 4;
2562       for (s = head; s != NULL; s = elf_next_in_group (s))
2563         size += (s->flags & SEC_RELOC) != 0 ? 8 : 4;
2564
2565       group = elf_sec_group (head);
2566       subseg_set (group, 0);
2567       bfd_set_section_size (stdoutput, group, size);
2568       group->contents = (unsigned char *) frag_more (size);
2569       frag_now->fr_fix = frag_now_fix_octets ();
2570       frag_wane (frag_now);
2571     }
2572
2573   /* Cleanup hash.  */
2574   hash_traverse (groups.indexes, free_section_idx);
2575   hash_die (groups.indexes);
2576
2577 #ifdef NEED_ECOFF_DEBUG
2578   if (ECOFF_DEBUGGING)
2579     /* Generate the ECOFF debugging information.  */
2580     {
2581       const struct ecoff_debug_swap *debug_swap;
2582       struct ecoff_debug_info debug;
2583       char *buf;
2584       asection *sec;
2585
2586       debug_swap
2587         = get_elf_backend_data (stdoutput)->elf_backend_ecoff_debug_swap;
2588       know (debug_swap != NULL);
2589       ecoff_build_debug (&debug.symbolic_header, &buf, debug_swap);
2590
2591       /* Set up the pointers in debug.  */
2592 #define SET(ptr, offset, type) \
2593     debug.ptr = (type) (buf + debug.symbolic_header.offset)
2594
2595       SET (line, cbLineOffset, unsigned char *);
2596       SET (external_dnr, cbDnOffset, void *);
2597       SET (external_pdr, cbPdOffset, void *);
2598       SET (external_sym, cbSymOffset, void *);
2599       SET (external_opt, cbOptOffset, void *);
2600       SET (external_aux, cbAuxOffset, union aux_ext *);
2601       SET (ss, cbSsOffset, char *);
2602       SET (external_fdr, cbFdOffset, void *);
2603       SET (external_rfd, cbRfdOffset, void *);
2604       /* ssext and external_ext are set up just below.  */
2605
2606 #undef SET
2607
2608       /* Set up the external symbols.  */
2609       debug.ssext = debug.ssext_end = NULL;
2610       debug.external_ext = debug.external_ext_end = NULL;
2611       if (! bfd_ecoff_debug_externals (stdoutput, &debug, debug_swap, TRUE,
2612                                        elf_get_extr, elf_set_index))
2613         as_fatal (_("failed to set up debugging information: %s"),
2614                   bfd_errmsg (bfd_get_error ()));
2615
2616       sec = bfd_get_section_by_name (stdoutput, ".mdebug");
2617       gas_assert (sec != NULL);
2618
2619       know (!stdoutput->output_has_begun);
2620
2621       /* We set the size of the section, call bfd_set_section_contents
2622          to force the ELF backend to allocate a file position, and then
2623          write out the data.  FIXME: Is this really the best way to do
2624          this?  */
2625       bfd_set_section_size
2626         (stdoutput, sec, bfd_ecoff_debug_size (stdoutput, &debug, debug_swap));
2627
2628       /* Pass BUF to bfd_set_section_contents because this will
2629          eventually become a call to fwrite, and ISO C prohibits
2630          passing a NULL pointer to a stdio function even if the
2631          pointer will not be used.  */
2632       if (! bfd_set_section_contents (stdoutput, sec, buf, 0, 0))
2633         as_fatal (_("can't start writing .mdebug section: %s"),
2634                   bfd_errmsg (bfd_get_error ()));
2635
2636       know (stdoutput->output_has_begun);
2637       know (sec->filepos != 0);
2638
2639       if (! bfd_ecoff_write_debug (stdoutput, &debug, debug_swap,
2640                                    sec->filepos))
2641         as_fatal (_("could not write .mdebug section: %s"),
2642                   bfd_errmsg (bfd_get_error ()));
2643     }
2644 #endif /* NEED_ECOFF_DEBUG */
2645 }
2646
2647 static void
2648 elf_generate_asm_lineno (void)
2649 {
2650 #ifdef NEED_ECOFF_DEBUG
2651   if (ECOFF_DEBUGGING)
2652     ecoff_generate_asm_lineno ();
2653 #endif
2654 }
2655
2656 static void
2657 elf_process_stab (segT sec ATTRIBUTE_UNUSED,
2658                   int what ATTRIBUTE_UNUSED,
2659                   const char *string ATTRIBUTE_UNUSED,
2660                   int type ATTRIBUTE_UNUSED,
2661                   int other ATTRIBUTE_UNUSED,
2662                   int desc ATTRIBUTE_UNUSED)
2663 {
2664 #ifdef NEED_ECOFF_DEBUG
2665   if (ECOFF_DEBUGGING)
2666     ecoff_stab (sec, what, string, type, other, desc);
2667 #endif
2668 }
2669
2670 static int
2671 elf_separate_stab_sections (void)
2672 {
2673 #ifdef NEED_ECOFF_DEBUG
2674   return (!ECOFF_DEBUGGING);
2675 #else
2676   return 1;
2677 #endif
2678 }
2679
2680 static void
2681 elf_init_stab_section (segT seg)
2682 {
2683 #ifdef NEED_ECOFF_DEBUG
2684   if (!ECOFF_DEBUGGING)
2685 #endif
2686     obj_elf_init_stab_section (seg);
2687 }
2688
2689 const struct format_ops elf_format_ops =
2690 {
2691   bfd_target_elf_flavour,
2692   0,    /* dfl_leading_underscore */
2693   1,    /* emit_section_symbols */
2694   elf_begin,
2695   elf_file_symbol,
2696   elf_frob_symbol,
2697   elf_frob_file,
2698   elf_frob_file_before_adjust,
2699   0,    /* obj_frob_file_before_fix */
2700   elf_frob_file_after_relocs,
2701   elf_s_get_size, elf_s_set_size,
2702   elf_s_get_align, elf_s_set_align,
2703   elf_s_get_other,
2704   elf_s_set_other,
2705   0,    /* s_get_desc */
2706   0,    /* s_set_desc */
2707   0,    /* s_get_type */
2708   0,    /* s_set_type */
2709   elf_copy_symbol_attributes,
2710   elf_generate_asm_lineno,
2711   elf_process_stab,
2712   elf_separate_stab_sections,
2713   elf_init_stab_section,
2714   elf_sec_sym_ok_for_reloc,
2715   elf_pop_insert,
2716 #ifdef NEED_ECOFF_DEBUG
2717   elf_ecoff_set_ext,
2718 #else
2719   0,    /* ecoff_set_ext */
2720 #endif
2721   elf_obj_read_begin_hook,
2722   elf_obj_symbol_new_hook,
2723   0,
2724   elf_adjust_symtab
2725 };