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