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