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