Home | History | Annotate | Download | only in src
      1 /* Copyright (C) 2001-2011 Red Hat, Inc.
      2    This file is part of Red Hat elfutils.
      3    Written by Ulrich Drepper <drepper (at) redhat.com>, 2001.
      4 
      5    Red Hat elfutils is free software; you can redistribute it and/or modify
      6    it under the terms of the GNU General Public License as published by the
      7    Free Software Foundation; version 2 of the License.
      8 
      9    Red Hat elfutils is distributed in the hope that it will be useful, but
     10    WITHOUT ANY WARRANTY; without even the implied warranty of
     11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12    General Public License for more details.
     13 
     14    You should have received a copy of the GNU General Public License along
     15    with Red Hat elfutils; if not, write to the Free Software Foundation,
     16    Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
     17 
     18    Red Hat elfutils is an included package of the Open Invention Network.
     19    An included package of the Open Invention Network is a package for which
     20    Open Invention Network licensees cross-license their patents.  No patent
     21    license is granted, either expressly or impliedly, by designation as an
     22    included package.  Should you wish to participate in the Open Invention
     23    Network licensing program, please visit www.openinventionnetwork.com
     24    <http://www.openinventionnetwork.com>.  */
     25 
     26 #ifdef HAVE_CONFIG_H
     27 # include <config.h>
     28 #endif
     29 
     30 #include <assert.h>
     31 #include <ctype.h>
     32 #include <dlfcn.h>
     33 #include <errno.h>
     34 #include <error.h>
     35 #include <fcntl.h>
     36 #include <fnmatch.h>
     37 #include <gelf.h>
     38 #include <inttypes.h>
     39 #include <libintl.h>
     40 #include <stdbool.h>
     41 #include <stdio_ext.h>
     42 #include <stdlib.h>
     43 #include <string.h>
     44 #include <unistd.h>
     45 #include <sys/param.h>
     46 #include <sys/stat.h>
     47 
     48 #include <elf-knowledge.h>
     49 #include "ld.h"
     50 #include "list.h"
     51 #include <md5.h>
     52 #include <sha1.h>
     53 #include <system.h>
     54 
     55 
     56 /* Header of .eh_frame_hdr section.  */
     57 struct unw_eh_frame_hdr
     58 {
     59   unsigned char version;
     60   unsigned char eh_frame_ptr_enc;
     61   unsigned char fde_count_enc;
     62   unsigned char table_enc;
     63 };
     64 #define EH_FRAME_HDR_VERSION 1
     65 
     66 
     67 /* Prototypes for local functions.  */
     68 static const char **ld_generic_lib_extensions (struct ld_state *)
     69      __attribute__ ((__const__));
     70 static int ld_generic_file_close (struct usedfiles *fileinfo,
     71 				  struct ld_state *statep);
     72 static int ld_generic_file_process (int fd, struct usedfiles *fileinfo,
     73 				    struct ld_state *statep,
     74 				    struct usedfiles **nextp);
     75 static void ld_generic_generate_sections (struct ld_state *statep);
     76 static void ld_generic_create_sections (struct ld_state *statep);
     77 static int ld_generic_flag_unresolved (struct ld_state *statep);
     78 static int ld_generic_open_outfile (struct ld_state *statep, int machine,
     79 				    int class, int data);
     80 static int ld_generic_create_outfile (struct ld_state *statep);
     81 static void ld_generic_relocate_section (struct ld_state *statep,
     82 					 Elf_Scn *outscn,
     83 					 struct scninfo *firstp,
     84 					 const Elf32_Word *dblindirect);
     85 static int ld_generic_finalize (struct ld_state *statep);
     86 static bool ld_generic_special_section_number_p (struct ld_state *statep,
     87 						 size_t number);
     88 static bool ld_generic_section_type_p (struct ld_state *statep,
     89 				       XElf_Word type);
     90 static XElf_Xword ld_generic_dynamic_section_flags (struct ld_state *statep);
     91 static void ld_generic_initialize_plt (struct ld_state *statep, Elf_Scn *scn);
     92 static void ld_generic_initialize_pltrel (struct ld_state *statep,
     93 					  Elf_Scn *scn);
     94 static void ld_generic_initialize_got (struct ld_state *statep, Elf_Scn *scn);
     95 static void ld_generic_initialize_gotplt (struct ld_state *statep,
     96 					  Elf_Scn *scn);
     97 static void ld_generic_finalize_plt (struct ld_state *statep, size_t nsym,
     98 				     size_t nsym_dyn,
     99 				     struct symbol **ndxtosymp);
    100 static int ld_generic_rel_type (struct ld_state *statep);
    101 static void ld_generic_count_relocations (struct ld_state *statep,
    102 					  struct scninfo *scninfo);
    103 static void ld_generic_create_relocations (struct ld_state *statep,
    104 					   const Elf32_Word *dblindirect);
    105 
    106 static int file_process2 (struct usedfiles *fileinfo);
    107 static void mark_section_used (struct scninfo *scninfo, Elf32_Word shndx,
    108 			       struct scninfo **grpscnp);
    109 
    110 
    111 /* Map symbol index to struct symbol record.  */
    112 static struct symbol **ndxtosym;
    113 
    114 /* String table reference to all symbols in the symbol table.  */
    115 static struct Ebl_Strent **symstrent;
    116 
    117 
    118 /* Check whether file associated with FD is a DSO.  */
    119 static bool
    120 is_dso_p (int fd)
    121 {
    122   /* We have to read the 'e_type' field.  It has the same size (16
    123      bits) in 32- and 64-bit ELF.  */
    124   XElf_Half e_type;
    125 
    126   return (pread (fd, &e_type, sizeof (e_type), offsetof (XElf_Ehdr, e_type))
    127 	  == sizeof (e_type)
    128 	  && e_type == ET_DYN);
    129 }
    130 
    131 
    132 /* Print the complete name of a file, including the archive it is
    133    contained in.  */
    134 static int
    135 print_file_name (FILE *s, struct usedfiles *fileinfo, int first_level,
    136 		 int newline)
    137 {
    138   int npar = 0;
    139 
    140   if (fileinfo->archive_file != NULL)
    141     {
    142       npar = print_file_name (s, fileinfo->archive_file, 0, 0) + 1;
    143       fputc_unlocked ('(', s);
    144       fputs_unlocked (fileinfo->rfname, s);
    145 
    146       if (first_level)
    147 	while (npar-- > 0)
    148 	  fputc_unlocked (')', s);
    149     }
    150   else
    151     fputs_unlocked (fileinfo->rfname, s);
    152 
    153   if (first_level && newline)
    154     fputc_unlocked ('\n', s);
    155 
    156   return npar;
    157 }
    158 
    159 
    160 /* Function to determine whether an object will be dynamically linked.  */
    161 bool
    162 dynamically_linked_p (void)
    163 {
    164   return (ld_state.file_type == dso_file_type || ld_state.nplt > 0
    165 	  || ld_state.ngot > 0);
    166 }
    167 
    168 
    169 bool
    170 linked_from_dso_p (struct scninfo *scninfo, size_t symidx)
    171 {
    172   struct usedfiles *file = scninfo->fileinfo;
    173 
    174   /* If this symbol is not undefined in this file it cannot come from
    175      a DSO.  */
    176   if (symidx < file->nlocalsymbols)
    177     return false;
    178 
    179   struct symbol *sym = file->symref[symidx];
    180 
    181   return sym->defined && sym->in_dso;
    182 }
    183 
    184 
    185 /* Initialize state object.  This callback function is called after the
    186    parameters are parsed but before any file is searched for.  */
    187 int
    188 ld_prepare_state (const char *emulation)
    189 {
    190   /* When generating DSO we normally allow undefined symbols.  */
    191   ld_state.nodefs = true;
    192 
    193   /* To be able to detect problems we add a .comment section entry by
    194      default.  */
    195   ld_state.add_ld_comment = true;
    196 
    197   /* XXX We probably should find a better place for this.  The index
    198      of the first user-defined version is 2.  */
    199   ld_state.nextveridx = 2;
    200 
    201   /* Pick an not too small number for the initial size of the tables.  */
    202   ld_symbol_tab_init (&ld_state.symbol_tab, 1027);
    203   ld_section_tab_init (&ld_state.section_tab, 67);
    204   ld_version_str_tab_init (&ld_state.version_str_tab, 67);
    205 
    206   /* Initialize the section header string table.  */
    207   ld_state.shstrtab = ebl_strtabinit (true);
    208   if (ld_state.shstrtab == NULL)
    209     error (EXIT_FAILURE, errno, gettext ("cannot create string table"));
    210 
    211   /* Initialize the callbacks.  These are the defaults, the appropriate
    212      backend can later install its own callbacks.  */
    213   ld_state.callbacks.lib_extensions = ld_generic_lib_extensions;
    214   ld_state.callbacks.file_process = ld_generic_file_process;
    215   ld_state.callbacks.file_close = ld_generic_file_close;
    216   ld_state.callbacks.generate_sections = ld_generic_generate_sections;
    217   ld_state.callbacks.create_sections = ld_generic_create_sections;
    218   ld_state.callbacks.flag_unresolved = ld_generic_flag_unresolved;
    219   ld_state.callbacks.open_outfile = ld_generic_open_outfile;
    220   ld_state.callbacks.create_outfile = ld_generic_create_outfile;
    221   ld_state.callbacks.relocate_section = ld_generic_relocate_section;
    222   ld_state.callbacks.finalize = ld_generic_finalize;
    223   ld_state.callbacks.special_section_number_p =
    224     ld_generic_special_section_number_p;
    225   ld_state.callbacks.section_type_p = ld_generic_section_type_p;
    226   ld_state.callbacks.dynamic_section_flags = ld_generic_dynamic_section_flags;
    227   ld_state.callbacks.initialize_plt = ld_generic_initialize_plt;
    228   ld_state.callbacks.initialize_pltrel = ld_generic_initialize_pltrel;
    229   ld_state.callbacks.initialize_got = ld_generic_initialize_got;
    230   ld_state.callbacks.initialize_gotplt = ld_generic_initialize_gotplt;
    231   ld_state.callbacks.finalize_plt = ld_generic_finalize_plt;
    232   ld_state.callbacks.rel_type = ld_generic_rel_type;
    233   ld_state.callbacks.count_relocations = ld_generic_count_relocations;
    234   ld_state.callbacks.create_relocations = ld_generic_create_relocations;
    235 
    236 #ifndef BASE_ELF_NAME
    237   /* Find the ld backend library.  Use EBL to determine the name if
    238      the user hasn't provided one on the command line.  */
    239   if (emulation == NULL)
    240     {
    241       emulation = ebl_backend_name (ld_state.ebl);
    242       assert (emulation != NULL);
    243     }
    244   size_t emulation_len = strlen (emulation);
    245 
    246   /* Construct the file name.  */
    247   char *fname = (char *) alloca (sizeof "libld_" - 1 + emulation_len
    248 				 + sizeof ".so");
    249   strcpy (mempcpy (stpcpy (fname, "libld_"), emulation, emulation_len), ".so");
    250 
    251   /* Try loading.  */
    252   void *h = dlopen (fname, RTLD_LAZY);
    253   if (h == NULL)
    254     error (EXIT_FAILURE, 0,
    255 	   gettext ("cannot load ld backend library '%s': %s"),
    256 	   fname, dlerror ());
    257 
    258   /* Find the initializer.  It must be present.  */
    259   char *initname = (char *) alloca (emulation_len + sizeof "_ld_init");
    260   strcpy (mempcpy (initname, emulation, emulation_len), "_ld_init");
    261   int (*initfct) (struct ld_state *)
    262     = (int (*) (struct ld_state *)) dlsym (h, initname);
    263 
    264   if (initfct == NULL)
    265     error (EXIT_FAILURE, 0, gettext ("\
    266 cannot find init function in ld backend library '%s': %s"),
    267 	   fname, dlerror ());
    268 
    269   /* Store the handle.  */
    270   ld_state.ldlib = h;
    271 
    272   /* Call the init function.  */
    273   return initfct (&ld_state);
    274 #else
    275 # define INIT_FCT_NAME(base) _INIT_FCT_NAME(base)
    276 # define _INIT_FCT_NAME(base) base##_ld_init
    277   /* Declare and call the initialization function.  */
    278   extern int INIT_FCT_NAME(BASE_ELF_NAME) (struct ld_state *);
    279   return INIT_FCT_NAME(BASE_ELF_NAME) (&ld_state);
    280 #endif
    281 }
    282 
    283 
    284 static int
    285 check_for_duplicate2 (struct usedfiles *newp, struct usedfiles *list)
    286 {
    287   struct usedfiles *first;
    288 
    289   if (list == NULL)
    290     return 0;
    291 
    292   list = first = list->next;
    293   do
    294     {
    295       /* When searching the needed list we might come across entries
    296 	 for files which are not yet opened.  Stop then, there is
    297 	 nothing more to test.  */
    298       if (likely (list->status == not_opened))
    299 	break;
    300 
    301       if (unlikely (list->ino == newp->ino)
    302 	  && unlikely (list->dev == newp->dev))
    303 	{
    304 	  close (newp->fd);
    305 	  newp->fd = -1;
    306 	  newp->status = closed;
    307 	  if (newp->file_type == relocatable_file_type)
    308 	    error (0, 0, gettext ("%s listed more than once as input"),
    309 		   newp->rfname);
    310 
    311 	  return 1;
    312 	}
    313       list = list->next;
    314     }
    315   while (likely (list != first));
    316 
    317   return 0;
    318 }
    319 
    320 
    321 static int
    322 check_for_duplicate (struct usedfiles *newp)
    323 {
    324   struct stat st;
    325 
    326   if (unlikely (fstat (newp->fd, &st) < 0))
    327     {
    328       close (newp->fd);
    329       return errno;
    330     }
    331 
    332   newp->dev = st.st_dev;
    333   newp->ino = st.st_ino;
    334 
    335   return (check_for_duplicate2 (newp, ld_state.relfiles)
    336 	  || check_for_duplicate2 (newp, ld_state.dsofiles)
    337 	  || check_for_duplicate2 (newp, ld_state.needed));
    338 }
    339 
    340 
    341 /* Find a file along the path described in the state.  */
    342 static int
    343 open_along_path2 (struct usedfiles *fileinfo, struct pathelement *path)
    344 {
    345   const char *fname = fileinfo->fname;
    346   size_t fnamelen = strlen (fname);
    347   int err = ENOENT;
    348   struct pathelement *firstp = path;
    349 
    350   if (path == NULL)
    351     /* Cannot find anything since we have no path.  */
    352     return ENOENT;
    353 
    354   do
    355     {
    356       if (likely (path->exist >= 0))
    357 	{
    358 	  /* Create the file name.  */
    359 	  char *rfname = NULL;
    360 	  size_t dirlen = strlen (path->pname);
    361 	  int fd = -1;
    362 
    363 	  if (fileinfo->file_type == archive_file_type)
    364 	    {
    365 	      const char **exts = (ld_state.statically
    366 				   ? (const char *[2]) { ".a", NULL }
    367 				   : LIB_EXTENSION (&ld_state));
    368 
    369 	      /* We have to create the actual file name.  We prepend "lib"
    370 		 and add one of the extensions the platform has.  */
    371 	      while (*exts != NULL)
    372 		{
    373 		  size_t extlen = strlen (*exts);
    374 		  rfname = (char *) alloca (dirlen + 5 + fnamelen + extlen);
    375 		  memcpy (mempcpy (stpcpy (mempcpy (rfname, path->pname,
    376 						    dirlen),
    377 					   "/lib"),
    378 				   fname, fnamelen),
    379 			  *exts, extlen + 1);
    380 
    381 		  fd = open (rfname, O_RDONLY);
    382 		  if (likely (fd != -1) || errno != ENOENT)
    383 		    {
    384 		      err = fd == -1 ? errno : 0;
    385 		      break;
    386 		    }
    387 
    388 		  /* Next extension.  */
    389 		  ++exts;
    390 		}
    391 	    }
    392 	  else
    393 	    {
    394 	      assert (fileinfo->file_type == dso_file_type
    395 		      || fileinfo->file_type == dso_needed_file_type);
    396 
    397 	      rfname = (char *) alloca (dirlen + 1 + fnamelen + 1);
    398 	      memcpy (stpcpy (mempcpy (rfname, path->pname, dirlen), "/"),
    399 		      fname, fnamelen + 1);
    400 
    401 	      fd = open (rfname, O_RDONLY);
    402 	      if (unlikely (fd == -1))
    403 		err = errno;
    404 	    }
    405 
    406 	  if (likely (fd != -1))
    407 	    {
    408 	      /* We found the file.  This also means the directory
    409 		 exists.  */
    410 	      fileinfo->fd = fd;
    411 	      path->exist = 1;
    412 
    413 	      /* Check whether we have this file already loaded.  */
    414 	      if (unlikely (check_for_duplicate (fileinfo) != 0))
    415 		return EAGAIN;
    416 
    417 	      /* Make a copy of the name.  */
    418 	      fileinfo->rfname = obstack_strdup (&ld_state.smem, rfname);
    419 
    420 	      if (unlikely (ld_state.trace_files))
    421 		printf (fileinfo->file_type == archive_file_type
    422 			? gettext ("%s (for -l%s)\n")
    423 			: gettext ("%s (for DT_NEEDED %s)\n"),
    424 			rfname, fname);
    425 
    426 	      return 0;
    427 	    }
    428 
    429 	  /* The file does not exist.  Maybe the whole directory doesn't.
    430 	     Check it unless we know it exists.  */
    431 	  if (unlikely (path->exist == 0))
    432 	    {
    433 	      struct stat st;
    434 
    435 	      /* Keep only the directory name.  Note that the path
    436 		 might be relative.  This doesn't matter here.  We do
    437 		 the test in any case even if there is the chance that
    438 		 somebody wants to change the programs working
    439 		 directory at some point which would make the result
    440 		 of this test void.  Since changing the working
    441 		 directory is completely wrong we are not taking this
    442 		 case into account.  */
    443 	      rfname[dirlen] = '\0';
    444 	      if (unlikely (stat (rfname, &st) < 0) || ! S_ISDIR (st.st_mode))
    445 		/* The directory does not exist or the named file is no
    446 		   directory.  */
    447 		path->exist = -1;
    448 	      else
    449 		path->exist = 1;
    450 	    }
    451 	}
    452 
    453       /* Next path element.  */
    454       path = path->next;
    455     }
    456   while (likely (err == ENOENT && path != firstp));
    457 
    458   return err;
    459 }
    460 
    461 
    462 static int
    463 open_along_path (struct usedfiles *fileinfo)
    464 {
    465   const char *fname = fileinfo->fname;
    466   int err = ENOENT;
    467 
    468   if (fileinfo->file_type == relocatable_file_type)
    469     {
    470       /* Only libraries are searched along the path.  */
    471       fileinfo->fd = open (fname, O_RDONLY);
    472 
    473       if (likely (fileinfo->fd != -1))
    474 	{
    475 	  /* We found the file.  */
    476 	  if (unlikely (ld_state.trace_files))
    477 	    print_file_name (stdout, fileinfo, 1, 1);
    478 
    479 	  return check_for_duplicate (fileinfo);
    480 	}
    481 
    482       /* If the name is an absolute path we are done.  */
    483       err = errno;
    484     }
    485   else
    486     {
    487       /* If the user specified two parts to the LD_LIBRARY_PATH variable
    488 	 try the first part now.  */
    489       err = open_along_path2 (fileinfo, ld_state.ld_library_path1);
    490 
    491       /* Try the user-specified path next.  */
    492       if (err == ENOENT)
    493 	err = open_along_path2 (fileinfo,
    494 				fileinfo->file_type == archive_file_type
    495 				? ld_state.paths : ld_state.rpath_link);
    496 
    497       /* Then the second part of the LD_LIBRARY_PATH value.  */
    498       if (unlikely (err == ENOENT))
    499 	{
    500 	  err = open_along_path2 (fileinfo, ld_state.ld_library_path2);
    501 
    502 	  /* In case we look for a DSO handle now the RUNPATH.  */
    503 	  if (err == ENOENT)
    504 	    {
    505 	      if (fileinfo->file_type == dso_file_type)
    506 		err = open_along_path2 (fileinfo, ld_state.runpath_link);
    507 
    508 	      /* Finally the path from the default linker script.  */
    509 	      if (err == ENOENT)
    510 		err = open_along_path2 (fileinfo, ld_state.default_paths);
    511 	    }
    512 	}
    513     }
    514 
    515   if (unlikely (err != 0)
    516       && (err != EAGAIN || fileinfo->file_type == relocatable_file_type))
    517     error (0, err, gettext ("cannot open %s"), fileinfo->fname);
    518 
    519   return err;
    520 }
    521 
    522 
    523 static int
    524 matching_group_comdat_scn (const XElf_Sym *sym, size_t shndx,
    525 			   struct usedfiles *fileinfo, struct symbol *oldp)
    526 {
    527   if ((shndx >= SHN_LORESERVE && shndx <= SHN_HIRESERVE)
    528       || (oldp->scndx >= SHN_LORESERVE && oldp->scndx <= SHN_HIRESERVE))
    529     /* Cannot be a group COMDAT section.  */
    530     return 0;
    531 
    532   size_t newgrpid = fileinfo->scninfo[shndx].grpid;
    533   size_t oldgrpid = oldp->file->scninfo[oldp->scndx].grpid;
    534   if (newgrpid == 0 || oldgrpid == 0)
    535     return 0;
    536 
    537   assert (SCNINFO_SHDR (fileinfo->scninfo[newgrpid].shdr).sh_type
    538 	  == SHT_GROUP);
    539   assert (SCNINFO_SHDR (oldp->file->scninfo[oldgrpid].shdr).sh_type
    540 	  == SHT_GROUP);
    541 
    542   if (! fileinfo->scninfo[newgrpid].comdat_group
    543       || ! oldp->file->scninfo[oldgrpid].comdat_group)
    544     return 0;
    545 
    546   if (strcmp (fileinfo->scninfo[newgrpid].symbols->name,
    547 	      oldp->file->scninfo[oldgrpid].symbols->name) != 0)
    548     return 0;
    549 
    550   /* This is a matching, duplicate COMDAT group section.  Ignore it.  */
    551   return 1;
    552 }
    553 
    554 
    555 static void
    556 check_type_and_size (const XElf_Sym *sym, struct usedfiles *fileinfo,
    557 		     struct symbol *oldp)
    558 {
    559   /* We check the type and size of the symbols.  In both cases the
    560      information can be missing (size is zero, type is STT_NOTYPE) in
    561      which case we issue no warnings.  Otherwise everything must
    562      match.  If the type does not match there is no point in checking
    563      the size.  */
    564 
    565   if (XELF_ST_TYPE (sym->st_info) != STT_NOTYPE && oldp->type != STT_NOTYPE
    566       && unlikely (oldp->type != XELF_ST_TYPE (sym->st_info)))
    567     {
    568       char buf1[64];
    569       char buf2[64];
    570 
    571       error (0, 0, gettext ("\
    572 Warning: type of `%s' changed from %s in %s to %s in %s"),
    573 	     oldp->name,
    574 	     ebl_symbol_type_name (ld_state.ebl, oldp->type,
    575 				   buf1, sizeof (buf1)),
    576 	     oldp->file->rfname,
    577 	     ebl_symbol_type_name (ld_state.ebl, XELF_ST_TYPE (sym->st_info),
    578 				   buf2, sizeof (buf2)),
    579 	     fileinfo->rfname);
    580     }
    581   else if (XELF_ST_TYPE (sym->st_info) == STT_OBJECT
    582 	   && oldp->size != 0
    583 	   && unlikely (oldp->size != sym->st_size))
    584     error (0, 0, gettext ("\
    585 Warning: size of `%s' changed from %" PRIu64 " in %s to %" PRIu64 " in %s"),
    586 	   oldp->name, (uint64_t) oldp->size, oldp->file->rfname,
    587 	   (uint64_t) sym->st_size, fileinfo->rfname);
    588 }
    589 
    590 
    591 static int
    592 check_definition (const XElf_Sym *sym, size_t shndx, size_t symidx,
    593 		  struct usedfiles *fileinfo, struct symbol *oldp)
    594 {
    595   int result = 0;
    596   bool old_in_dso = FILEINFO_EHDR (oldp->file->ehdr).e_type == ET_DYN;
    597   bool new_in_dso = FILEINFO_EHDR (fileinfo->ehdr).e_type == ET_DYN;
    598   bool use_new_def = false;
    599 
    600   if (shndx != SHN_UNDEF
    601       && (! oldp->defined
    602 	  || (shndx != SHN_COMMON && oldp->common && ! new_in_dso)
    603 	  || (old_in_dso && ! new_in_dso)))
    604     {
    605       /* We found a definition for a previously undefined symbol or a
    606 	 real definition for a previous common-only definition or a
    607 	 redefinition of a symbol definition in an object file
    608 	 previously defined in a DSO.  First perform some tests which
    609 	 will show whether the common is really matching the
    610 	 definition.  */
    611       check_type_and_size (sym, fileinfo, oldp);
    612 
    613       /* We leave the next element intact to not interrupt the list
    614 	 with the unresolved symbols.  Whoever walks the list will
    615 	 have to check the `defined' flag.  But we remember that this
    616 	 list element is not unresolved anymore.  */
    617       if (! oldp->defined)
    618 	{
    619 	  /* Remove from the list.  */
    620 	  --ld_state.nunresolved;
    621 	  if (! oldp->weak)
    622 	    --ld_state.nunresolved_nonweak;
    623 	  CDBL_LIST_DEL (ld_state.unresolved, oldp);
    624 	}
    625       else if (oldp->common)
    626 	/* Remove from the list.  */
    627 	CDBL_LIST_DEL (ld_state.common_syms, oldp);
    628 
    629       /* Use the values of the definition from now on.  */
    630       use_new_def = true;
    631     }
    632   else if (shndx != SHN_UNDEF
    633 	   && oldp->defined
    634 	   && matching_group_comdat_scn (sym, shndx, fileinfo, oldp))
    635     /* The duplicate symbol is in a group COMDAT section with the same
    636        signature as the one containing the original definition.
    637        Just ignore the second definition.  */
    638     /* nothing */;
    639   else if (shndx != SHN_UNDEF
    640 	   && unlikely (! oldp->common)
    641 	   && oldp->defined
    642 	   && shndx != SHN_COMMON
    643 	   /* Multiple definitions are no fatal errors if the -z muldefs flag
    644 	      is used.  We don't warn about the multiple definition unless we
    645 	      are told to be verbose.  */
    646 	   && (!ld_state.muldefs || verbose)
    647 	   && ! old_in_dso && fileinfo->file_type == relocatable_file_type)
    648     {
    649       /* We have a double definition.  This is a problem.  */
    650       char buf[64];
    651       XElf_Sym_vardef (oldsym);
    652       struct usedfiles *oldfile;
    653       const char *scnname;
    654       Elf32_Word xndx;
    655       size_t shnum;
    656 
    657       if (elf_getshdrnum (fileinfo->elf, &shnum) < 0)
    658 	error (EXIT_FAILURE, 0,
    659 	       gettext ("cannot determine number of sections: %s"),
    660 	       elf_errmsg (-1));
    661 
    662       /* XXX Use only ebl_section_name.  */
    663       if (shndx < SHN_LORESERVE || (shndx > SHN_HIRESERVE && shndx < shnum))
    664 	scnname = elf_strptr (fileinfo->elf,
    665 			      fileinfo->shstrndx,
    666 			      SCNINFO_SHDR (fileinfo->scninfo[shndx].shdr).sh_name);
    667       else
    668 	// XXX extended section
    669 	scnname = ebl_section_name (ld_state.ebl, shndx, 0, buf, sizeof (buf),
    670 				    NULL, shnum);
    671 
    672       /* XXX Print source file and line number.  */
    673       print_file_name (stderr, fileinfo, 1, 0);
    674       fprintf (stderr,
    675 	       gettext ("(%s+%#" PRIx64 "): multiple definition of %s `%s'\n"),
    676 	       scnname,
    677 	       (uint64_t) sym->st_value,
    678 	       ebl_symbol_type_name (ld_state.ebl, XELF_ST_TYPE (sym->st_info),
    679 				     buf, sizeof (buf)),
    680 	       oldp->name);
    681 
    682       oldfile = oldp->file;
    683       xelf_getsymshndx (oldfile->symtabdata, oldfile->xndxdata, oldp->symidx,
    684 			oldsym, xndx);
    685       assert (oldsym != NULL);
    686 
    687       /* XXX Use only ebl_section_name.  */
    688       if (oldp->scndx < SHN_LORESERVE || oldp->scndx > SHN_HIRESERVE)
    689 	scnname = elf_strptr (oldfile->elf,
    690 			      oldfile->shstrndx,
    691 			      SCNINFO_SHDR (oldfile->scninfo[shndx].shdr).sh_name);
    692       else
    693 	scnname = ebl_section_name (ld_state.ebl, oldp->scndx, oldp->scndx,
    694 				    buf, sizeof (buf), NULL, shnum);
    695 
    696       /* XXX Print source file and line number.  */
    697       print_file_name (stderr, oldfile, 1, 0);
    698       fprintf (stderr, gettext ("(%s+%#" PRIx64 "): first defined here\n"),
    699 	       scnname, (uint64_t) oldsym->st_value);
    700 
    701       if (likely (!ld_state.muldefs))
    702 	result = 1;
    703     }
    704   else if (old_in_dso && fileinfo->file_type == relocatable_file_type
    705 	   && shndx != SHN_UNDEF)
    706     /* We use the definition from a normal relocatable file over the
    707        definition in a DSO.  This is what the dynamic linker would
    708        do, too.  */
    709     use_new_def = true;
    710   else if (old_in_dso && !new_in_dso && oldp->defined && !oldp->on_dsolist)
    711     {
    712       CDBL_LIST_ADD_REAR (ld_state.from_dso, oldp);
    713       ++ld_state.nfrom_dso;
    714 
    715       /* If the object is a function we allocate a PLT entry,
    716 	 otherwise only a GOT entry.  */
    717       if (oldp->type == STT_FUNC)
    718 	++ld_state.nplt;
    719       else
    720 	++ld_state.ngot;
    721 
    722       oldp->on_dsolist = 1;
    723     }
    724   else if (oldp->common && shndx == SHN_COMMON)
    725     {
    726       /* The symbol size is the largest of all common definitions.  */
    727       oldp->size = MAX (oldp->size, sym->st_size);
    728       /* Similarly for the alignment.  */
    729       oldp->merge.value = MAX (oldp->merge.value, sym->st_value);
    730     }
    731 
    732   if (unlikely (use_new_def))
    733     {
    734       /* Adjust the symbol record appropriately and remove
    735 	 the symbol from the list of symbols which are taken from DSOs.  */
    736       if (old_in_dso && fileinfo->file_type == relocatable_file_type)
    737 	{
    738 	  CDBL_LIST_DEL (ld_state.from_dso, oldp);
    739 	  --ld_state.nfrom_dso;
    740 
    741 	  if (likely (oldp->type == STT_FUNC))
    742 	    --ld_state.nplt;
    743 	  else
    744 	    --ld_state.ngot;
    745 
    746 	  oldp->on_dsolist = 0;
    747 	}
    748 
    749       /* Use the values of the definition from now on.  */
    750       oldp->size = sym->st_size;
    751       oldp->type = XELF_ST_TYPE (sym->st_info);
    752       oldp->symidx = symidx;
    753       oldp->scndx = shndx;
    754       //oldp->symscndx = THESYMSCNDX must be passed;
    755       oldp->file = fileinfo;
    756       oldp->defined = 1;
    757       oldp->in_dso = new_in_dso;
    758       oldp->common = shndx == SHN_COMMON;
    759       if (likely (fileinfo->file_type == relocatable_file_type))
    760 	{
    761 	  /* If the definition comes from a DSO we pertain the weak flag
    762 	     and it's indicating whether the reference is weak or not.  */
    763 	  oldp->weak = XELF_ST_BIND (sym->st_info) == STB_WEAK;
    764 
    765 	  // XXX Really exclude SHN_ABS?
    766 	  if (shndx != SHN_COMMON && shndx != SHN_ABS)
    767 	    {
    768 	      struct scninfo *ignore;
    769 	      mark_section_used (&fileinfo->scninfo[shndx], shndx, &ignore);
    770 	    }
    771 	}
    772 
    773       /* Add to the list of symbols used from DSOs if necessary.  */
    774       if (new_in_dso && !old_in_dso)
    775 	{
    776 	  CDBL_LIST_ADD_REAR (ld_state.from_dso, oldp);
    777 	  ++ld_state.nfrom_dso;
    778 
    779 	  /* If the object is a function we allocate a PLT entry,
    780 	     otherwise only a GOT entry.  */
    781 	  if (oldp->type == STT_FUNC)
    782 	    ++ld_state.nplt;
    783 	  else
    784 	    ++ld_state.ngot;
    785 
    786 	  oldp->on_dsolist = 1;
    787 	}
    788       else if (shndx == SHN_COMMON)
    789 	{
    790 	  /* Store the alignment.  */
    791 	  oldp->merge.value = sym->st_value;
    792 
    793 	  CDBL_LIST_ADD_REAR (ld_state.common_syms, oldp);
    794 	}
    795     }
    796 
    797   return result;
    798 }
    799 
    800 
    801 static struct scninfo *
    802 find_section_group (struct usedfiles *fileinfo, Elf32_Word shndx,
    803 		    Elf_Data **datap)
    804 {
    805   struct scninfo *runp;
    806 
    807   for (runp = fileinfo->groups; runp != NULL; runp = runp->next)
    808     if (!runp->used)
    809       {
    810 	Elf32_Word *grpref;
    811 	size_t cnt;
    812 	Elf_Data *data;
    813 
    814 	data = elf_getdata (runp->scn, NULL);
    815 	if (data == NULL)
    816 	  error (EXIT_FAILURE, 0,
    817 		 gettext ("%s: cannot get section group data: %s"),
    818 		 fileinfo->fname, elf_errmsg (-1));
    819 
    820 	/* There cannot be another data block.  */
    821 	assert (elf_getdata (runp->scn, data) == NULL);
    822 
    823 	grpref = (Elf32_Word *) data->d_buf;
    824 	cnt = data->d_size / sizeof (Elf32_Word);
    825 	/* Note that we stop after looking at index 1 since index 0
    826 	   contains the flags for the section group.  */
    827 	while (cnt > 1)
    828 	  if (grpref[--cnt] == shndx)
    829 	    {
    830 	      *datap = data;
    831 	      return runp;
    832 	    }
    833       }
    834 
    835   /* If we come here no section group contained the given section
    836      despite the SHF_GROUP flag.  This is an error in the input
    837      file.  */
    838   error (EXIT_FAILURE, 0, gettext ("\
    839 %s: section '%s' with group flag set does not belong to any group"),
    840 	 fileinfo->fname,
    841 	 elf_strptr (fileinfo->elf, fileinfo->shstrndx,
    842 		     SCNINFO_SHDR (fileinfo->scninfo[shndx].shdr).sh_name));
    843   return NULL;
    844 }
    845 
    846 
    847 /* Mark all sections which belong to the same group as section SHNDX
    848    as used.  */
    849 static void
    850 mark_section_group (struct usedfiles *fileinfo, Elf32_Word shndx,
    851 		    struct scninfo **grpscnp)
    852 {
    853   /* First locate the section group.  There can be several (many) of
    854      them.  */
    855   size_t cnt;
    856   Elf32_Word *grpref;
    857   Elf_Data *data;
    858   struct scninfo *grpscn = find_section_group (fileinfo, shndx, &data);
    859   *grpscnp = grpscn;
    860 
    861   /* Mark all the sections as used.
    862 
    863      XXX Two possible problems here:
    864 
    865      - the gABI says "The section must be referenced by a section of type
    866        SHT_GROUP".  I hope everybody reads this as "exactly one section".
    867 
    868      - section groups are also useful to mark the debugging section which
    869        belongs to a text section.  Unconditionally adding debugging sections
    870        is therefore probably not what is wanted if stripping is required.  */
    871 
    872   /* Mark the section group as handled.  */
    873   grpscn->used = true;
    874 
    875   grpref = (Elf32_Word *) data->d_buf;
    876   cnt = data->d_size / sizeof (Elf32_Word);
    877   while (cnt > 1)
    878     {
    879       Elf32_Word idx = grpref[--cnt];
    880       XElf_Shdr *shdr = &SCNINFO_SHDR (fileinfo->scninfo[idx].shdr);
    881 
    882       if (fileinfo->scninfo[idx].grpid != grpscn->grpid)
    883 	error (EXIT_FAILURE, 0, gettext ("\
    884 %s: section [%2d] '%s' is not in the correct section group"),
    885 	       fileinfo->fname, (int) idx,
    886 	       elf_strptr (fileinfo->elf, fileinfo->shstrndx, shdr->sh_name));
    887 
    888       if (ld_state.strip == strip_none
    889 	  /* If we are stripping, remove debug sections.  */
    890 	  || (!ebl_debugscn_p (ld_state.ebl,
    891 			       elf_strptr (fileinfo->elf, fileinfo->shstrndx,
    892 					   shdr->sh_name))
    893 	      /* And the relocation sections for the debug sections.  */
    894 	      && ((shdr->sh_type != SHT_RELA && shdr->sh_type != SHT_REL)
    895 		  || !ebl_debugscn_p (ld_state.ebl,
    896 				      elf_strptr (fileinfo->elf,
    897 						  fileinfo->shstrndx,
    898 						  SCNINFO_SHDR (fileinfo->scninfo[shdr->sh_info].shdr).sh_name)))))
    899 	{
    900 	  struct scninfo *ignore;
    901 
    902 	  mark_section_used (&fileinfo->scninfo[idx], idx, &ignore);
    903 	}
    904     }
    905 }
    906 
    907 
    908 static void
    909 mark_section_used (struct scninfo *scninfo, Elf32_Word shndx,
    910 		   struct scninfo **grpscnp)
    911 {
    912   if (likely (scninfo->used))
    913     /* Nothing to be done.  */
    914     return;
    915 
    916   /* We need this section.  */
    917   scninfo->used = true;
    918 
    919   /* Make sure the section header has been read from the file.  */
    920   XElf_Shdr *shdr = &SCNINFO_SHDR (scninfo->shdr);
    921 #if NATIVE_ELF
    922   if (unlikely (scninfo->shdr == NULL))
    923 #else
    924   if (unlikely (scninfo->shdr.sh_type == SHT_NULL))
    925 #endif
    926     {
    927 #if NATIVE_ELF != 0
    928       shdr = xelf_getshdr (scninfo->scn, scninfo->shdr);
    929 #else
    930       xelf_getshdr_copy (scninfo->scn, shdr, scninfo->shdr);
    931 #endif
    932       if (unlikely (shdr == NULL))
    933 	/* Something is very wrong.  The calling code will notice it
    934 	   soon and print a message.  */
    935 	return;
    936     }
    937 
    938   /* Handle section linked by 'sh_link'.  */
    939   if (unlikely (shdr->sh_link != 0))
    940     {
    941       struct scninfo *ignore;
    942       mark_section_used (&scninfo->fileinfo->scninfo[shdr->sh_link],
    943 			 shdr->sh_link, &ignore);
    944     }
    945 
    946   /* Handle section linked by 'sh_info'.  */
    947   if (unlikely (shdr->sh_info != 0) && (shdr->sh_flags & SHF_INFO_LINK))
    948     {
    949       struct scninfo *ignore;
    950       mark_section_used (&scninfo->fileinfo->scninfo[shdr->sh_info],
    951 			 shdr->sh_info, &ignore);
    952     }
    953 
    954   if (unlikely (shdr->sh_flags & SHF_GROUP) && ld_state.gc_sections)
    955     /* Find the section group which contains this section.  */
    956     mark_section_group (scninfo->fileinfo, shndx, grpscnp);
    957 }
    958 
    959 
    960 /* We collect all sections in a hashing table.  All sections with the
    961    same name are collected in a list.  Note that we do not determine
    962    which sections are finally collected in the same output section
    963    here.  This would be terribly inefficient.  It will be done later.  */
    964 static void
    965 add_section (struct usedfiles *fileinfo, struct scninfo *scninfo)
    966 {
    967   struct scnhead *queued;
    968   struct scnhead search;
    969   unsigned long int hval;
    970   XElf_Shdr *shdr = &SCNINFO_SHDR (scninfo->shdr);
    971   struct scninfo *grpscn = NULL;
    972   Elf_Data *grpscndata = NULL;
    973 
    974   /* See whether we can determine right away whether we need this
    975      section in the output.
    976 
    977      XXX I assume here that --gc-sections only affects extraction
    978      from an archive.  If it also affects objects files given on
    979      the command line then somebody must explain to me how the
    980      dependency analysis should work.  Should the entry point be
    981      the root?  What if it is a numeric value?  */
    982   if (!scninfo->used
    983       && (ld_state.strip == strip_none
    984 	  || (shdr->sh_flags & SHF_ALLOC) != 0
    985 	  || shdr->sh_type == SHT_NOTE
    986 	  || (shdr->sh_type == SHT_PROGBITS
    987 	      && strcmp (elf_strptr (fileinfo->elf,
    988 				     fileinfo->shstrndx,
    989 				     shdr->sh_name), ".comment") == 0))
    990       && (fileinfo->status != in_archive || !ld_state.gc_sections))
    991     /* Mark as used and handle reference recursively if necessary.  */
    992     mark_section_used (scninfo, elf_ndxscn (scninfo->scn), &grpscn);
    993 
    994   if ((shdr->sh_flags & SHF_GROUP) && grpscn == NULL)
    995     /* Determine the symbol which name constitutes the signature
    996        for the section group.  */
    997     grpscn = find_section_group (fileinfo, elf_ndxscn (scninfo->scn),
    998 				 &grpscndata);
    999   assert (grpscn == NULL || grpscn->symbols->name != NULL);
   1000 
   1001   /* Determine the section name.  */
   1002   search.name = elf_strptr (fileinfo->elf, fileinfo->shstrndx, shdr->sh_name);
   1003   search.type = shdr->sh_type;
   1004   search.flags = shdr->sh_flags;
   1005   search.entsize = shdr->sh_entsize;
   1006   search.grp_signature = grpscn != NULL ? grpscn->symbols->name : NULL;
   1007   search.kind = scn_normal;
   1008   hval = elf_hash (search.name);
   1009 
   1010   /* Find already queued sections.  */
   1011   queued = ld_section_tab_find (&ld_state.section_tab, hval, &search);
   1012   if (queued != NULL)
   1013     {
   1014       bool is_comdat = false;
   1015 
   1016       /* If this section is part of a COMDAT section group we simply
   1017 	 ignore it since we already have a copy.  */
   1018       if (unlikely (shdr->sh_flags & SHF_GROUP))
   1019 	{
   1020 	  /* Get the data of the section group section.  */
   1021 	  if (grpscndata == NULL)
   1022 	    {
   1023 	      grpscndata = elf_getdata (grpscn->scn, NULL);
   1024 	      assert (grpscndata != NULL);
   1025 	    }
   1026 
   1027 	  /* XXX Possibly unaligned memory access.  */
   1028 	  if ((((Elf32_Word *) grpscndata->d_buf)[0] & GRP_COMDAT) != 0)
   1029 	    {
   1030 	      /* We have to compare the group signatures.  There might
   1031 		 be sections with the same name but belonging to
   1032 		 groups with different signatures.  This means we have
   1033 		 to compare the new group signature with all those
   1034 		 already collected.  There might also be some
   1035 		 non-group sections in the mix.  */
   1036 	      struct scninfo *runp = queued->last;
   1037 	      do
   1038 		{
   1039 		  if (SCNINFO_SHDR (runp->shdr).sh_flags & SHF_GROUP)
   1040 		    {
   1041 		      struct scninfo *grpscn2
   1042 			= find_section_group (runp->fileinfo,
   1043 					      elf_ndxscn (runp->scn),
   1044 					      &grpscndata);
   1045 
   1046 		      if (strcmp (grpscn->symbols->name,
   1047 				  grpscn2->symbols->name) == 0)
   1048 			{
   1049 			  scninfo->unused_comdat = is_comdat = true;
   1050 			  break;
   1051 			}
   1052 		    }
   1053 
   1054 		  runp = runp->next;
   1055 		}
   1056 	      while (runp != queued->last);
   1057 	    }
   1058 	}
   1059 
   1060       if (!is_comdat)
   1061 	{
   1062 	  /* No COMDAT section, we use the data.  */
   1063 	  scninfo->next = queued->last->next;
   1064 	  queued->last = queued->last->next = scninfo;
   1065 
   1066 	  queued->flags = ebl_sh_flags_combine (ld_state.ebl, queued->flags,
   1067 						shdr->sh_flags);
   1068 	  queued->align = MAX (queued->align, shdr->sh_addralign);
   1069 	}
   1070     }
   1071   else
   1072     {
   1073       /* We do not use obstacks here since the memory might be
   1074 	 deallocated.  */
   1075       queued = (struct scnhead *) xcalloc (sizeof (struct scnhead), 1);
   1076       queued->kind = scn_normal;
   1077       queued->name = search.name;
   1078       queued->type = shdr->sh_type;
   1079       queued->flags = shdr->sh_flags;
   1080       queued->align = shdr->sh_addralign;
   1081       queued->entsize = shdr->sh_entsize;
   1082       queued->grp_signature = grpscn != NULL ? grpscn->symbols->name : NULL;
   1083       queued->segment_nr = ~0;
   1084       queued->last = scninfo->next = scninfo;
   1085 
   1086       /* Check whether we need a TLS segment.  */
   1087       ld_state.need_tls |= (shdr->sh_flags & SHF_TLS) != 0;
   1088 
   1089       /* Add to the hash table and possibly overwrite existing value.  */
   1090       ld_section_tab_insert (&ld_state.section_tab, hval, queued);
   1091     }
   1092 }
   1093 
   1094 
   1095 static int
   1096 add_relocatable_file (struct usedfiles *fileinfo, GElf_Word secttype)
   1097 {
   1098   size_t scncnt;
   1099   size_t cnt;
   1100   Elf_Data *symtabdata = NULL;
   1101   Elf_Data *xndxdata = NULL;
   1102   Elf_Data *versymdata = NULL;
   1103   Elf_Data *verdefdata = NULL;
   1104   Elf_Data *verneeddata = NULL;
   1105   size_t symstridx = 0;
   1106   size_t nsymbols = 0;
   1107   size_t nlocalsymbols = 0;
   1108   bool has_merge_sections = false;
   1109   bool has_tls_symbols = false;
   1110   /* Unless we have different information we assume the code needs
   1111      an executable stack.  */
   1112   enum execstack execstack = execstack_true;
   1113 
   1114   /* Prerequisites.  */
   1115   assert (fileinfo->elf != NULL);
   1116 
   1117   /* Allocate memory for the sections.  */
   1118   if (unlikely (elf_getshdrnum (fileinfo->elf, &scncnt) < 0))
   1119     error (EXIT_FAILURE, 0,
   1120 	   gettext ("cannot determine number of sections: %s"),
   1121 	   elf_errmsg (-1));
   1122 
   1123   fileinfo->scninfo = (struct scninfo *)
   1124     obstack_calloc (&ld_state.smem, scncnt * sizeof (struct scninfo));
   1125 
   1126   /* Read all the section headers and find the symbol table.  Note
   1127      that we don't skip the section with index zero.  Even though the
   1128      section itself is always empty the section header contains
   1129      informaton for the case when the section index for the section
   1130      header string table is too large to fit in the ELF header.  */
   1131   for (cnt = 0; cnt < scncnt; ++cnt)
   1132     {
   1133       /* Store the handle for the section.  */
   1134       fileinfo->scninfo[cnt].scn = elf_getscn (fileinfo->elf, cnt);
   1135 
   1136       /* Get the ELF section header and data.  */
   1137       XElf_Shdr *shdr;
   1138 #if NATIVE_ELF != 0
   1139       if (fileinfo->scninfo[cnt].shdr == NULL)
   1140 #else
   1141       if (fileinfo->scninfo[cnt].shdr.sh_type == SHT_NULL)
   1142 #endif
   1143 	{
   1144 #if NATIVE_ELF != 0
   1145 	  shdr = xelf_getshdr (fileinfo->scninfo[cnt].scn,
   1146 			       fileinfo->scninfo[cnt].shdr);
   1147 #else
   1148 	  xelf_getshdr_copy (fileinfo->scninfo[cnt].scn, shdr,
   1149 			     fileinfo->scninfo[cnt].shdr);
   1150 #endif
   1151 	  if (shdr == NULL)
   1152 	    {
   1153 	      /* This should never happen.  */
   1154 	      fprintf (stderr, gettext ("%s: invalid ELF file (%s:%d)\n"),
   1155 		       fileinfo->rfname, __FILE__, __LINE__);
   1156 	      return 1;
   1157 	    }
   1158 	}
   1159       else
   1160 	shdr = &SCNINFO_SHDR (fileinfo->scninfo[cnt].shdr);
   1161 
   1162       Elf_Data *data = elf_getdata (fileinfo->scninfo[cnt].scn, NULL);
   1163 
   1164       /* Check whether this section is marked as merge-able.  */
   1165       has_merge_sections |= (shdr->sh_flags & SHF_MERGE) != 0;
   1166       has_tls_symbols |= (shdr->sh_flags & SHF_TLS) != 0;
   1167 
   1168       /* Get the ELF section header and data.  */
   1169       /* Make the file structure available.  */
   1170       fileinfo->scninfo[cnt].fileinfo = fileinfo;
   1171 
   1172       if (unlikely (shdr->sh_type == SHT_SYMTAB)
   1173 	  || unlikely (shdr->sh_type == SHT_DYNSYM))
   1174 	{
   1175 	  if (shdr->sh_type == SHT_SYMTAB)
   1176 	    {
   1177 	      assert (fileinfo->symtabdata == NULL);
   1178 	      fileinfo->symtabdata = data;
   1179 	      fileinfo->nsymtab = shdr->sh_size / shdr->sh_entsize;
   1180 	      fileinfo->nlocalsymbols = shdr->sh_info;
   1181 	      fileinfo->symstridx = shdr->sh_link;
   1182 	    }
   1183 	  else
   1184 	    {
   1185 	      assert (fileinfo->dynsymtabdata == NULL);
   1186 	      fileinfo->dynsymtabdata = data;
   1187 	      fileinfo->ndynsymtab = shdr->sh_size / shdr->sh_entsize;
   1188 	      fileinfo->dynsymstridx = shdr->sh_link;
   1189 	    }
   1190 
   1191 	  /* If we are looking for the normal symbol table we just
   1192 	     found it.  */
   1193 	  if (secttype == shdr->sh_type)
   1194 	    {
   1195 	      assert (symtabdata == NULL);
   1196 	      symtabdata = data;
   1197 	      symstridx = shdr->sh_link;
   1198 	      nsymbols = shdr->sh_size / shdr->sh_entsize;
   1199 	      nlocalsymbols = shdr->sh_info;
   1200 	    }
   1201 	}
   1202       else if (unlikely (shdr->sh_type == SHT_SYMTAB_SHNDX))
   1203 	{
   1204 	  assert (xndxdata == NULL);
   1205 	  fileinfo->xndxdata = xndxdata = data;
   1206 	}
   1207       else if (unlikely (shdr->sh_type == SHT_GNU_versym))
   1208 	{
   1209 	  assert (versymdata == 0);
   1210 	  fileinfo->versymdata = versymdata = data;
   1211 	}
   1212       else if (unlikely (shdr->sh_type == SHT_GNU_verdef))
   1213 	{
   1214 	  size_t nversions;
   1215 
   1216 	  assert (verdefdata == 0);
   1217 	  fileinfo->verdefdata = verdefdata = data;
   1218 
   1219 	  /* Allocate the arrays flagging the use of the version and
   1220 	     to track of allocated names.  */
   1221 	  fileinfo->nverdef = nversions = shdr->sh_info;
   1222 	  /* We have NVERSIONS + 1 because the indeces used to access the
   1223 	     sectino start with one; zero represents local binding.  */
   1224 	  fileinfo->verdefused = (XElf_Versym *)
   1225 	    obstack_calloc (&ld_state.smem,
   1226 			    sizeof (XElf_Versym) * (nversions + 1));
   1227 	  fileinfo->verdefent = (struct Ebl_Strent **)
   1228 	    obstack_alloc (&ld_state.smem,
   1229 			   sizeof (struct Ebl_Strent *) * (nversions + 1));
   1230 	}
   1231       else if (unlikely (shdr->sh_type == SHT_GNU_verneed))
   1232 	{
   1233 	  assert (verneeddata == 0);
   1234 	  fileinfo->verneeddata = verneeddata = data;
   1235 	}
   1236       else if (unlikely (shdr->sh_type == SHT_DYNAMIC))
   1237 	{
   1238 	  assert (fileinfo->dynscn == NULL);
   1239 	  fileinfo->dynscn = fileinfo->scninfo[cnt].scn;
   1240 	}
   1241       else if (unlikely (shdr->sh_type == SHT_GROUP))
   1242 	{
   1243 	  Elf_Scn *symscn;
   1244 	  XElf_Shdr_vardef (symshdr);
   1245 	  Elf_Data *symdata;
   1246 
   1247 	  if (FILEINFO_EHDR (fileinfo->ehdr).e_type != ET_REL)
   1248 	    error (EXIT_FAILURE, 0, gettext ("\
   1249 %s: only files of type ET_REL might contain section groups"),
   1250 		   fileinfo->fname);
   1251 
   1252 	  fileinfo->scninfo[cnt].next = fileinfo->groups;
   1253 	  fileinfo->scninfo[cnt].grpid = cnt;
   1254 	  fileinfo->groups = &fileinfo->scninfo[cnt];
   1255 
   1256 	  /* Determine the signature.  We create a symbol record for
   1257 	     it.  Only the name element is important.  */
   1258 	  fileinfo->scninfo[cnt].symbols = (struct symbol *)
   1259 	    obstack_calloc (&ld_state.smem, sizeof (struct symbol));
   1260 
   1261 	  symscn = elf_getscn (fileinfo->elf, shdr->sh_link);
   1262 	  xelf_getshdr (symscn, symshdr);
   1263 	  symdata = elf_getdata (symscn, NULL);
   1264 
   1265 	  if (symshdr != NULL)
   1266 	    {
   1267 	      XElf_Sym_vardef (sym);
   1268 
   1269 	      /* We don't need the section index and therefore we don't
   1270 		 have to use 'xelf_getsymshndx'.  */
   1271 	      xelf_getsym (symdata, shdr->sh_info, sym);
   1272 	      if (sym != NULL)
   1273 		{
   1274 		  struct symbol *symbol = fileinfo->scninfo[cnt].symbols;
   1275 
   1276 #ifndef NO_HACKS
   1277 		  if (XELF_ST_TYPE (sym->st_info) == STT_SECTION)
   1278 		    {
   1279 		      XElf_Shdr_vardef (buggyshdr);
   1280 		      xelf_getshdr (elf_getscn (fileinfo->elf, sym->st_shndx),
   1281 				    buggyshdr);
   1282 
   1283 		      symbol->name = elf_strptr (fileinfo->elf,
   1284 						 FILEINFO_EHDR (fileinfo->ehdr).e_shstrndx,
   1285 						 buggyshdr->sh_name);
   1286 		      symbol->symidx = -1;
   1287 		    }
   1288 		  else
   1289 #endif
   1290 		    {
   1291 		      symbol->name = elf_strptr (fileinfo->elf,
   1292 						 symshdr->sh_link,
   1293 						 sym->st_name);
   1294 		      symbol->symidx = shdr->sh_info;
   1295 		    }
   1296 		  symbol->file = fileinfo;
   1297 		}
   1298 	    }
   1299 	  if (fileinfo->scninfo[cnt].symbols->name == NULL)
   1300 	    error (EXIT_FAILURE, 0, gettext ("\
   1301 %s: cannot determine signature of section group [%2zd] '%s': %s"),
   1302 		   fileinfo->fname,
   1303 		   elf_ndxscn (fileinfo->scninfo[cnt].scn),
   1304 		   elf_strptr (fileinfo->elf, fileinfo->shstrndx,
   1305 			       shdr->sh_name),
   1306 		   elf_errmsg (-1));
   1307 
   1308 
   1309 	  /* For all the sections which are part of this group, add
   1310 	     the reference.  */
   1311 	  if (data == NULL)
   1312 	    error (EXIT_FAILURE, 0, gettext ("\
   1313 %s: cannot get content of section group [%2zd] '%s': %s'"),
   1314 		   fileinfo->fname, elf_ndxscn (fileinfo->scninfo[cnt].scn),
   1315 		   elf_strptr (fileinfo->elf, fileinfo->shstrndx,
   1316 			       shdr->sh_name),
   1317 		   elf_errmsg (-1));
   1318 
   1319 	  Elf32_Word *grpdata = (Elf32_Word *) data->d_buf;
   1320 	  if (grpdata[0] & GRP_COMDAT)
   1321 	    fileinfo->scninfo[cnt].comdat_group = true;
   1322 	  for (size_t inner = 1; inner < data->d_size / sizeof (Elf32_Word);
   1323 	       ++inner)
   1324 	    {
   1325 	      if (grpdata[inner] >= scncnt)
   1326 		error (EXIT_FAILURE, 0, gettext ("\
   1327 %s: group member %zu of section group [%2zd] '%s' has too high index: %" PRIu32),
   1328 		       fileinfo->fname,
   1329 		       inner, elf_ndxscn (fileinfo->scninfo[cnt].scn),
   1330 		       elf_strptr (fileinfo->elf, fileinfo->shstrndx,
   1331 				   shdr->sh_name),
   1332 		       grpdata[inner]);
   1333 
   1334 	      fileinfo->scninfo[grpdata[inner]].grpid = cnt;
   1335 	    }
   1336 
   1337 	  /* The 'used' flag is used to indicate when the information
   1338 	     in the section group is used to mark all other sections
   1339 	     as used.  So it must not be true yet.  */
   1340 	  assert (fileinfo->scninfo[cnt].used == false);
   1341 	}
   1342       else if (! SECTION_TYPE_P (&ld_state, shdr->sh_type)
   1343 	       && unlikely ((shdr->sh_flags & SHF_OS_NONCONFORMING) != 0))
   1344 	/* According to the gABI it is a fatal error if the file contains
   1345 	   a section with unknown type and the SHF_OS_NONCONFORMING flag
   1346 	   set.  */
   1347 	error (EXIT_FAILURE, 0,
   1348 	       gettext ("%s: section '%s' has unknown type: %d"),
   1349 	       fileinfo->fname,
   1350 	       elf_strptr (fileinfo->elf, fileinfo->shstrndx,
   1351 			   shdr->sh_name),
   1352 	       (int) shdr->sh_type);
   1353       /* We don't have to add a few section types here.  These will be
   1354 	 generated from scratch for the new output file.  We also
   1355 	 don't add the sections of DSOs here since these sections are
   1356 	 not used in the resulting object file.  */
   1357       else if (likely (fileinfo->file_type == relocatable_file_type)
   1358 	       && likely (cnt > 0)
   1359 	       && likely (shdr->sh_type == SHT_PROGBITS
   1360 			  || shdr->sh_type == SHT_RELA
   1361 			  || shdr->sh_type == SHT_REL
   1362 			  || shdr->sh_type == SHT_NOTE
   1363 			  || shdr->sh_type == SHT_NOBITS
   1364 			  || shdr->sh_type == SHT_INIT_ARRAY
   1365 			  || shdr->sh_type == SHT_FINI_ARRAY
   1366 			  || shdr->sh_type == SHT_PREINIT_ARRAY))
   1367 	{
   1368 	  /* Check whether the section needs to be executable.  */
   1369 	  if (shdr->sh_type == SHT_PROGBITS
   1370 	      && (shdr->sh_flags & SHF_EXECINSTR) == 0
   1371 	      && strcmp (elf_strptr (fileinfo->elf, fileinfo->shstrndx,
   1372 				     shdr->sh_name),
   1373 			 ".note.GNU-stack") == 0)
   1374 	    execstack = execstack_false;
   1375 
   1376 	  add_section (fileinfo, &fileinfo->scninfo[cnt]);
   1377 	}
   1378     }
   1379 
   1380   /* Now we know more about the requirements for an executable stack
   1381      of the result.  */
   1382   if (fileinfo->file_type == relocatable_file_type
   1383       && execstack == execstack_true
   1384       && ld_state.execstack != execstack_false_force)
   1385     ld_state.execstack = execstack_true;
   1386 
   1387   /* Handle the symbols.  Record defined and undefined symbols in the
   1388      hash table.  In theory there can be a file without any symbol
   1389      table.  */
   1390   if (likely (symtabdata != NULL))
   1391     {
   1392       /* In case this file contains merge-able sections we have to
   1393 	 locate the symbols which are in these sections.  */
   1394       fileinfo->has_merge_sections = has_merge_sections;
   1395       if (likely (has_merge_sections || has_tls_symbols))
   1396 	{
   1397 	  fileinfo->symref = (struct symbol **)
   1398 	    obstack_calloc (&ld_state.smem,
   1399 			    nsymbols * sizeof (struct symbol *));
   1400 
   1401 	  /* Only handle the local symbols here.  */
   1402 	  for (cnt = 0; cnt < nlocalsymbols; ++cnt)
   1403 	    {
   1404 	      Elf32_Word shndx;
   1405 	      XElf_Sym_vardef (sym);
   1406 
   1407 	      xelf_getsymshndx (symtabdata, xndxdata, cnt, sym, shndx);
   1408 	      if (sym == NULL)
   1409 		{
   1410 		  /* This should never happen.  */
   1411 		  fprintf (stderr, gettext ("%s: invalid ELF file (%s:%d)\n"),
   1412 			   fileinfo->rfname, __FILE__, __LINE__);
   1413 		  return 1;
   1414 		}
   1415 
   1416 	      if (likely (shndx != SHN_XINDEX))
   1417 		shndx = sym->st_shndx;
   1418 	      else if (unlikely (shndx == 0))
   1419 		{
   1420 		  fprintf (stderr, gettext ("%s: invalid ELF file (%s:%d)\n"),
   1421 			   fileinfo->rfname, __FILE__, __LINE__);
   1422 		  return 1;
   1423 		}
   1424 
   1425 	      if (XELF_ST_TYPE (sym->st_info) != STT_SECTION
   1426 		  && (shndx < SHN_LORESERVE || shndx > SHN_HIRESERVE)
   1427 		  && ((SCNINFO_SHDR (fileinfo->scninfo[shndx].shdr).sh_flags
   1428 		       & SHF_MERGE)
   1429 		      || XELF_ST_TYPE (sym->st_info) == STT_TLS))
   1430 		{
   1431 		  /* Create a symbol record for this symbol and add it
   1432 		     to the list for this section.  */
   1433 		  struct symbol *newp;
   1434 
   1435 		  newp = (struct symbol *)
   1436 		    obstack_calloc (&ld_state.smem, sizeof (struct symbol));
   1437 
   1438 		  newp->symidx = cnt;
   1439 		  newp->scndx = shndx;
   1440 		  newp->file = fileinfo;
   1441 		  newp->defined = 1;
   1442 		  fileinfo->symref[cnt] = newp;
   1443 
   1444 		  if (fileinfo->scninfo[shndx].symbols == NULL)
   1445 		    fileinfo->scninfo[shndx].symbols = newp->next_in_scn
   1446 		      = newp;
   1447 		  else
   1448 		    {
   1449 		      newp->next_in_scn
   1450 			= fileinfo->scninfo[shndx].symbols->next_in_scn;
   1451 		      fileinfo->scninfo[shndx].symbols
   1452 			= fileinfo->scninfo[shndx].symbols->next_in_scn = newp;
   1453 		    }
   1454 		}
   1455 	    }
   1456 	}
   1457       else
   1458 	/* Create array with pointers to the symbol definitions.  Note
   1459 	   that we only allocate memory for the non-local symbols
   1460 	   since we have no merge-able sections.  But we store the
   1461 	   pointer as if it was for the whole symbol table.  This
   1462 	   saves some memory.  */
   1463 	fileinfo->symref = (struct symbol **)
   1464 	  obstack_calloc (&ld_state.smem, ((nsymbols - nlocalsymbols)
   1465 					   * sizeof (struct symbol *)))
   1466 	  - nlocalsymbols;
   1467 
   1468       /* Don't handle local symbols here.  It's either not necessary
   1469 	 at all or has already happened.  */
   1470       for (cnt = nlocalsymbols; cnt < nsymbols; ++cnt)
   1471 	{
   1472 	  XElf_Sym_vardef (sym);
   1473 	  Elf32_Word shndx;
   1474 	  xelf_getsymshndx (symtabdata, xndxdata, cnt, sym, shndx);
   1475 
   1476 	  if (sym == NULL)
   1477 	    {
   1478 	      /* This should never happen.  */
   1479 	      fprintf (stderr, gettext ("%s: invalid ELF file (%s:%d)\n"),
   1480 		       fileinfo->rfname, __FILE__, __LINE__);
   1481 	      return 1;
   1482 	    }
   1483 
   1484 	  if (likely (shndx != SHN_XINDEX))
   1485 	    shndx = sym->st_shndx;
   1486 	  else if (unlikely (shndx == 0))
   1487 	    {
   1488 	      fprintf (stderr, gettext ("%s: invalid ELF file (%s:%d)\n"),
   1489 		       fileinfo->rfname, __FILE__, __LINE__);
   1490 	      return 1;
   1491 	    }
   1492 
   1493 	  /* We ignore ABS symbols from DSOs.  */
   1494 	  // XXX Is this correct?
   1495 	  if (unlikely (shndx == SHN_ABS) && secttype == SHT_DYNSYM)
   1496 	    continue;
   1497 
   1498 	  if ((shndx < SHN_LORESERVE || shndx > SHN_HIRESERVE)
   1499 	      && fileinfo->scninfo[shndx].unused_comdat)
   1500 	    /* The symbol is not used.  */
   1501 	    continue;
   1502 
   1503 	  /* If the DSO uses symbol versions determine whether this is
   1504 	     the default version.  Otherwise we'll ignore the symbol.  */
   1505 	  if (versymdata != NULL)
   1506 	    {
   1507 	      XElf_Versym versym;
   1508 
   1509 	      if (xelf_getversym_copy (versymdata, cnt, versym) == NULL)
   1510 		/* XXX Should we handle faulty input files more graceful?  */
   1511 		assert (! "xelf_getversym failed");
   1512 
   1513 	      if ((versym & 0x8000) != 0)
   1514 		/* Ignore the symbol, it's not the default version.  */
   1515 		continue;
   1516 	    }
   1517 
   1518 	  /* See whether we know anything about this symbol.  */
   1519 	  struct symbol search;
   1520 	  search.name = elf_strptr (fileinfo->elf, symstridx, sym->st_name);
   1521 	  unsigned long int hval = elf_hash (search.name);
   1522 
   1523 	  /* We ignore the symbols the linker generates.  This are
   1524 	     _GLOBAL_OFFSET_TABLE_, _DYNAMIC.  */
   1525 	  // XXX This loop is hot and the following tests hardly ever match.
   1526 	  // XXX Maybe move the tests somewhere they are executed less often.
   1527 	  if (((unlikely (hval == 165832675ul)
   1528 		&& strcmp (search.name, "_DYNAMIC") == 0)
   1529 	       || (unlikely (hval == 102264335ul)
   1530 		   && strcmp (search.name, "_GLOBAL_OFFSET_TABLE_") == 0))
   1531 	      && sym->st_shndx != SHN_UNDEF
   1532 	      /* If somebody defines such a variable in a relocatable we
   1533 		 don't ignore it.  Let the user get what s/he deserves.  */
   1534 	      && fileinfo->file_type != relocatable_file_type)
   1535 	    continue;
   1536 
   1537 	  struct symbol *oldp = ld_symbol_tab_find (&ld_state.symbol_tab,
   1538 						    hval, &search);
   1539 	  struct symbol *newp;
   1540 	  if (likely (oldp == NULL))
   1541 	    {
   1542 	      /* No symbol of this name known.  Add it.  */
   1543 	      newp = (struct symbol *) obstack_alloc (&ld_state.smem,
   1544 						      sizeof (*newp));
   1545 	      newp->name = search.name;
   1546 	      newp->size = sym->st_size;
   1547 	      newp->type = XELF_ST_TYPE (sym->st_info);
   1548 	      newp->symidx = cnt;
   1549 	      newp->outsymidx = 0;
   1550 	      newp->outdynsymidx = 0;
   1551 	      newp->scndx = shndx;
   1552 	      newp->file = fileinfo;
   1553 	      newp->defined = newp->scndx != SHN_UNDEF;
   1554 	      newp->common = newp->scndx == SHN_COMMON;
   1555 	      newp->weak = XELF_ST_BIND (sym->st_info) == STB_WEAK;
   1556 	      newp->added = 0;
   1557 	      newp->merged = 0;
   1558 	      newp->local = 0;
   1559 	      newp->hidden = 0;
   1560 	      newp->need_copy = 0;
   1561 	      newp->on_dsolist = 0;
   1562 	      newp->in_dso = secttype == SHT_DYNSYM;
   1563 	      newp->next_in_scn = NULL;
   1564 #ifndef NDEBUG
   1565 	      newp->next = NULL;
   1566 	      newp->previous = NULL;
   1567 #endif
   1568 
   1569 	      if (newp->scndx == SHN_UNDEF)
   1570 		{
   1571 		  CDBL_LIST_ADD_REAR (ld_state.unresolved, newp);
   1572 		  ++ld_state.nunresolved;
   1573 		  if (! newp->weak)
   1574 		    ++ld_state.nunresolved_nonweak;
   1575 		}
   1576 	      else if (newp->scndx == SHN_COMMON)
   1577 		{
   1578 		  /* Store the alignment requirement.  */
   1579 		  newp->merge.value = sym->st_value;
   1580 
   1581 		  CDBL_LIST_ADD_REAR (ld_state.common_syms, newp);
   1582 		}
   1583 
   1584 	      /* Insert the new symbol.  */
   1585 	      if (unlikely (ld_symbol_tab_insert (&ld_state.symbol_tab,
   1586 						  hval, newp) != 0))
   1587 		/* This cannot happen.  */
   1588 		abort ();
   1589 
   1590 	      fileinfo->symref[cnt] = newp;
   1591 
   1592 	      /* We have a few special symbols to recognize.  The symbols
   1593 		 _init and _fini are the initialization and finalization
   1594 		 functions respectively.  They have to be made known in
   1595 		 the dynamic section and therefore we have to find out
   1596 		 now whether these functions exist or not.  */
   1597 	      if (hval == 6685956 && strcmp (newp->name, "_init") == 0)
   1598 		ld_state.init_symbol = newp;
   1599 	      else if (hval == 6672457 && strcmp (newp->name, "_fini") == 0)
   1600 		ld_state.fini_symbol = newp;
   1601 	    }
   1602 	  else if (unlikely (check_definition (sym, shndx, cnt, fileinfo, oldp)
   1603 			     != 0))
   1604 	    /* A fatal error (multiple definition of a symbol)
   1605 	       occurred, no need to continue.  */
   1606 	    return 1;
   1607 	  else
   1608 	    /* Use the previously allocated symbol record.  It has
   1609 	       been updated in check_definition(), if necessary.  */
   1610 	    newp = fileinfo->symref[cnt] = oldp;
   1611 
   1612 	  /* Mark the section the symbol we need comes from as used.  */
   1613 	  if (shndx != SHN_UNDEF
   1614 	      && (shndx < SHN_LORESERVE || shndx > SHN_HIRESERVE))
   1615 	    {
   1616 	      struct scninfo *ignore;
   1617 
   1618 #ifndef NDEBUG
   1619 	      size_t shnum;
   1620 	      assert (elf_getshdrnum (fileinfo->elf, &shnum) == 0);
   1621 	      assert (shndx < shnum);
   1622 #endif
   1623 
   1624 	      /* Mark section (and all dependencies) as used.  */
   1625 	      mark_section_used (&fileinfo->scninfo[shndx], shndx, &ignore);
   1626 
   1627 	      /* Check whether the section is merge-able.  In this case we
   1628 		 have to record the symbol.  */
   1629 	      if (SCNINFO_SHDR (fileinfo->scninfo[shndx].shdr).sh_flags
   1630 		  & SHF_MERGE)
   1631 		{
   1632 		  if (fileinfo->scninfo[shndx].symbols == NULL)
   1633 		    fileinfo->scninfo[shndx].symbols = newp->next_in_scn
   1634 		      = newp;
   1635 		  else
   1636 		    {
   1637 		      newp->next_in_scn
   1638 			= fileinfo->scninfo[shndx].symbols->next_in_scn;
   1639 		      fileinfo->scninfo[shndx].symbols
   1640 			= fileinfo->scninfo[shndx].symbols->next_in_scn = newp;
   1641 		    }
   1642 		}
   1643 	    }
   1644 	}
   1645 
   1646       /* This file is used.  */
   1647       if (likely (fileinfo->file_type == relocatable_file_type))
   1648 	{
   1649 	  if (unlikely (ld_state.relfiles == NULL))
   1650 	    ld_state.relfiles = fileinfo->next = fileinfo;
   1651 	  else
   1652 	    {
   1653 	      fileinfo->next = ld_state.relfiles->next;
   1654 	      ld_state.relfiles = ld_state.relfiles->next = fileinfo;
   1655 	    }
   1656 
   1657 	  /* Update some summary information in the state structure.  */
   1658 	  ld_state.nsymtab += fileinfo->nsymtab;
   1659 	  ld_state.nlocalsymbols += fileinfo->nlocalsymbols;
   1660 	}
   1661       else if (likely (fileinfo->file_type == dso_file_type))
   1662 	{
   1663 	  CSNGL_LIST_ADD_REAR (ld_state.dsofiles, fileinfo);
   1664 	  ++ld_state.ndsofiles;
   1665 
   1666 	  if (fileinfo->lazyload)
   1667 	    /* We have to create another dynamic section entry for the
   1668 	       DT_POSFLAG_1 entry.
   1669 
   1670 	       XXX Once more functionality than the lazyloading flag
   1671 	       are suppported the test must be extended.  */
   1672 	    ++ld_state.ndsofiles;
   1673 	}
   1674     }
   1675 
   1676   return 0;
   1677 }
   1678 
   1679 
   1680 int
   1681 ld_handle_filename_list (struct filename_list *fnames)
   1682 {
   1683   struct filename_list *runp;
   1684   int res = 0;
   1685 
   1686   for (runp = fnames; runp != NULL; runp = runp->next)
   1687     {
   1688       struct usedfiles *curp;
   1689 
   1690       /* Create a record for the new file.  */
   1691       curp = runp->real = ld_new_inputfile (runp->name, relocatable_file_type);
   1692 
   1693       /* Set flags for group handling.  */
   1694       curp->group_start = runp->group_start;
   1695       curp->group_end = runp->group_end;
   1696 
   1697       /* Set as-needed flag from the file, not the command line.  */
   1698       curp->as_needed = runp->as_needed;
   1699 
   1700       /* Read the file and everything else which comes up, including
   1701 	 handling groups.  */
   1702       do
   1703 	res |= FILE_PROCESS (-1, curp, &ld_state, &curp);
   1704       while (curp != NULL);
   1705     }
   1706 
   1707   /* Free the list.  */
   1708   while (fnames != NULL)
   1709     {
   1710       runp = fnames;
   1711       fnames = fnames->next;
   1712       free (runp);
   1713     }
   1714 
   1715   return res;
   1716 }
   1717 
   1718 
   1719 /* Handle opening of the given file with ELF descriptor.  */
   1720 static int
   1721 open_elf (struct usedfiles *fileinfo, Elf *elf)
   1722 {
   1723   int res = 0;
   1724 
   1725   if (elf == NULL)
   1726     error (EXIT_FAILURE, 0,
   1727 	   gettext ("cannot get descriptor for ELF file (%s:%d): %s\n"),
   1728 	   __FILE__, __LINE__, elf_errmsg (-1));
   1729 
   1730   if (unlikely (elf_kind (elf) == ELF_K_NONE))
   1731     {
   1732       struct filename_list *fnames;
   1733 
   1734       /* We don't have to look at this file again.  */
   1735       fileinfo->status = closed;
   1736 
   1737       /* Let's see whether this is a linker script.  */
   1738       if (fileinfo->fd != -1)
   1739 	/* Create a stream from the file handle we know.  */
   1740 	ldin = fdopen (fileinfo->fd, "r");
   1741       else
   1742 	{
   1743 	  /* Get the memory for the archive member.  */
   1744 	  char *content;
   1745 	  size_t contentsize;
   1746 
   1747 	  /* Get the content of the file.  */
   1748 	  content = elf_rawfile (elf, &contentsize);
   1749 	  if (content == NULL)
   1750 	    {
   1751 	      fprintf (stderr, gettext ("%s: invalid ELF file (%s:%d)\n"),
   1752 		       fileinfo->rfname, __FILE__, __LINE__);
   1753 	      return 1;
   1754 	    }
   1755 
   1756 	  /* The content of the file is available in memory.  Read the
   1757 	     memory region as a stream.  */
   1758 	  ldin = fmemopen (content, contentsize, "r");
   1759 	}
   1760 
   1761       /* No need for locking.  */
   1762       __fsetlocking (ldin, FSETLOCKING_BYCALLER);
   1763 
   1764       if (ldin == NULL)
   1765 	error (EXIT_FAILURE, errno, gettext ("cannot open '%s'"),
   1766 	       fileinfo->rfname);
   1767 
   1768       /* Parse the file.  If it is a linker script no problems will be
   1769 	 reported.  */
   1770       ld_state.srcfiles = NULL;
   1771       ldlineno = 1;
   1772       ld_scan_version_script = 0;
   1773       ldin_fname = fileinfo->rfname;
   1774       res = ldparse ();
   1775 
   1776       fclose (ldin);
   1777       if (fileinfo->fd != -1 && !fileinfo->fd_passed)
   1778 	{
   1779 	  /* We won't need the file descriptor again.  */
   1780 	  close (fileinfo->fd);
   1781 	  fileinfo->fd = -1;
   1782 	}
   1783 
   1784       elf_end (elf);
   1785 
   1786       if (unlikely (res != 0))
   1787 	/* Something went wrong during parsing.  */
   1788 	return 1;
   1789 
   1790       /* This is no ELF file.  */
   1791       fileinfo->elf = NULL;
   1792 
   1793       /* Now we have to handle eventual INPUT and GROUP statements in
   1794 	 the script.  Read the files mentioned.  */
   1795       fnames = ld_state.srcfiles;
   1796       if (fnames != NULL)
   1797 	{
   1798 	  struct filename_list *oldp;
   1799 
   1800 	  /* Convert the list into a normal single-linked list.  */
   1801 	  oldp = fnames;
   1802 	  fnames = fnames->next;
   1803 	  oldp->next = NULL;
   1804 
   1805 	  /* Remove the list from the state structure.  */
   1806 	  ld_state.srcfiles = NULL;
   1807 
   1808 	  if (unlikely (ld_handle_filename_list (fnames) != 0))
   1809 	    return 1;
   1810 	}
   1811 
   1812       return 0;
   1813     }
   1814 
   1815   /* Store the file info.  */
   1816   fileinfo->elf = elf;
   1817 
   1818   /* The file is ready for action.  */
   1819   fileinfo->status = opened;
   1820 
   1821   return 0;
   1822 }
   1823 
   1824 
   1825 static int
   1826 add_whole_archive (struct usedfiles *fileinfo)
   1827 {
   1828   Elf *arelf;
   1829   Elf_Cmd cmd = ELF_C_READ_MMAP_PRIVATE;
   1830   int res = 0;
   1831 
   1832   while ((arelf = elf_begin (fileinfo->fd, cmd, fileinfo->elf)) != NULL)
   1833     {
   1834       Elf_Arhdr *arhdr = elf_getarhdr (arelf);
   1835       struct usedfiles *newp;
   1836 
   1837       if (arhdr == NULL)
   1838 	abort ();
   1839 
   1840       /* Just to be sure; since these are no files in the archive
   1841 	 these names should never be returned.  */
   1842       assert (strcmp (arhdr->ar_name, "/") != 0);
   1843       assert (strcmp (arhdr->ar_name, "//") != 0);
   1844 
   1845       newp = ld_new_inputfile (arhdr->ar_name, relocatable_file_type);
   1846       newp->archive_file = fileinfo;
   1847 
   1848       if (unlikely (ld_state.trace_files))
   1849 	print_file_name (stdout, newp, 1, 1);
   1850 
   1851       /* This shows that this file is contained in an archive.  */
   1852       newp->fd = -1;
   1853       /* Store the ELF descriptor.  */
   1854       newp->elf = arelf;
   1855       /* Show that we are open for business.  */
   1856       newp->status = opened;
   1857 
   1858       /* Proces the file, add all the symbols etc.  */
   1859       res = file_process2 (newp);
   1860       if (unlikely (res != 0))
   1861 	    break;
   1862 
   1863       /* Advance to the next archive element.  */
   1864       cmd = elf_next (arelf);
   1865     }
   1866 
   1867   return res;
   1868 }
   1869 
   1870 
   1871 static int
   1872 extract_from_archive (struct usedfiles *fileinfo)
   1873 {
   1874   static int archive_seq;
   1875   int res = 0;
   1876 
   1877   if (fileinfo->archive_seq == 0)
   1878     /* This is an archive we are not using completely.  Give it a
   1879        unique number.  */
   1880     fileinfo->archive_seq = ++archive_seq;
   1881 
   1882   /* If there are no unresolved symbols don't do anything.  */
   1883   assert (ld_state.extract_rule == defaultextract
   1884 	  || ld_state.extract_rule == weakextract);
   1885   if ((likely (ld_state.extract_rule == defaultextract)
   1886        ? ld_state.nunresolved_nonweak : ld_state.nunresolved) == 0)
   1887     return 0;
   1888 
   1889   Elf_Arsym *syms;
   1890   size_t nsyms;
   1891 
   1892   /* Get all the symbols.  */
   1893   syms = elf_getarsym (fileinfo->elf, &nsyms);
   1894   if (syms == NULL)
   1895     {
   1896     cannot_read_archive:
   1897       error (0, 0, gettext ("cannot read archive `%s': %s"),
   1898 	     fileinfo->rfname, elf_errmsg (-1));
   1899 
   1900       /* We cannot use this archive anymore.  */
   1901       fileinfo->status = closed;
   1902 
   1903       return 1;
   1904     }
   1905 
   1906   /* Now add all the symbols to the hash table.  Note that there
   1907      can potentially be duplicate definitions.  We'll always use
   1908      the first definition.  */
   1909   // XXX Is this a compatible behavior?
   1910   bool any_used;
   1911   do
   1912     {
   1913       any_used = false;
   1914 
   1915       size_t cnt;
   1916       for (cnt = 0; cnt < nsyms; ++cnt)
   1917 	{
   1918 	  struct symbol search = { .name = syms[cnt].as_name };
   1919 	  struct symbol *sym = ld_symbol_tab_find (&ld_state.symbol_tab,
   1920 						   syms[cnt].as_hash, &search);
   1921 	  if (sym != NULL && ! sym->defined)
   1922 	    {
   1923 	      /* The symbol is referenced and not defined.  */
   1924 	      Elf *arelf;
   1925 	      Elf_Arhdr *arhdr;
   1926 	      struct usedfiles *newp;
   1927 
   1928 	      /* Find the archive member for this symbol.  */
   1929 	      if (unlikely (elf_rand (fileinfo->elf, syms[cnt].as_off)
   1930 			    != syms[cnt].as_off))
   1931 		goto cannot_read_archive;
   1932 
   1933 	      /* Note: no test of a failing 'elf_begin' call.  That's fine
   1934 		 since 'elf'getarhdr' will report the problem.  */
   1935 	      arelf = elf_begin (fileinfo->fd, ELF_C_READ_MMAP_PRIVATE,
   1936 				 fileinfo->elf);
   1937 	      arhdr = elf_getarhdr (arelf);
   1938 	      if (arhdr == NULL)
   1939 		goto cannot_read_archive;
   1940 
   1941 	      /* We have all the information and an ELF handle for the
   1942 		 archive member.  Create the normal data structure for
   1943 		 a file now.  */
   1944 	      newp = ld_new_inputfile (obstack_strdup (&ld_state.smem,
   1945 						       arhdr->ar_name),
   1946 				       relocatable_file_type);
   1947 	      newp->archive_file = fileinfo;
   1948 
   1949 	      if (unlikely (ld_state.trace_files))
   1950 		print_file_name (stdout, newp, 1, 1);
   1951 
   1952 	      /* This shows that this file is contained in an archive.  */
   1953 	      newp->fd = -1;
   1954 	      /* Store the ELF descriptor.  */
   1955 	      newp->elf = arelf;
   1956 	      /* Show that we are open for business.  */
   1957 	      newp->status = in_archive;
   1958 
   1959 	      /* Now read the file and add all the symbols.  */
   1960 	      res = file_process2 (newp);
   1961 	      if (unlikely (res != 0))
   1962 		return res;
   1963 
   1964 	      any_used = true;
   1965 	    }
   1966 	}
   1967 
   1968       if (any_used)
   1969 	{
   1970 	  /* This is an archive therefore it must have a number.  */
   1971 	  assert (fileinfo->archive_seq != 0);
   1972 	  ld_state.last_archive_used = fileinfo->archive_seq;
   1973 	}
   1974     }
   1975   while (any_used);
   1976 
   1977   return res;
   1978 }
   1979 
   1980 
   1981 static int
   1982 file_process2 (struct usedfiles *fileinfo)
   1983 {
   1984   int res;
   1985 
   1986   if (likely (elf_kind (fileinfo->elf) == ELF_K_ELF))
   1987     {
   1988       /* The first time we get here we read the ELF header.  */
   1989 #if NATIVE_ELF != 0
   1990       if (likely (fileinfo->ehdr == NULL))
   1991 #else
   1992       if (likely (FILEINFO_EHDR (fileinfo->ehdr).e_type == ET_NONE))
   1993 #endif
   1994 	{
   1995 	  XElf_Ehdr *ehdr;
   1996 #if NATIVE_ELF != 0
   1997 	  ehdr = xelf_getehdr (fileinfo->elf, fileinfo->ehdr);
   1998 #else
   1999 	  xelf_getehdr_copy (fileinfo->elf, ehdr, fileinfo->ehdr);
   2000 #endif
   2001 	  if (ehdr == NULL)
   2002 	    {
   2003 	      fprintf (stderr, gettext ("%s: invalid ELF file (%s:%d)\n"),
   2004 		       fileinfo->rfname, __FILE__, __LINE__);
   2005 	      fileinfo->status = closed;
   2006 	      return 1;
   2007 	    }
   2008 
   2009 	  if (FILEINFO_EHDR (fileinfo->ehdr).e_type != ET_REL
   2010 	      && unlikely (FILEINFO_EHDR (fileinfo->ehdr).e_type != ET_DYN))
   2011 	    /* XXX Add ebl* function to query types which are allowed
   2012 	       to link in.  */
   2013 	    {
   2014 	      char buf[64];
   2015 
   2016 	      print_file_name (stderr, fileinfo, 1, 0);
   2017 	      fprintf (stderr,
   2018 		       gettext ("file of type %s cannot be linked in\n"),
   2019 		       ebl_object_type_name (ld_state.ebl,
   2020 					     FILEINFO_EHDR (fileinfo->ehdr).e_type,
   2021 					     buf, sizeof (buf)));
   2022 	      fileinfo->status = closed;
   2023 	      return 1;
   2024 	    }
   2025 
   2026 	  /* Make sure the file type matches the backend.  */
   2027 	  if (FILEINFO_EHDR (fileinfo->ehdr).e_machine
   2028 	      != ebl_get_elfmachine (ld_state.ebl))
   2029 	    {
   2030 	      fprintf (stderr, gettext ("\
   2031 %s: input file incompatible with ELF machine type %s\n"),
   2032 		       fileinfo->rfname,
   2033 		       ebl_backend_name (ld_state.ebl));
   2034 	      fileinfo->status = closed;
   2035 	      return 1;
   2036 	    }
   2037 
   2038 	  /* Determine the section header string table section index.  */
   2039 	  if (unlikely (elf_getshdrstrndx (fileinfo->elf, &fileinfo->shstrndx)
   2040 			< 0))
   2041 	    {
   2042 	      fprintf (stderr, gettext ("\
   2043 %s: cannot get section header string table index: %s\n"),
   2044 		       fileinfo->rfname, elf_errmsg (-1));
   2045 	      fileinfo->status = closed;
   2046 	      return 1;
   2047 	    }
   2048 	}
   2049 
   2050       /* Now handle the different types of files.  */
   2051       if (FILEINFO_EHDR (fileinfo->ehdr).e_type == ET_REL)
   2052 	{
   2053 	  /* Add all the symbol.  Relocatable files have symbol
   2054 	     tables.  */
   2055 	  res = add_relocatable_file (fileinfo, SHT_SYMTAB);
   2056 	}
   2057       else
   2058 	{
   2059 	  bool has_l_name = fileinfo->file_type == archive_file_type;
   2060 
   2061 	  assert (FILEINFO_EHDR (fileinfo->ehdr).e_type == ET_DYN);
   2062 
   2063 	  /* If the file is a DT_NEEDED dependency then the type is
   2064 	     already correctly specified.  */
   2065 	  if (fileinfo->file_type != dso_needed_file_type)
   2066 	    fileinfo->file_type = dso_file_type;
   2067 
   2068 	  /* We cannot use DSOs when generating relocatable objects.  */
   2069 	  if (ld_state.file_type == relocatable_file_type)
   2070 	    {
   2071 	      error (0, 0, gettext ("\
   2072 cannot use DSO '%s' when generating relocatable object file"),
   2073 		     fileinfo->fname);
   2074 	      return 1;
   2075 	    }
   2076 
   2077 	  /* Add all the symbols.  For DSOs we are looking at the
   2078 	     dynamic symbol table.  */
   2079 	  res = add_relocatable_file (fileinfo, SHT_DYNSYM);
   2080 
   2081 	  /* We always have to have a dynamic section.  */
   2082 	  assert (fileinfo->dynscn != NULL);
   2083 
   2084 	  /* We have to remember the dependencies for this object.  It
   2085 	     is necessary to look them up.  */
   2086 	  XElf_Shdr_vardef (dynshdr);
   2087 	  xelf_getshdr (fileinfo->dynscn, dynshdr);
   2088 
   2089 	  Elf_Data *dyndata = elf_getdata (fileinfo->dynscn, NULL);
   2090 	  /* XXX Should we flag the failure to get the dynamic section?  */
   2091 	  if (dynshdr != NULL)
   2092 	    {
   2093 	      int cnt = dynshdr->sh_size / dynshdr->sh_entsize;
   2094 	      XElf_Dyn_vardef (dyn);
   2095 
   2096 	      while (--cnt >= 0)
   2097 		{
   2098 		  xelf_getdyn (dyndata, cnt, dyn);
   2099 		  if (dyn != NULL)
   2100 		    {
   2101 		      if(dyn->d_tag == DT_NEEDED)
   2102 			{
   2103 			  struct usedfiles *newp;
   2104 
   2105 			  newp = ld_new_inputfile (elf_strptr (fileinfo->elf,
   2106 							       dynshdr->sh_link,
   2107 							       dyn->d_un.d_val),
   2108 						   dso_needed_file_type);
   2109 
   2110 			  /* Enqueue the newly found dependencies.  */
   2111 			  // XXX Check that there not already a file with the
   2112 			  // same name.
   2113 			  CSNGL_LIST_ADD_REAR (ld_state.needed, newp);
   2114 			}
   2115 		      else if (dyn->d_tag == DT_SONAME)
   2116 			{
   2117 			  /* We use the DT_SONAME (this is what's there
   2118 			     for).  */
   2119 			  fileinfo->soname = elf_strptr (fileinfo->elf,
   2120 							 dynshdr->sh_link,
   2121 							 dyn->d_un.d_val);
   2122 			  has_l_name = false;
   2123 			}
   2124 		    }
   2125 		}
   2126 	    }
   2127 
   2128 	  /* Construct the file name if the DSO has no SONAME and the
   2129 	     file name comes from a -lXX parameter on the comment
   2130 	     line.  */
   2131 	  if (unlikely (has_l_name))
   2132 	    {
   2133 	      /* The FNAME is the parameter the user specified on the
   2134 		 command line.  We prepend "lib" and append ".so".  */
   2135 	      size_t len = strlen (fileinfo->fname) + 7;
   2136 	      char *newp;
   2137 
   2138 	      newp = (char *) obstack_alloc (&ld_state.smem, len);
   2139 	      strcpy (stpcpy (stpcpy (newp, "lib"), fileinfo->fname), ".so");
   2140 
   2141 	      fileinfo->soname = newp;
   2142 	    }
   2143 	}
   2144     }
   2145   else if (likely (elf_kind (fileinfo->elf) == ELF_K_AR))
   2146     {
   2147       if (unlikely (ld_state.extract_rule == allextract))
   2148 	/* Which this option enabled we have to add all the object
   2149 	   files in the archive.  */
   2150 	res = add_whole_archive (fileinfo);
   2151       else if (ld_state.file_type == relocatable_file_type)
   2152 	{
   2153 	  /* When generating a relocatable object we don't find files
   2154 	     in archives.  */
   2155 	  if (verbose)
   2156 	    error (0, 0, gettext ("input file '%s' ignored"), fileinfo->fname);
   2157 
   2158 	  res = 0;
   2159 	}
   2160       else
   2161 	{
   2162 	  if (ld_state.group_start_requested
   2163 	      && ld_state.group_start_archive == NULL)
   2164 	    ld_state.group_start_archive = fileinfo;
   2165 
   2166 	  if (ld_state.archives == NULL)
   2167 	    ld_state.archives = fileinfo;
   2168 
   2169 	  if (ld_state.tailarchives != NULL)
   2170 	    ld_state.tailarchives->next = fileinfo;
   2171 	  ld_state.tailarchives = fileinfo;
   2172 
   2173 	  /* Extract only the members from the archive which are
   2174 	     currently referenced by unresolved symbols.  */
   2175 	  res = extract_from_archive (fileinfo);
   2176 	}
   2177     }
   2178   else
   2179     /* This should never happen, we know about no other types.  */
   2180     abort ();
   2181 
   2182   return res;
   2183 }
   2184 
   2185 
   2186 /* Process a given file.  The first parameter is a file descriptor for
   2187    the file which can be -1 to indicate the file has not yet been
   2188    found.  The second parameter describes the file to be opened, the
   2189    last one is the state of the linker which among other information
   2190    contain the paths we look at.  */
   2191 static int
   2192 ld_generic_file_process (int fd, struct usedfiles *fileinfo,
   2193 			 struct ld_state *statep, struct usedfiles **nextp)
   2194 {
   2195   int res = 0;
   2196 
   2197   /* By default we go to the next file in the list.  */
   2198   *nextp = fileinfo->next;
   2199 
   2200   /* Set the flag to signal we are looking for a group start.  */
   2201   if (unlikely (fileinfo->group_start))
   2202     {
   2203       ld_state.group_start_requested = true;
   2204       fileinfo->group_start = false;
   2205     }
   2206 
   2207   /* If the file isn't open yet, open it now.  */
   2208   if (likely (fileinfo->status == not_opened))
   2209     {
   2210       bool fd_passed = true;
   2211 
   2212       if (likely (fd == -1))
   2213 	{
   2214 	  /* Find the file ourselves.  */
   2215 	  int err = open_along_path (fileinfo);
   2216 	  if (unlikely (err != 0))
   2217 	    /* We allow libraries and DSOs to be named more than once.
   2218 	       Don't report an error to the caller.  */
   2219 	    return err == EAGAIN ? 0 : err;
   2220 
   2221 	  fd_passed = false;
   2222 	}
   2223       else
   2224 	fileinfo->fd = fd;
   2225 
   2226       /* Remember where we got the descriptor from.  */
   2227       fileinfo->fd_passed = fd_passed;
   2228 
   2229       /* We found the file.  Now test whether it is a file type we can
   2230 	 handle.
   2231 
   2232 	 XXX Do we need to have the ability to start from a given
   2233 	 position in the search path again to look for another file if
   2234 	 the one found has not the right type?  */
   2235       res = open_elf (fileinfo, elf_begin (fileinfo->fd,
   2236 					   is_dso_p (fileinfo->fd)
   2237 					   ? ELF_C_READ_MMAP
   2238 					   : ELF_C_READ_MMAP_PRIVATE, NULL));
   2239       if (unlikely (res != 0))
   2240 	return res;
   2241     }
   2242 
   2243   /* Now that we have opened the file start processing it.  */
   2244   if (likely (fileinfo->status != closed))
   2245     res = file_process2 (fileinfo);
   2246 
   2247   /* Determine which file to look at next.  */
   2248   if (unlikely (fileinfo->group_backref != NULL))
   2249     {
   2250       /* We only go back if an archive other than the one we would go
   2251 	 back to has been used in the last round.  */
   2252       if (ld_state.last_archive_used > fileinfo->group_backref->archive_seq)
   2253 	{
   2254 	  *nextp = fileinfo->group_backref;
   2255 	  ld_state.last_archive_used = 0;
   2256 	}
   2257       else
   2258 	{
   2259 	  /* If we come here this means that the archives we read so
   2260 	     far are not needed anymore.  We can free some of the data
   2261 	     now.  */
   2262 	  struct usedfiles *runp = ld_state.archives;
   2263 
   2264 	  do
   2265 	    {
   2266 	      /* We don't need the ELF descriptor anymore.  Unless there
   2267 		 are no files from the archive used this will not free
   2268 		 the whole file but only some data structures.  */
   2269 	      elf_end (runp->elf);
   2270 	      runp->elf = NULL;
   2271 
   2272 	      runp = runp->next;
   2273 	    }
   2274 	  while (runp != fileinfo->next);
   2275 
   2276 	  /* Do not do this again.  */
   2277 	  ld_state.archives = NULL;
   2278 
   2279 	  /* Do not move on to the next archive.  */
   2280 	  *nextp = fileinfo->next = NULL;
   2281 	}
   2282     }
   2283   else if (unlikely (fileinfo->group_end))
   2284     {
   2285       /* This is the end of a group.  We possibly have to go back.
   2286 	 Determine which file we would go back to and see whether it
   2287 	 makes sense.  If there has not been an archive we don't have
   2288 	 to do anything.  */
   2289       if (ld_state.group_start_requested)
   2290 	{
   2291 	  if (ld_state.group_start_archive != ld_state.tailarchives)
   2292 	    /* The loop includes more than one archive, add the pointer.  */
   2293 	    {
   2294 	      *nextp = ld_state.tailarchives->group_backref =
   2295 		ld_state.group_start_archive;
   2296 	      ld_state.last_archive_used = 0;
   2297 	    }
   2298 	  else
   2299 	    /* We might still have to go back to the beginning of the
   2300 	       group if since the last archive other files have been
   2301 	       added.  But we go back exactly once.  */
   2302 	    if (ld_state.tailarchives != fileinfo)
   2303 	      {
   2304 		*nextp = ld_state.group_start_archive;
   2305 		ld_state.last_archive_used = 0;
   2306 	      }
   2307 	}
   2308 
   2309       /* Clear the flags.  */
   2310       ld_state.group_start_requested = false;
   2311       ld_state.group_start_archive = NULL;
   2312       fileinfo->group_end = false;
   2313     }
   2314 
   2315   return res;
   2316 }
   2317 
   2318 
   2319 /* Library names passed to the linker as -lXX represent files named
   2320    libXX.YY.  The YY part can have different forms, depending on the
   2321    platform.  The generic set is .so and .a (in this order).  */
   2322 static const char **
   2323 ld_generic_lib_extensions (struct ld_state *statep __attribute__ ((__unused__)))
   2324 {
   2325   static const char *exts[] =
   2326     {
   2327       ".so", ".a", NULL
   2328     };
   2329 
   2330   return exts;
   2331 }
   2332 
   2333 
   2334 /* Flag unresolved symbols.  */
   2335 static int
   2336 ld_generic_flag_unresolved (struct ld_state *statep)
   2337 {
   2338   int retval = 0;
   2339 
   2340   if (ld_state.nunresolved_nonweak > 0)
   2341     {
   2342       /* Go through the list and determine the unresolved symbols.  */
   2343       struct symbol *first;
   2344       struct symbol *s;
   2345 
   2346       s = first = ld_state.unresolved->next;
   2347       do
   2348 	{
   2349 	  if (! s->defined && ! s->weak)
   2350 	    {
   2351 	      /* Two special symbol we recognize: the symbol for the
   2352 		 GOT and the dynamic section.  */
   2353 	      if (strcmp (s->name, "_GLOBAL_OFFSET_TABLE_") == 0
   2354 		  || strcmp (s->name, "_DYNAMIC") == 0)
   2355 		{
   2356 		  /* We will have to fill in more information later.  */
   2357 		  ld_state.need_got = true;
   2358 
   2359 		  /* Remember that we found it.  */
   2360 		  if (s->name[1] == 'G')
   2361 		    ld_state.got_symbol = s;
   2362 		  else
   2363 		    ld_state.dyn_symbol = s;
   2364 		}
   2365 	      else if (ld_state.file_type != dso_file_type || !ld_state.nodefs)
   2366 		{
   2367 		  /* XXX The error message should get better.  It should use
   2368 		     the debugging information if present to tell where in the
   2369 		     sources the undefined reference is.  */
   2370 		  error (0, 0, gettext ("undefined symbol `%s' in %s"),
   2371 			 s->name, s->file->fname);
   2372 
   2373 		  retval = 1;
   2374 		}
   2375 	    }
   2376 
   2377 	  /* We cannot decide here what to do with undefined
   2378 	     references which will come from DSO since we do not know
   2379 	     what kind of symbol we expect.  Only when looking at the
   2380 	     relocations we can see whether we need a PLT entry or
   2381 	     only a GOT entry.  */
   2382 
   2383 	  s = s->next;
   2384 	}
   2385       while (s != first);
   2386     }
   2387 
   2388   return retval;
   2389 }
   2390 
   2391 
   2392 /* Close the given file.  */
   2393 static int
   2394 ld_generic_file_close (struct usedfiles *fileinfo, struct ld_state *statep)
   2395 {
   2396   /* Close the ELF descriptor.  */
   2397   elf_end (fileinfo->elf);
   2398 
   2399   /* If we have opened the file descriptor close it.  But we might
   2400      have done this already in which case FD is -1.  */
   2401   if (!fileinfo->fd_passed && fileinfo->fd != -1)
   2402     close (fileinfo->fd);
   2403 
   2404   /* We allocated the resolved file name.  */
   2405   if (fileinfo->fname != fileinfo->rfname)
   2406     free ((char *) fileinfo->rfname);
   2407 
   2408   return 0;
   2409 }
   2410 
   2411 
   2412 static void
   2413 new_generated_scn (enum scn_kind kind, const char *name, int type, int flags,
   2414 		   int entsize, int align)
   2415 {
   2416   struct scnhead *newp;
   2417 
   2418   newp = (struct scnhead *) obstack_calloc (&ld_state.smem,
   2419 					    sizeof (struct scnhead));
   2420   newp->kind = kind;
   2421   newp->name = name;
   2422   newp->nameent = ebl_strtabadd (ld_state.shstrtab, name, 0);
   2423   newp->type = type;
   2424   newp->flags = flags;
   2425   newp->entsize = entsize;
   2426   newp->align = align;
   2427   newp->grp_signature = NULL;
   2428   newp->used = true;
   2429 
   2430   /* All is well.  Create now the data for the section and insert it
   2431      into the section table.  */
   2432   ld_section_tab_insert (&ld_state.section_tab, elf_hash (name), newp);
   2433 }
   2434 
   2435 
   2436 /* Create the sections which are generated by the linker and are not
   2437    present in the input file.  */
   2438 static void
   2439 ld_generic_generate_sections (struct ld_state *statep)
   2440 {
   2441   /* The relocation section type.  */
   2442   int rel_type = REL_TYPE (&ld_state) == DT_REL ? SHT_REL : SHT_RELA;
   2443 
   2444   /* When requested, every output file will have a build ID section.  */
   2445   if (statep->build_id != NULL)
   2446     new_generated_scn (scn_dot_note_gnu_build_id, ".note.gnu.build-id",
   2447 		       SHT_NOTE, SHF_ALLOC, 0, 4);
   2448 
   2449   /* When building dynamically linked object we have to include a
   2450      section containing a string describing the interpreter.  This
   2451      should be at the very beginning of the file together with the
   2452      other information the ELF loader (kernel or wherever) has to look
   2453      at.  We put it as the first section in the file.
   2454 
   2455      We also have to create the dynamic segment which is a special
   2456      section the dynamic linker locates through an entry in the
   2457      program header.  */
   2458   if (dynamically_linked_p ())
   2459     {
   2460       /* Use any versioning (defined or required)?  */
   2461       bool use_versioning = false;
   2462       /* Use version requirements?  */
   2463       bool need_version = false;
   2464 
   2465       /* First the .interp section.  */
   2466       if (ld_state.interp != NULL || ld_state.file_type != dso_file_type)
   2467 	new_generated_scn (scn_dot_interp, ".interp", SHT_PROGBITS, SHF_ALLOC,
   2468 			   0, 1);
   2469 
   2470       /* Now the .dynamic section.  */
   2471       new_generated_scn (scn_dot_dynamic, ".dynamic", SHT_DYNAMIC,
   2472 			 DYNAMIC_SECTION_FLAGS (&ld_state),
   2473 			 xelf_fsize (ld_state.outelf, ELF_T_DYN, 1),
   2474 			 xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1));
   2475 
   2476       /* We will need in any case the dynamic symbol table (even in
   2477 	 the unlikely case that no symbol is exported or referenced
   2478 	 from a DSO).  */
   2479       ld_state.need_dynsym = true;
   2480       new_generated_scn (scn_dot_dynsym, ".dynsym", SHT_DYNSYM, SHF_ALLOC,
   2481 			 xelf_fsize (ld_state.outelf, ELF_T_SYM, 1),
   2482 			 xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1));
   2483       /* It comes with a string table.  */
   2484       new_generated_scn (scn_dot_dynstr, ".dynstr", SHT_STRTAB, SHF_ALLOC,
   2485 			 0, 1);
   2486       /* And a hashing table.  */
   2487       // XXX For Linux/Alpha we need other sizes unless they change...
   2488       if (GENERATE_SYSV_HASH)
   2489 	new_generated_scn (scn_dot_hash, ".hash", SHT_HASH, SHF_ALLOC,
   2490 			   sizeof (Elf32_Word), sizeof (Elf32_Word));
   2491       if (GENERATE_GNU_HASH)
   2492 	new_generated_scn (scn_dot_gnu_hash, ".gnu.hash", SHT_GNU_HASH,
   2493 			   SHF_ALLOC, sizeof (Elf32_Word),
   2494 			   sizeof (Elf32_Word));
   2495 
   2496       /* Create the section associated with the PLT if necessary.  */
   2497       if (ld_state.nplt > 0)
   2498 	{
   2499 	  /* Create the .plt section.  */
   2500 	  /* XXX We might need a function which returns the section flags.  */
   2501 	  new_generated_scn (scn_dot_plt, ".plt", SHT_PROGBITS,
   2502 			     SHF_ALLOC | SHF_EXECINSTR,
   2503 			     /* XXX Is the size correct?  */
   2504 			     xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1),
   2505 			     xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1));
   2506 
   2507 	  /* Create the relocation section for the .plt.  This is always
   2508 	     separate even if the other relocation sections are combined.  */
   2509 	  new_generated_scn (scn_dot_pltrel, ".rel.plt", rel_type, SHF_ALLOC,
   2510 			     rel_type == SHT_REL
   2511 			     ? xelf_fsize (ld_state.outelf, ELF_T_REL, 1)
   2512 			     : xelf_fsize (ld_state.outelf, ELF_T_RELA, 1),
   2513 			     xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1));
   2514 
   2515 	  /* XXX We might need a function which returns the section flags.  */
   2516 	  new_generated_scn (scn_dot_gotplt, ".got.plt", SHT_PROGBITS,
   2517 			     SHF_ALLOC | SHF_WRITE,
   2518 			     xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1),
   2519 			     xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1));
   2520 
   2521 	  /* Mark all used DSOs as used.  Determine whether any referenced
   2522 	     object uses symbol versioning.  */
   2523 	  if (ld_state.from_dso != NULL)
   2524 	    {
   2525 	      struct symbol *srunp = ld_state.from_dso;
   2526 
   2527 	      do
   2528 		{
   2529 		  srunp->file->used = true;
   2530 
   2531 		  if (srunp->file->verdefdata != NULL)
   2532 		    {
   2533 		      XElf_Versym versym;
   2534 
   2535 		      /* The input DSO uses versioning.  */
   2536 		      use_versioning = true;
   2537 		      /* We reference versions.  */
   2538 		      need_version = true;
   2539 
   2540 		      if (xelf_getversym_copy (srunp->file->versymdata,
   2541 					       srunp->symidx, versym) == NULL)
   2542 			assert (! "xelf_getversym failed");
   2543 
   2544 		      /* We cannot link explicitly with an older
   2545 			 version of a symbol.  */
   2546 		      assert ((versym & 0x8000) == 0);
   2547 		      /* We cannot reference local (index 0) or plain
   2548 			 global (index 1) versions.  */
   2549 		      assert (versym > 1);
   2550 
   2551 		      /* Check whether we have already seen the
   2552 			 version and if not add it to the referenced
   2553 			 versions in the output file.  */
   2554 		      if (! srunp->file->verdefused[versym])
   2555 			{
   2556 			  srunp->file->verdefused[versym] = 1;
   2557 
   2558 			  if (++srunp->file->nverdefused == 1)
   2559 			    /* Count the file if it is using versioning.  */
   2560 			    ++ld_state.nverdeffile;
   2561 			  ++ld_state.nverdefused;
   2562 			}
   2563 		    }
   2564 		}
   2565 	      while ((srunp = srunp->next) != ld_state.from_dso);
   2566 	    }
   2567 
   2568 	  /* Create the sections used to record version dependencies.  */
   2569 	  if (need_version)
   2570 	    new_generated_scn (scn_dot_version_r, ".gnu.version_r",
   2571 			       SHT_GNU_verneed, SHF_ALLOC, 0,
   2572 			       xelf_fsize (ld_state.outelf, ELF_T_WORD, 1));
   2573 	}
   2574 
   2575       /* Now count the used DSOs since this is what the user
   2576 	 wants.  */
   2577       int ndt_needed = 0;
   2578       if (ld_state.ndsofiles > 0)
   2579 	{
   2580 	  struct usedfiles *frunp = ld_state.dsofiles;
   2581 
   2582 	  do
   2583 	    if (! frunp->as_needed || frunp->used)
   2584 	      {
   2585 		++ndt_needed;
   2586 		if (frunp->lazyload)
   2587 		  /* We have to create another dynamic section
   2588 		     entry for the DT_POSFLAG_1 entry.
   2589 
   2590 		     XXX Once more functionality than the lazyloading
   2591 		     flag are suppported the test must be
   2592 		     extended.  */
   2593 		  ++ndt_needed;
   2594 	      }
   2595 	  while ((frunp = frunp->next) != ld_state.dsofiles);
   2596 	}
   2597 
   2598       if (use_versioning)
   2599 	new_generated_scn (scn_dot_version, ".gnu.version", SHT_GNU_versym,
   2600 			   SHF_ALLOC,
   2601 			   xelf_fsize (ld_state.outelf, ELF_T_HALF, 1),
   2602 			   xelf_fsize (ld_state.outelf, ELF_T_HALF, 1));
   2603 
   2604       /* We need some entries all the time.  */
   2605       ld_state.ndynamic = (7 + (ld_state.runpath != NULL
   2606 				|| ld_state.rpath != NULL)
   2607 			   + ndt_needed
   2608 			   + (ld_state.init_symbol != NULL ? 1 : 0)
   2609 			   + (ld_state.fini_symbol != NULL ? 1 : 0)
   2610 			   + (use_versioning ? 1 : 0)
   2611 			   + (need_version ? 2 : 0)
   2612 			   + (ld_state.nplt > 0 ? 4 : 0)
   2613 			   + (ld_state.relsize_total > 0 ? 3 : 0));
   2614     }
   2615 
   2616   /* When creating a relocatable file or when we are not stripping the
   2617      output file we create a symbol table.  */
   2618   ld_state.need_symtab = (ld_state.file_type == relocatable_file_type
   2619 			  || ld_state.strip == strip_none);
   2620 
   2621   /* Add the .got section if needed.  */
   2622   if (ld_state.need_got)
   2623     /* XXX We might need a function which returns the section flags.  */
   2624     new_generated_scn (scn_dot_got, ".got", SHT_PROGBITS,
   2625 		       SHF_ALLOC | SHF_WRITE,
   2626 		       xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1),
   2627 		       xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1));
   2628 
   2629   /* Add the .rel.dyn section.  */
   2630   if (ld_state.relsize_total > 0)
   2631     new_generated_scn (scn_dot_dynrel, ".rel.dyn", rel_type, SHF_ALLOC,
   2632 		       rel_type == SHT_REL
   2633 		       ? xelf_fsize (ld_state.outelf, ELF_T_REL, 1)
   2634 		       : xelf_fsize (ld_state.outelf, ELF_T_RELA, 1),
   2635 		       xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1));
   2636 }
   2637 
   2638 
   2639 /* Callback function registered with on_exit to make sure the temporary
   2640    files gets removed if something goes wrong.  */
   2641 static void
   2642 remove_tempfile (int status, void *arg)
   2643 {
   2644   if (status != 0 && ld_state.tempfname != NULL)
   2645     unlink (ld_state.tempfname);
   2646 }
   2647 
   2648 
   2649 /* Create the output file.  The file name is given or "a.out".  We
   2650    create as much of the ELF structure as possible.  */
   2651 static int
   2652 ld_generic_open_outfile (struct ld_state *statep, int machine, int klass,
   2653 			 int data)
   2654 {
   2655   /* We do not create the new file right away with the final name.
   2656      This would destroy an existing file with this name before a
   2657      replacement is finalized.  We create instead a temporary file in
   2658      the same directory.  */
   2659   if (ld_state.outfname == NULL)
   2660     ld_state.outfname = "a.out";
   2661 
   2662   size_t outfname_len = strlen (ld_state.outfname);
   2663   char *tempfname = (char *) obstack_alloc (&ld_state.smem,
   2664 					    outfname_len + sizeof (".XXXXXX"));
   2665   ld_state.tempfname = tempfname;
   2666 
   2667   int fd;
   2668   int try = 0;
   2669   while (1)
   2670     {
   2671       strcpy (mempcpy (tempfname, ld_state.outfname, outfname_len), ".XXXXXX");
   2672 
   2673       /* The use of mktemp() here is fine.  We do not want to use
   2674 	 mkstemp() since then the umask isn't used.  And the output
   2675 	 file will have these permissions anyhow.  Any intruder could
   2676 	 change the file later if it would be possible now.  */
   2677       if (mktemp (tempfname) != NULL
   2678 	  && (fd = open (tempfname, O_RDWR | O_EXCL | O_CREAT | O_NOFOLLOW,
   2679 			 ld_state.file_type == relocatable_file_type
   2680 			 ? DEFFILEMODE : ACCESSPERMS)) != -1)
   2681 	break;
   2682 
   2683       /* Failed this round.  We keep trying a number of times.  */
   2684       if (++try >= 10)
   2685 	error (EXIT_FAILURE, errno, gettext ("cannot create output file"));
   2686     }
   2687   ld_state.outfd = fd;
   2688 
   2689   /* Make sure we remove the temporary file in case something goes
   2690      wrong.  */
   2691   on_exit (remove_tempfile, NULL);
   2692 
   2693   /* Create the ELF file data for the output file.  */
   2694   Elf *elf = ld_state.outelf = elf_begin (fd,
   2695 					  conserve_memory
   2696 					  ? ELF_C_WRITE : ELF_C_WRITE_MMAP,
   2697 					  NULL);
   2698   if (elf == NULL)
   2699     error (EXIT_FAILURE, 0,
   2700 	   gettext ("cannot create ELF descriptor for output file: %s"),
   2701 	   elf_errmsg (-1));
   2702 
   2703   /* Create the basic data structures.  */
   2704   if (! xelf_newehdr (elf, klass))
   2705     /* Couldn't create the ELF header.  Very bad.  */
   2706     error (EXIT_FAILURE, 0,
   2707 	   gettext ("could not create ELF header for output file: %s"),
   2708 	   elf_errmsg (-1));
   2709 
   2710   /* And get the current header so that we can modify it.  */
   2711   XElf_Ehdr_vardef (ehdr);
   2712   xelf_getehdr (elf, ehdr);
   2713   assert (ehdr != NULL);
   2714 
   2715   /* Set the machine type.  */
   2716   ehdr->e_machine = machine;
   2717 
   2718   /* Modify it according to the info we have here and now.  */
   2719   if (ld_state.file_type == executable_file_type)
   2720     ehdr->e_type = ET_EXEC;
   2721   else if (ld_state.file_type == dso_file_type)
   2722     ehdr->e_type = ET_DYN;
   2723   else
   2724     {
   2725       assert (ld_state.file_type == relocatable_file_type);
   2726       ehdr->e_type = ET_REL;
   2727     }
   2728 
   2729   /* Set the ELF version.  */
   2730   ehdr->e_version = EV_CURRENT;
   2731 
   2732   /* Set the endianness.  */
   2733   ehdr->e_ident[EI_DATA] = data;
   2734 
   2735   /* Write the ELF header information back.  */
   2736   (void) xelf_update_ehdr (elf, ehdr);
   2737 
   2738   return 0;
   2739 }
   2740 
   2741 
   2742 /* We compute the offsets of the various copied objects and the total
   2743    size of the memory needed.  */
   2744 // XXX The method used here is simple: go from front to back and pack
   2745 // the objects in this order.  A more space efficient way would
   2746 // actually trying to pack the objects as dense as possible.  But this
   2747 // is more expensive.
   2748 static void
   2749 compute_copy_reloc_offset (XElf_Shdr *shdr)
   2750 {
   2751   struct symbol *runp = ld_state.from_dso;
   2752   assert (runp != NULL);
   2753 
   2754   XElf_Off maxalign = 1;
   2755   XElf_Off offset = 0;
   2756 
   2757   do
   2758     if (runp->need_copy)
   2759       {
   2760 	/* Determine alignment for the symbol.  */
   2761 	// XXX The question is how?  The symbol record itself does not
   2762 	// have the information.  So we have to be conservative and
   2763 	// assume the alignment of the section the symbol is in.
   2764 
   2765 	// XXX We can be more precise.  Use the offset from the beginning
   2766 	// of the section and determine the largest power of two with
   2767 	// module zero.
   2768 	XElf_Off symalign = MAX (SCNINFO_SHDR (runp->file->scninfo[runp->scndx].shdr).sh_addralign, 1);
   2769 	/* Keep track of the maximum alignment requirement.  */
   2770 	maxalign = MAX (maxalign, symalign);
   2771 
   2772 	/* Align current position.  */
   2773 	offset = (offset + symalign - 1) & ~(symalign - 1);
   2774 
   2775 	runp->merge.value = offset;
   2776 
   2777 	offset += runp->size;
   2778       }
   2779   while ((runp = runp->next) != ld_state.from_dso);
   2780 
   2781   shdr->sh_type = SHT_NOBITS;
   2782   shdr->sh_size = offset;
   2783   shdr->sh_addralign = maxalign;
   2784 }
   2785 
   2786 
   2787 static void
   2788 compute_common_symbol_offset (XElf_Shdr *shdr)
   2789 {
   2790   struct symbol *runp = ld_state.common_syms;
   2791   assert (runp != NULL);
   2792 
   2793   XElf_Off maxalign = 1;
   2794   XElf_Off offset = 0;
   2795 
   2796   do
   2797     {
   2798       /* Determine alignment for the symbol.  */
   2799       XElf_Off symalign = runp->merge.value;
   2800 
   2801       /* Keep track of the maximum alignment requirement.  */
   2802       maxalign = MAX (maxalign, symalign);
   2803 
   2804       /* Align current position.  */
   2805       offset = (offset + symalign - 1) & ~(symalign - 1);
   2806 
   2807       runp->merge.value = offset;
   2808 
   2809       offset += runp->size;
   2810     }
   2811   while ((runp = runp->next) != ld_state.common_syms);
   2812 
   2813   shdr->sh_type = SHT_NOBITS;
   2814   shdr->sh_size = offset;
   2815   shdr->sh_addralign = maxalign;
   2816 }
   2817 
   2818 
   2819 static void
   2820 sort_sections_generic (void)
   2821 {
   2822   /* XXX TBI */
   2823   abort ();
   2824 }
   2825 
   2826 
   2827 static int
   2828 match_section (const char *osectname, struct filemask_section_name *sectmask,
   2829 	       struct scnhead **scnhead, bool new_section, size_t segment_nr)
   2830 {
   2831   struct scninfo *prevp;
   2832   struct scninfo *runp;
   2833   struct scninfo *notused;
   2834 
   2835   if (fnmatch (sectmask->section_name->name, (*scnhead)->name, 0) != 0)
   2836     /* The section name does not match.  */
   2837     return new_section;
   2838 
   2839   /* If this is a section generated by the linker it doesn't contain
   2840      the regular information (i.e., input section data etc) and must
   2841      be handle special.  */
   2842   if ((*scnhead)->kind != scn_normal)
   2843     {
   2844       (*scnhead)->name = osectname;
   2845       (*scnhead)->segment_nr = segment_nr;
   2846 
   2847       /* We have to count note section since they get their own
   2848 	 program header entry.  */
   2849       if ((*scnhead)->type == SHT_NOTE)
   2850 	++ld_state.nnotesections;
   2851 
   2852       ld_state.allsections[ld_state.nallsections++] = (*scnhead);
   2853       return true;
   2854     }
   2855 
   2856   /* Now we have to match the file names of the input files.  Some of
   2857      the sections here might not match.    */
   2858   runp = (*scnhead)->last->next;
   2859   prevp = (*scnhead)->last;
   2860   notused = NULL;
   2861 
   2862   do
   2863     {
   2864       /* Base of the file name the section comes from.  */
   2865       const char *brfname = basename (runp->fileinfo->rfname);
   2866 
   2867       /* If the section isn't used, the name doesn't match the positive
   2868 	 inclusion list, or the name does match the negative inclusion
   2869 	 list, ignore the section.  */
   2870       if (!runp->used
   2871 	  || (sectmask->filemask != NULL
   2872 	      && fnmatch (sectmask->filemask, brfname, 0) != 0)
   2873 	  || (sectmask->excludemask != NULL
   2874 	      && fnmatch (sectmask->excludemask, brfname, 0) == 0))
   2875 	{
   2876 	  /* This file does not match the file name masks.  */
   2877 	  if (notused == NULL)
   2878 	    notused = runp;
   2879 
   2880 	  prevp = runp;
   2881 	  runp = runp->next;
   2882 	  if (runp == notused)
   2883 	    runp = NULL;
   2884 	}
   2885       /* The section fulfills all requirements, add it to the output
   2886 	 file with the correct section name etc.  */
   2887       else
   2888 	{
   2889 	  struct scninfo *found = runp;
   2890 
   2891 	  /* Remove this input section data buffer from the list.  */
   2892 	  if (prevp != runp)
   2893 	    runp = prevp->next = runp->next;
   2894 	  else
   2895 	    {
   2896 	      free (*scnhead);
   2897 	      *scnhead = NULL;
   2898 	      runp = NULL;
   2899 	    }
   2900 
   2901 	  /* Create a new section for the output file if the 'new_section'
   2902 	     flag says so.  Otherwise append the buffer to the last
   2903 	     section which we created in one of the last calls.  */
   2904 	  if (new_section)
   2905 	    {
   2906 	      struct scnhead *newp;
   2907 
   2908 	      newp = (struct scnhead *) obstack_calloc (&ld_state.smem,
   2909 							sizeof (*newp));
   2910 	      newp->kind = scn_normal;
   2911 	      newp->name = osectname;
   2912 	      newp->type = SCNINFO_SHDR (found->shdr).sh_type;
   2913 	      /* Executable or DSO do not have section groups.  Drop that
   2914 		 information.  */
   2915 	      newp->flags = SCNINFO_SHDR (found->shdr).sh_flags & ~SHF_GROUP;
   2916 	      newp->segment_nr = segment_nr;
   2917 	      newp->last = found->next = found;
   2918 	      newp->used = true;
   2919 	      newp->relsize = found->relsize;
   2920 	      newp->entsize = SCNINFO_SHDR (found->shdr).sh_entsize;
   2921 
   2922 	      /* We have to count note section since they get their own
   2923 		 program header entry.  */
   2924 	      if (newp->type == SHT_NOTE)
   2925 		++ld_state.nnotesections;
   2926 
   2927 	      ld_state.allsections[ld_state.nallsections++] = newp;
   2928 	      new_section = false;
   2929 	    }
   2930 	  else
   2931 	    {
   2932 	      struct scnhead *queued;
   2933 
   2934 	      queued = ld_state.allsections[ld_state.nallsections - 1];
   2935 
   2936 	      found->next = queued->last->next;
   2937 	      queued->last = queued->last->next = found;
   2938 
   2939 	      /* If the linker script forces us to add incompatible
   2940 		 sections together do so.  But reflect this in the
   2941 		 type and flags of the resulting file.  */
   2942 	      if (queued->type != SCNINFO_SHDR (found->shdr).sh_type)
   2943 		/* XXX Any better choice?  */
   2944 		queued->type = SHT_PROGBITS;
   2945 	      if (queued->flags != SCNINFO_SHDR (found->shdr).sh_flags)
   2946 		/* Executable or DSO do not have section groups.  Drop that
   2947 		   information.  */
   2948 		queued->flags = ebl_sh_flags_combine (ld_state.ebl,
   2949 						      queued->flags,
   2950 						      SCNINFO_SHDR (found->shdr).sh_flags
   2951 						      & ~SHF_GROUP);
   2952 
   2953 	      /* Accumulate the relocation section size.  */
   2954 	      queued->relsize += found->relsize;
   2955 	    }
   2956 	}
   2957     }
   2958   while (runp != NULL);
   2959 
   2960   return new_section;
   2961 }
   2962 
   2963 
   2964 static void
   2965 sort_sections_lscript (void)
   2966 {
   2967   struct scnhead *temp[ld_state.nallsections];
   2968 
   2969   /* Make a copy of the section head pointer array.  */
   2970   memcpy (temp, ld_state.allsections,
   2971 	  ld_state.nallsections * sizeof (temp[0]));
   2972   size_t nallsections = ld_state.nallsections;
   2973 
   2974   /* Convert the output segment list in a single-linked list.  */
   2975   struct output_segment *segment = ld_state.output_segments->next;
   2976   ld_state.output_segments->next = NULL;
   2977   ld_state.output_segments = segment;
   2978 
   2979   /* Put the sections in the correct order in the array in the state
   2980      structure.  This might involve merging of sections and also
   2981      renaming the containing section in the output file.  */
   2982   ld_state.nallsections = 0;
   2983   size_t segment_nr;
   2984   size_t last_writable = ~0ul;
   2985   for (segment_nr = 0; segment != NULL; segment = segment->next, ++segment_nr)
   2986     {
   2987       struct output_rule *orule;
   2988 
   2989       for (orule = segment->output_rules; orule != NULL; orule = orule->next)
   2990 	if (orule->tag == output_section)
   2991 	  {
   2992 	    struct input_rule *irule;
   2993 	    bool new_section = true;
   2994 
   2995 	    for (irule = orule->val.section.input; irule != NULL;
   2996 		 irule = irule->next)
   2997 	      if (irule->tag == input_section)
   2998 		{
   2999 		  size_t cnt;
   3000 
   3001 		  for (cnt = 0; cnt < nallsections; ++cnt)
   3002 		    if (temp[cnt] != NULL)
   3003 		      new_section =
   3004 			match_section (orule->val.section.name,
   3005 				       irule->val.section, &temp[cnt],
   3006 				       new_section, segment_nr);
   3007 		}
   3008 	  }
   3009 
   3010       if ((segment->mode & PF_W) != 0)
   3011 	last_writable = ld_state.nallsections - 1;
   3012     }
   3013 
   3014   /* In case we have to create copy relocations or we have common
   3015      symbols, find the last writable segment and add one more data
   3016      block.  It will be a NOBITS block and take up no disk space.
   3017      This is why it is important to get the last block.  */
   3018   if (ld_state.ncopy > 0 || ld_state.common_syms !=  NULL)
   3019     {
   3020       if (last_writable == ~0ul)
   3021 	error (EXIT_FAILURE, 0, "no writable segment");
   3022 
   3023       if (ld_state.allsections[last_writable]->type != SHT_NOBITS)
   3024 	{
   3025 	  /* Make room in the ALLSECTIONS array for a new section.
   3026 	     There is guaranteed room in the array.  We add the new
   3027 	     entry after the last writable section.  */
   3028 	  ++last_writable;
   3029 	  memmove (&ld_state.allsections[last_writable + 1],
   3030 		   &ld_state.allsections[last_writable],
   3031 		   (ld_state.nallsections - last_writable)
   3032 		   * sizeof (ld_state.allsections[0]));
   3033 
   3034 	  ld_state.allsections[last_writable] = (struct scnhead *)
   3035 	    obstack_calloc (&ld_state.smem, sizeof (struct scnhead));
   3036 
   3037 	  /* Name for the new section.  */
   3038 	  ld_state.allsections[last_writable]->name = ".bss";
   3039 	  /* Type: NOBITS.  */
   3040 	  ld_state.allsections[last_writable]->type = SHT_NOBITS;
   3041 	  /* Same segment as the last writable section.  */
   3042 	  ld_state.allsections[last_writable]->segment_nr
   3043 	    = ld_state.allsections[last_writable - 1]->segment_nr;
   3044 	}
   3045     }
   3046 
   3047   /* Create common symbol data block.  */
   3048   if (ld_state.ncopy > 0)
   3049     {
   3050 #if NATIVE_ELF
   3051       struct scninfo *si = (struct scninfo *)
   3052 	obstack_calloc (&ld_state.smem, sizeof (*si) + sizeof (XElf_Shdr));
   3053       si->shdr = (XElf_Shdr *) (si + 1);
   3054 #else
   3055       struct scninfo *si = (struct scninfo *) obstack_calloc (&ld_state.smem,
   3056 							      sizeof (*si));
   3057 #endif
   3058 
   3059       /* Get the information regarding the symbols with copy relocations.  */
   3060       compute_copy_reloc_offset (&SCNINFO_SHDR (si->shdr));
   3061 
   3062       /* This section is needed.  */
   3063       si->used = true;
   3064       /* Remember for later the section data structure.  */
   3065       ld_state.copy_section = si;
   3066 
   3067       if (likely (ld_state.allsections[last_writable]->last != NULL))
   3068 	{
   3069 	  si->next = ld_state.allsections[last_writable]->last->next;
   3070 	  ld_state.allsections[last_writable]->last->next = si;
   3071 	  ld_state.allsections[last_writable]->last = si;
   3072 	}
   3073       else
   3074 	ld_state.allsections[last_writable]->last = si->next = si;
   3075     }
   3076 
   3077   /* Create common symbol data block.  */
   3078   if (ld_state.common_syms != NULL)
   3079     {
   3080 #if NATIVE_ELF
   3081       struct scninfo *si = (struct scninfo *)
   3082 	obstack_calloc (&ld_state.smem, sizeof (*si) + sizeof (XElf_Shdr));
   3083       si->shdr = (XElf_Shdr *) (si + 1);
   3084 #else
   3085       struct scninfo *si = (struct scninfo *) obstack_calloc (&ld_state.smem,
   3086 							      sizeof (*si));
   3087 #endif
   3088 
   3089       /* Get the information regarding the symbols with copy relocations.  */
   3090       compute_common_symbol_offset (&SCNINFO_SHDR (si->shdr));
   3091 
   3092       /* This section is needed.  */
   3093       si->used = true;
   3094       /* Remember for later the section data structure.  */
   3095       ld_state.common_section = si;
   3096 
   3097       if (likely (ld_state.allsections[last_writable]->last != NULL))
   3098 	{
   3099 	  si->next = ld_state.allsections[last_writable]->last->next;
   3100 	  ld_state.allsections[last_writable]->last->next = si;
   3101 	  ld_state.allsections[last_writable]->last = si;
   3102 	}
   3103       else
   3104 	ld_state.allsections[last_writable]->last = si->next = si;
   3105     }
   3106 }
   3107 
   3108 
   3109 /* Create the output sections now.  This requires knowledge about all
   3110    the sections we will need.  It may be necessary to sort sections in
   3111    the order they are supposed to appear in the executable.  The
   3112    sorting use many different kinds of information to optimize the
   3113    resulting binary.  Important is to respect segment boundaries and
   3114    the needed alignment.  The mode of the segments will be determined
   3115    afterwards automatically by the output routines.
   3116 
   3117    The generic sorting routines work in one of two possible ways:
   3118 
   3119    - if a linker script specifies the sections to be used in the
   3120      output and assigns them to a segment this information is used;
   3121 
   3122    - otherwise the linker will order the sections based on permissions
   3123      and some special knowledge about section names.*/
   3124 static void
   3125 ld_generic_create_sections (struct ld_state *statep)
   3126 {
   3127   struct scngroup *groups;
   3128   size_t cnt;
   3129 
   3130   /* For relocatable object we don't have to bother sorting the
   3131      sections and we do want to preserve the relocation sections as
   3132      they appear in the input files.  */
   3133   if (ld_state.file_type != relocatable_file_type)
   3134     {
   3135       /* Collect all the relocation sections.  They are handled
   3136 	 separately.  */
   3137       struct scninfo *list = NULL;
   3138       for (cnt = 0; cnt < ld_state.nallsections; ++cnt)
   3139 	if ((ld_state.allsections[cnt]->type == SHT_REL
   3140 	     || ld_state.allsections[cnt]->type == SHT_RELA)
   3141 	    /* The generated relocation sections are not of any
   3142 	       interest here.  */
   3143 	    && ld_state.allsections[cnt]->last != NULL)
   3144 	  {
   3145 	    if (list == NULL)
   3146 	      list = ld_state.allsections[cnt]->last;
   3147 	    else
   3148 	      {
   3149 		/* Merge the sections list.  */
   3150 		struct scninfo *first = list->next;
   3151 		list->next = ld_state.allsections[cnt]->last->next;
   3152 		ld_state.allsections[cnt]->last->next = first;
   3153 		list = ld_state.allsections[cnt]->last;
   3154 	      }
   3155 
   3156 	    /* Remove the entry from the section list.  */
   3157 	    ld_state.allsections[cnt] = NULL;
   3158 	  }
   3159       ld_state.rellist = list;
   3160 
   3161       if (ld_state.output_segments == NULL)
   3162 	/* Sort using builtin rules.  */
   3163 	sort_sections_generic ();
   3164       else
   3165 	sort_sections_lscript ();
   3166     }
   3167 
   3168   /* Now iterate over the input sections and create the sections in the
   3169      order they are required in the output file.  */
   3170   for (cnt = 0; cnt < ld_state.nallsections; ++cnt)
   3171     {
   3172       struct scnhead *head = ld_state.allsections[cnt];
   3173       Elf_Scn *scn;
   3174       XElf_Shdr_vardef (shdr);
   3175 
   3176       /* Don't handle unused sections.  */
   3177       if (!head->used)
   3178 	continue;
   3179 
   3180       /* We first have to create the section group if necessary.
   3181 	 Section group sections must come (in section index order)
   3182 	 before any of the section contained.  This all is necessary
   3183 	 only for relocatable object as other object types are not
   3184 	 allowed to contain section groups.  */
   3185       if (ld_state.file_type == relocatable_file_type
   3186 	  && unlikely (head->flags & SHF_GROUP))
   3187 	{
   3188 	  /* There is at least one section which is contained in a
   3189 	     section group in the input file.  This means we must
   3190 	     create a section group here as well.  The only problem is
   3191 	     that not all input files have to have to same kind of
   3192 	     partitioning of the sections.  I.e., sections A and B in
   3193 	     one input file and sections B and C in another input file
   3194 	     can be in one group.  That will result in a group
   3195 	     containing the sections A, B, and C in the output
   3196 	     file.  */
   3197 	  struct scninfo *runp;
   3198 	  Elf32_Word here_groupidx = 0;
   3199 	  struct scngroup *here_group;
   3200 	  struct member *newp;
   3201 
   3202 	  /* First check whether any section is already in a group.
   3203 	     In this case we have to add this output section, too.  */
   3204 	  runp = head->last;
   3205 	  do
   3206 	    {
   3207 	      assert (runp->grpid != 0);
   3208 
   3209 	      here_groupidx = runp->fileinfo->scninfo[runp->grpid].outscnndx;
   3210 	      if (here_groupidx != 0)
   3211 		break;
   3212 	    }
   3213 	  while ((runp = runp->next) != head->last);
   3214 
   3215 	  if (here_groupidx == 0)
   3216 	    {
   3217 	      /* We need a new section group section.  */
   3218 	      scn = elf_newscn (ld_state.outelf);
   3219 	      xelf_getshdr (scn, shdr);
   3220 	      if (shdr == NULL)
   3221 		error (EXIT_FAILURE, 0,
   3222 		       gettext ("cannot create section for output file: %s"),
   3223 		       elf_errmsg (-1));
   3224 
   3225 	      here_group = (struct scngroup *) xmalloc (sizeof (*here_group));
   3226 	      here_group->outscnidx = here_groupidx = elf_ndxscn (scn);
   3227 	      here_group->nscns = 0;
   3228 	      here_group->member = NULL;
   3229 	      here_group->next = ld_state.groups;
   3230 	      /* Pick a name for the section.  To keep it meaningful
   3231 		 we use a name used in the input files.  If the
   3232 		 section group in the output file should contain
   3233 		 section which were in section groups of different
   3234 		 names in the input files this is the users
   3235 		 problem.  */
   3236 	      here_group->nameent
   3237 		= ebl_strtabadd (ld_state.shstrtab,
   3238 				 elf_strptr (runp->fileinfo->elf,
   3239 					     runp->fileinfo->shstrndx,
   3240 					     SCNINFO_SHDR (runp->shdr).sh_name),
   3241 				 0);
   3242 	      /* Signature symbol.  */
   3243 	      here_group->symbol
   3244 		= runp->fileinfo->scninfo[runp->grpid].symbols;
   3245 
   3246 	      ld_state.groups = here_group;
   3247 	    }
   3248 	  else
   3249 	    {
   3250 	      /* Search for the group with this index.  */
   3251 	      here_group = ld_state.groups;
   3252 	      while (here_group->outscnidx != here_groupidx)
   3253 		here_group = here_group->next;
   3254 	    }
   3255 
   3256 	  /* Add the new output section.  */
   3257 	  newp = (struct member *) alloca (sizeof (*newp));
   3258 	  newp->scn = head;
   3259 #ifndef NDT_NEEDED
   3260 	  newp->next = NULL;
   3261 #endif
   3262 	  CSNGL_LIST_ADD_REAR (here_group->member, newp);
   3263 	  ++here_group->nscns;
   3264 
   3265 	  /* Store the section group index in all input files.  */
   3266 	  runp = head->last;
   3267 	  do
   3268 	    {
   3269 	      assert (runp->grpid != 0);
   3270 
   3271 	      if (runp->fileinfo->scninfo[runp->grpid].outscnndx == 0)
   3272 		runp->fileinfo->scninfo[runp->grpid].outscnndx = here_groupidx;
   3273 	      else
   3274 		assert (runp->fileinfo->scninfo[runp->grpid].outscnndx
   3275 			== here_groupidx);
   3276 	    }
   3277 	  while ((runp = runp->next) != head->last);
   3278 	}
   3279 
   3280       /* We'll use this section so get it's name in the section header
   3281 	 string table.  */
   3282       if (head->kind == scn_normal)
   3283 	head->nameent = ebl_strtabadd (ld_state.shstrtab, head->name, 0);
   3284 
   3285       /* Create a new section in the output file and add all data
   3286 	 from all the sections we read.  */
   3287       scn = elf_newscn (ld_state.outelf);
   3288       head->scnidx = elf_ndxscn (scn);
   3289       xelf_getshdr (scn, shdr);
   3290       if (shdr == NULL)
   3291 	error (EXIT_FAILURE, 0,
   3292 	       gettext ("cannot create section for output file: %s"),
   3293 	       elf_errmsg (-1));
   3294 
   3295       assert (head->type != SHT_NULL);
   3296       assert (head->type != SHT_SYMTAB);
   3297       assert (head->type != SHT_DYNSYM || head->kind != scn_normal);
   3298       assert (head->type != SHT_STRTAB || head->kind != scn_normal);
   3299       assert (head->type != SHT_GROUP);
   3300       shdr->sh_type = head->type;
   3301       shdr->sh_flags = head->flags;
   3302       shdr->sh_addralign = head->align;
   3303       shdr->sh_entsize = head->entsize;
   3304       assert (shdr->sh_entsize != 0 || (shdr->sh_flags & SHF_MERGE) == 0);
   3305       (void) xelf_update_shdr (scn, shdr);
   3306 
   3307       /* We have to know the section index of the dynamic symbol table
   3308 	 right away.  */
   3309       if (head->kind == scn_dot_dynsym)
   3310 	ld_state.dynsymscnidx = elf_ndxscn (scn);
   3311     }
   3312 
   3313   /* Actually create the section group sections.  */
   3314   groups = ld_state.groups;
   3315   while (groups != NULL)
   3316     {
   3317       Elf_Scn *scn;
   3318       Elf_Data *data;
   3319       Elf32_Word *grpdata;
   3320       struct member *runp;
   3321 
   3322       scn = elf_getscn (ld_state.outelf, groups->outscnidx);
   3323       assert (scn != NULL);
   3324 
   3325       data = elf_newdata (scn);
   3326       if (data == NULL)
   3327 	error (EXIT_FAILURE, 0,
   3328 	       gettext ("cannot create section for output file: %s"),
   3329 	       elf_errmsg (-1));
   3330 
   3331       data->d_size = (groups->nscns + 1) * sizeof (Elf32_Word);
   3332       data->d_buf = grpdata = (Elf32_Word *) xmalloc (data->d_size);
   3333       data->d_type = ELF_T_WORD;
   3334       data->d_version = EV_CURRENT;
   3335       data->d_off = 0;
   3336       /* XXX What better to use?  */
   3337       data->d_align = sizeof (Elf32_Word);
   3338 
   3339       /* The first word in the section is the flag word.  */
   3340       /* XXX Set COMDATA flag is necessary.  */
   3341       grpdata[0] = 0;
   3342 
   3343       runp = groups->member->next;
   3344       cnt = 1;
   3345       do
   3346 	/* Fill in the index of the section.  */
   3347 	grpdata[cnt++] = runp->scn->scnidx;
   3348       while ((runp = runp->next) != groups->member->next);
   3349 
   3350       groups = groups->next;
   3351     }
   3352 }
   3353 
   3354 
   3355 static bool
   3356 reduce_symbol_p (XElf_Sym *sym, struct Ebl_Strent *strent)
   3357 {
   3358   const char *str;
   3359   const char *version;
   3360   struct id_list search;
   3361   struct id_list *verp;
   3362   bool result = ld_state.default_bind_local;
   3363 
   3364   if (XELF_ST_BIND (sym->st_info) == STB_LOCAL || sym->st_shndx == SHN_UNDEF)
   3365     /* We don't have to do anything to local symbols here.  */
   3366     /* XXX Any section value in [SHN_LORESERVER,SHN_XINDEX) need
   3367        special treatment?  */
   3368     return false;
   3369 
   3370   /* XXX Handle other symbol bindings.  */
   3371   assert (XELF_ST_BIND (sym->st_info) == STB_GLOBAL
   3372 	  || XELF_ST_BIND (sym->st_info) == STB_WEAK);
   3373 
   3374   str = ebl_string (strent);
   3375   version = strchr (str, VER_CHR);
   3376   if (version != NULL)
   3377     {
   3378       search.id = strndupa (str, version - str);
   3379       if (*++version == VER_CHR)
   3380 	/* Skip the second '@' signaling a default definition.  */
   3381 	++version;
   3382     }
   3383   else
   3384     {
   3385       search.id = str;
   3386       version = "";
   3387     }
   3388 
   3389   verp = ld_version_str_tab_find (&ld_state.version_str_tab,
   3390 				  elf_hash (search.id), &search);
   3391   while (verp != NULL)
   3392     {
   3393       /* We have this symbol in the version hash table.  Now match the
   3394 	 version name.  */
   3395       if (strcmp (verp->u.s.versionname, version) == 0)
   3396 	/* Match!  */
   3397 	return verp->u.s.local;
   3398 
   3399       verp = verp->next;
   3400     }
   3401 
   3402   /* XXX Add test for wildcard version symbols.  */
   3403 
   3404   return result;
   3405 }
   3406 
   3407 
   3408 static XElf_Addr
   3409 eval_expression (struct expression *expr, XElf_Addr addr)
   3410 {
   3411   XElf_Addr val = ~((XElf_Addr) 0);
   3412 
   3413   switch (expr->tag)
   3414     {
   3415     case exp_num:
   3416       val = expr->val.num;
   3417       break;
   3418 
   3419     case exp_sizeof_headers:
   3420       {
   3421 	/* The 'elf_update' call determine the offset of the first
   3422 	   section.  The the size of the header.  */
   3423 	XElf_Shdr_vardef (shdr);
   3424 
   3425 	xelf_getshdr (elf_getscn (ld_state.outelf, 1), shdr);
   3426 	assert (shdr != NULL);
   3427 
   3428 	val = shdr->sh_offset;
   3429       }
   3430       break;
   3431 
   3432     case exp_pagesize:
   3433       val = ld_state.pagesize;
   3434       break;
   3435 
   3436     case exp_id:
   3437       /* We are here computing only address expressions.  It seems not
   3438 	 to be necessary to handle any variable but ".".  Let's avoid
   3439 	 the complication.  If it turns up to be needed we can add
   3440 	 it.  */
   3441       if (strcmp (expr->val.str, ".") != 0)
   3442 	error (EXIT_FAILURE, 0, gettext ("\
   3443 address computation expression contains variable '%s'"),
   3444 	       expr->val.str);
   3445 
   3446       val = addr;
   3447       break;
   3448 
   3449     case exp_mult:
   3450       val = (eval_expression (expr->val.binary.left, addr)
   3451 	     * eval_expression (expr->val.binary.right, addr));
   3452       break;
   3453 
   3454     case exp_div:
   3455       val = (eval_expression (expr->val.binary.left, addr)
   3456 	     / eval_expression (expr->val.binary.right, addr));
   3457       break;
   3458 
   3459     case exp_mod:
   3460       val = (eval_expression (expr->val.binary.left, addr)
   3461 	     % eval_expression (expr->val.binary.right, addr));
   3462       break;
   3463 
   3464     case exp_plus:
   3465       val = (eval_expression (expr->val.binary.left, addr)
   3466 	     + eval_expression (expr->val.binary.right, addr));
   3467       break;
   3468 
   3469     case exp_minus:
   3470       val = (eval_expression (expr->val.binary.left, addr)
   3471 	     - eval_expression (expr->val.binary.right, addr));
   3472       break;
   3473 
   3474     case exp_and:
   3475       val = (eval_expression (expr->val.binary.left, addr)
   3476 	     & eval_expression (expr->val.binary.right, addr));
   3477       break;
   3478 
   3479     case exp_or:
   3480       val = (eval_expression (expr->val.binary.left, addr)
   3481 	     | eval_expression (expr->val.binary.right, addr));
   3482       break;
   3483 
   3484     case exp_align:
   3485       val = eval_expression (expr->val.child, addr);
   3486       if ((val & (val - 1)) != 0)
   3487 	error (EXIT_FAILURE, 0, gettext ("argument '%" PRIuMAX "' of ALIGN in address computation expression is no power of two"),
   3488 	       (uintmax_t) val);
   3489       val = (addr + val - 1) & ~(val - 1);
   3490       break;
   3491     }
   3492 
   3493   return val;
   3494 }
   3495 
   3496 
   3497 /* Find a good as possible size for the hash table so that all the
   3498    non-zero entries in HASHCODES don't collide too much and the table
   3499    isn't too large.  There is no exact formular for this so we use a
   3500    heuristic.  Depending on the optimization level the search is
   3501    longer or shorter.  */
   3502 static size_t
   3503 optimal_bucket_size (Elf32_Word *hashcodes, size_t maxcnt, int optlevel)
   3504 {
   3505   size_t minsize;
   3506   size_t maxsize;
   3507   size_t bestsize;
   3508   uint64_t bestcost;
   3509   size_t size;
   3510   uint32_t *counts;
   3511   uint32_t *lengths;
   3512 
   3513   if (maxcnt == 0)
   3514     return 0;
   3515 
   3516   /* When we are not optimizing we run only very few tests.  */
   3517   if (optlevel <= 0)
   3518     {
   3519       minsize = maxcnt;
   3520       maxsize = maxcnt + 10000 / maxcnt;
   3521     }
   3522   else
   3523     {
   3524       /* Does not make much sense to start with a smaller table than
   3525 	 one which has at least four collisions.  */
   3526       minsize = MAX (1, maxcnt / 4);
   3527       /* We look for a best fit in the range of up to eigth times the
   3528 	 number of elements.  */
   3529       maxsize = 2 * maxcnt + (6 * MIN (optlevel, 100) * maxcnt) / 100;
   3530     }
   3531   bestsize = maxcnt;
   3532   bestcost = UINT_MAX;
   3533 
   3534   /* Array for counting the collisions and chain lengths.  */
   3535   counts = (uint32_t *) xmalloc ((maxcnt + 1 + maxsize) * sizeof (uint32_t));
   3536   lengths = &counts[maxcnt + 1];
   3537 
   3538   for (size = minsize; size <= maxsize; ++size)
   3539     {
   3540       size_t inner;
   3541       uint64_t cost;
   3542       uint32_t maxlength;
   3543       uint64_t success;
   3544       uint32_t acc;
   3545       double factor;
   3546 
   3547       memset (lengths, '\0', size * sizeof (uint32_t));
   3548       memset (counts, '\0', (maxcnt + 1) * sizeof (uint32_t));
   3549 
   3550       /* Determine how often each hash bucket is used.  */
   3551       assert (hashcodes[0] == 0);
   3552       for (inner = 1; inner < maxcnt; ++inner)
   3553 	++lengths[hashcodes[inner] % size];
   3554 
   3555       /* Determine the lengths.  */
   3556       maxlength = 0;
   3557       for (inner = 0; inner < size; ++inner)
   3558 	{
   3559 	  ++counts[lengths[inner]];
   3560 
   3561 	  if (lengths[inner] > maxlength)
   3562 	    maxlength = lengths[inner];
   3563 	}
   3564 
   3565       /* Determine successful lookup length.  */
   3566       acc = 0;
   3567       success = 0;
   3568       for (inner = 0; inner <= maxlength; ++inner)
   3569 	{
   3570 	  acc += inner;
   3571 	  success += counts[inner] * acc;
   3572 	}
   3573 
   3574       /* We can compute two factors now: the average length of a
   3575 	 positive search and the average length of a negative search.
   3576 	 We count the number of comparisons which have to look at the
   3577 	 names themselves.  Recognizing that the chain ended is not
   3578 	 accounted for since it's almost for free.
   3579 
   3580 	 Which lookup is more important depends on the kind of DSO.
   3581 	 If it is a system DSO like libc it is expected that most
   3582 	 lookups succeed.  Otherwise most lookups fail.  */
   3583       if (ld_state.is_system_library)
   3584 	factor = (1.0 * (double) success / (double) maxcnt
   3585 		  + 0.3 * (double) maxcnt / (double) size);
   3586       else
   3587 	factor = (0.3 * (double) success / (double) maxcnt
   3588 		  + 1.0 * (double) maxcnt / (double) size);
   3589 
   3590       /* Combine the lookup cost factor.  The 1/16th addend adds
   3591 	 penalties for too large table sizes.  */
   3592       cost = (2 + maxcnt + size) * (factor + 1.0 / 16.0);
   3593 
   3594 #if 0
   3595       printf ("maxcnt = %d, size = %d, cost = %Ld, success = %g, fail = %g, factor = %g\n",
   3596 	      maxcnt, size, cost, (double) success / (double) maxcnt, (double) maxcnt / (double) size, factor);
   3597 #endif
   3598 
   3599       /* Compare with current best results.  */
   3600       if (cost < bestcost)
   3601 	{
   3602 	  bestcost = cost;
   3603 	  bestsize = size;
   3604 	}
   3605     }
   3606 
   3607   free (counts);
   3608 
   3609   return bestsize;
   3610 }
   3611 
   3612 
   3613 static void
   3614 optimal_gnu_hash_size (Elf32_Word *hashcodes, size_t maxcnt, int optlevel,
   3615 		       size_t *bitmask_nwords, size_t *shift, size_t *nbuckets)
   3616 {
   3617   // XXX Implement something real
   3618   *bitmask_nwords = 256;
   3619   *shift = 6;
   3620   *nbuckets = 3 * maxcnt / 2;
   3621 }
   3622 
   3623 
   3624 static XElf_Addr
   3625 find_entry_point (void)
   3626 {
   3627   XElf_Addr result;
   3628 
   3629   if (ld_state.entry != NULL)
   3630     {
   3631       struct symbol search = { .name = ld_state.entry };
   3632       struct symbol *syment;
   3633 
   3634       syment = ld_symbol_tab_find (&ld_state.symbol_tab,
   3635 				   elf_hash (ld_state.entry), &search);
   3636       if (syment != NULL && syment->defined)
   3637 	{
   3638 	  /* We found the symbol.  */
   3639 	  Elf_Data *data = elf_getdata (elf_getscn (ld_state.outelf,
   3640 						    ld_state.symscnidx), NULL);
   3641 
   3642 	  XElf_Sym_vardef (sym);
   3643 
   3644 	  sym = NULL;
   3645 	  if (data != NULL)
   3646 	    xelf_getsym (data, ld_state.dblindirect[syment->outsymidx], sym);
   3647 
   3648 	  if (sym == NULL && ld_state.need_dynsym && syment->outdynsymidx != 0)
   3649 	    {
   3650 	      /* Use the dynamic symbol table if available.  */
   3651 	      data = elf_getdata (elf_getscn (ld_state.outelf,
   3652 					      ld_state.dynsymscnidx), NULL);
   3653 
   3654 	      sym = NULL;
   3655 	      if (data != NULL)
   3656 		xelf_getsym (data, syment->outdynsymidx, sym);
   3657 	    }
   3658 
   3659 	  if (sym != NULL)
   3660 	    return sym->st_value;
   3661 
   3662 	  /* XXX What to do if the output has no non-dynamic symbol
   3663 	     table and the dynamic symbol table does not contain the
   3664 	     symbol?  */
   3665 	  assert (ld_state.need_symtab);
   3666 	  assert (ld_state.symscnidx != 0);
   3667 	}
   3668     }
   3669 
   3670   /* We couldn't find the symbol or none was given.  Use the first
   3671      address of the ".text" section then.  */
   3672 
   3673 
   3674   result = 0;
   3675 
   3676   /* In DSOs this is no fatal error.  They usually have no entry
   3677      points.  In this case we set the entry point to zero, which makes
   3678      sure it will always fail.  */
   3679   if (ld_state.file_type == executable_file_type)
   3680     {
   3681       if (ld_state.entry != NULL)
   3682 	error (0, 0, gettext ("\
   3683 cannot find entry symbol '%s': defaulting to %#0*" PRIx64),
   3684 	       ld_state.entry,
   3685 	       xelf_getclass (ld_state.outelf) == ELFCLASS32 ? 10 : 18,
   3686 	       (uint64_t) result);
   3687       else
   3688 	error (0, 0, gettext ("\
   3689 no entry symbol specified: defaulting to %#0*" PRIx64),
   3690 	       xelf_getclass (ld_state.outelf) == ELFCLASS32 ? 10 : 18,
   3691 	       (uint64_t) result);
   3692     }
   3693 
   3694   return result;
   3695 }
   3696 
   3697 
   3698 static void
   3699 fillin_special_symbol (struct symbol *symst, size_t scnidx, size_t nsym,
   3700 		       Elf_Data *symdata, struct Ebl_Strtab *strtab)
   3701 {
   3702   assert (ld_state.file_type != relocatable_file_type);
   3703 
   3704   XElf_Sym_vardef (sym);
   3705   xelf_getsym_ptr (symdata, nsym, sym);
   3706 
   3707   /* The name offset will be filled in later.  */
   3708   sym->st_name = 0;
   3709   /* Traditionally: globally visible.  */
   3710   sym->st_info = XELF_ST_INFO (symst->local ? STB_LOCAL : STB_GLOBAL,
   3711 			       symst->type);
   3712   sym->st_other = symst->hidden ? STV_HIDDEN : STV_DEFAULT;
   3713   /* Reference to the GOT or dynamic section.  Since the GOT and
   3714      dynamic section are only created for executables and DSOs it
   3715      cannot be that the section index is too large.  */
   3716   assert (scnidx != 0);
   3717   assert (scnidx < SHN_LORESERVE || scnidx == SHN_ABS);
   3718   sym->st_shndx = scnidx;
   3719   /* We want the beginning of the section.  */
   3720   sym->st_value = 0;
   3721   // XXX What size?
   3722   sym->st_size = 0;
   3723 
   3724   /* Determine the size of the section.  */
   3725   if (scnidx != SHN_ABS)
   3726     {
   3727       Elf_Data *data = elf_getdata (elf_getscn (ld_state.outelf, scnidx),
   3728 				    NULL);
   3729       assert (data != NULL);
   3730       sym->st_size = data->d_size;
   3731       /* Make sure there is no second data block.  */
   3732       assert (elf_getdata (elf_getscn (ld_state.outelf, scnidx), data)
   3733 	      == NULL);
   3734     }
   3735 
   3736   /* Insert symbol into the symbol table.  Note that we do not have to
   3737      use xelf_update_symshdx.  */
   3738   (void) xelf_update_sym (symdata, nsym, sym);
   3739 
   3740   /* Cross-references.  */
   3741   ndxtosym[nsym] = symst;
   3742   symst->outsymidx = nsym;
   3743 
   3744   /* Add the name to the string table.  */
   3745   symstrent[nsym] = ebl_strtabadd (strtab, symst->name, 0);
   3746 }
   3747 
   3748 
   3749 static void
   3750 new_dynamic_entry (Elf_Data *data, int idx, XElf_Sxword tag, XElf_Addr val)
   3751 {
   3752   XElf_Dyn_vardef (dyn);
   3753   xelf_getdyn_ptr (data, idx, dyn);
   3754   dyn->d_tag = tag;
   3755   dyn->d_un.d_ptr = val;
   3756   (void) xelf_update_dyn (data, idx, dyn);
   3757 }
   3758 
   3759 
   3760 static void
   3761 allocate_version_names (struct usedfiles *runp, struct Ebl_Strtab *dynstrtab)
   3762 {
   3763   /* If this DSO has no versions skip it.  */
   3764   if (runp->status != opened || runp->verdefdata == NULL)
   3765     return;
   3766 
   3767   /* Add the object name.  */
   3768   int offset = 0;
   3769   while (1)
   3770     {
   3771       XElf_Verdef_vardef (def);
   3772       XElf_Verdaux_vardef (aux);
   3773 
   3774       /* Get data at the next offset.  */
   3775       xelf_getverdef (runp->verdefdata, offset, def);
   3776       assert (def != NULL);
   3777       xelf_getverdaux (runp->verdefdata, offset + def->vd_aux, aux);
   3778       assert (aux != NULL);
   3779 
   3780       assert (def->vd_ndx <= runp->nverdef);
   3781       if (def->vd_ndx == 1 || runp->verdefused[def->vd_ndx] != 0)
   3782 	{
   3783 	  runp->verdefent[def->vd_ndx]
   3784 	    = ebl_strtabadd (dynstrtab, elf_strptr (runp->elf,
   3785 						    runp->dynsymstridx,
   3786 						    aux->vda_name), 0);
   3787 
   3788 	  if (def->vd_ndx > 1)
   3789 	    runp->verdefused[def->vd_ndx] = ld_state.nextveridx++;
   3790 	}
   3791 
   3792       if (def->vd_next == 0)
   3793 	/* That were all versions.  */
   3794 	break;
   3795 
   3796       offset += def->vd_next;
   3797     }
   3798 }
   3799 
   3800 
   3801 static XElf_Off
   3802 create_verneed_data (XElf_Off offset, Elf_Data *verneeddata,
   3803 		     struct usedfiles *runp, int *ntotal)
   3804 {
   3805   size_t verneed_size = xelf_fsize (ld_state.outelf, ELF_T_VNEED, 1);
   3806   size_t vernaux_size = xelf_fsize (ld_state.outelf, ELF_T_VNAUX, 1);
   3807   int need_offset;
   3808   bool filled = false;
   3809   GElf_Verneed verneed;
   3810   GElf_Vernaux vernaux;
   3811   int ndef = 0;
   3812   size_t cnt;
   3813 
   3814   /* If this DSO has no versions skip it.  */
   3815   if (runp->nverdefused == 0)
   3816     return offset;
   3817 
   3818   /* We fill in the Verneed record last.  Remember the offset.  */
   3819   need_offset = offset;
   3820   offset += verneed_size;
   3821 
   3822   for (cnt = 2; cnt <= runp->nverdef; ++cnt)
   3823     if (runp->verdefused[cnt] != 0)
   3824       {
   3825 	assert (runp->verdefent[cnt] != NULL);
   3826 
   3827 	if (filled)
   3828 	  {
   3829 	    vernaux.vna_next = vernaux_size;
   3830 	    (void) gelf_update_vernaux (verneeddata, offset, &vernaux);
   3831 	    offset += vernaux_size;
   3832 	  }
   3833 
   3834 	vernaux.vna_hash = elf_hash (ebl_string (runp->verdefent[cnt]));
   3835 	vernaux.vna_flags = 0;
   3836 	vernaux.vna_other = runp->verdefused[cnt];
   3837 	vernaux.vna_name = ebl_strtaboffset (runp->verdefent[cnt]);
   3838 	filled = true;
   3839 	++ndef;
   3840       }
   3841 
   3842   assert (filled);
   3843   vernaux.vna_next = 0;
   3844   (void) gelf_update_vernaux (verneeddata, offset, &vernaux);
   3845   offset += vernaux_size;
   3846 
   3847   verneed.vn_version = VER_NEED_CURRENT;
   3848   verneed.vn_cnt = ndef;
   3849   verneed.vn_file = ebl_strtaboffset (runp->verdefent[1]);
   3850   /* The first auxiliary entry is always found directly
   3851      after the verneed entry.  */
   3852   verneed.vn_aux = verneed_size;
   3853   verneed.vn_next = --*ntotal > 0 ? offset - need_offset : 0;
   3854   (void) gelf_update_verneed (verneeddata, need_offset, &verneed);
   3855 
   3856   return offset;
   3857 }
   3858 
   3859 
   3860 /* Callback for qsort to sort dynamic string table.  */
   3861 static Elf32_Word *global_hashcodes;
   3862 static size_t global_nbuckets;
   3863 static int
   3864 sortfct_hashval (const void *p1, const void *p2)
   3865 {
   3866   size_t idx1 = *(size_t *) p1;
   3867   size_t idx2 = *(size_t *) p2;
   3868 
   3869   int def1 = ndxtosym[idx1]->defined && !ndxtosym[idx1]->in_dso;
   3870   int def2 = ndxtosym[idx2]->defined && !ndxtosym[idx2]->in_dso;
   3871 
   3872   if (! def1 && def2)
   3873     return -1;
   3874   if (def1 && !def2)
   3875     return 1;
   3876   if (! def1)
   3877     return 0;
   3878 
   3879   Elf32_Word hval1 = (global_hashcodes[ndxtosym[idx1]->outdynsymidx]
   3880 		      % global_nbuckets);
   3881   Elf32_Word hval2 = (global_hashcodes[ndxtosym[idx2]->outdynsymidx]
   3882 		      % global_nbuckets);
   3883 
   3884   if (hval1 < hval2)
   3885     return -1;
   3886   if (hval1 > hval2)
   3887     return 1;
   3888   return 0;
   3889 }
   3890 
   3891 
   3892 /* Sort the dynamic symbol table.  The GNU hash table lookup assumes
   3893    that all symbols with the same hash value module the bucket table
   3894    size follow one another.  This avoids the extra hash chain table.
   3895    There is no need (and no way) to perform this operation if we do
   3896    not use the new hash table format.  */
   3897 static void
   3898 create_gnu_hash (size_t nsym_local, size_t nsym, size_t nsym_dyn,
   3899 		 Elf32_Word *gnuhashcodes)
   3900 {
   3901   size_t gnu_bitmask_nwords = 0;
   3902   size_t gnu_shift = 0;
   3903   size_t gnu_nbuckets = 0;
   3904   Elf32_Word *gnu_bitmask = NULL;
   3905   Elf32_Word *gnu_buckets = NULL;
   3906   Elf32_Word *gnu_chain = NULL;
   3907   XElf_Shdr_vardef (shdr);
   3908 
   3909   /* Determine the "optimal" bucket size.  */
   3910   optimal_gnu_hash_size (gnuhashcodes, nsym_dyn, ld_state.optlevel,
   3911 			 &gnu_bitmask_nwords, &gnu_shift, &gnu_nbuckets);
   3912 
   3913   /* Create the .gnu.hash section data structures.  */
   3914   Elf_Scn *hashscn = elf_getscn (ld_state.outelf, ld_state.gnuhashscnidx);
   3915   xelf_getshdr (hashscn, shdr);
   3916   Elf_Data *hashdata = elf_newdata (hashscn);
   3917   if (shdr == NULL || hashdata == NULL)
   3918     error (EXIT_FAILURE, 0, gettext ("\
   3919 cannot create GNU hash table section for output file: %s"),
   3920 	   elf_errmsg (-1));
   3921 
   3922   shdr->sh_link = ld_state.dynsymscnidx;
   3923   (void) xelf_update_shdr (hashscn, shdr);
   3924 
   3925   hashdata->d_size = (xelf_fsize (ld_state.outelf, ELF_T_ADDR,
   3926 				  gnu_bitmask_nwords)
   3927 		      + (4 + gnu_nbuckets + nsym_dyn) * sizeof (Elf32_Word));
   3928   hashdata->d_buf = xcalloc (1, hashdata->d_size);
   3929   hashdata->d_align = sizeof (Elf32_Word);
   3930   hashdata->d_type = ELF_T_WORD;
   3931   hashdata->d_off = 0;
   3932 
   3933   ((Elf32_Word *) hashdata->d_buf)[0] = gnu_nbuckets;
   3934   ((Elf32_Word *) hashdata->d_buf)[2] = gnu_bitmask_nwords;
   3935   ((Elf32_Word *) hashdata->d_buf)[3] = gnu_shift;
   3936   gnu_bitmask = &((Elf32_Word *) hashdata->d_buf)[4];
   3937   gnu_buckets = &gnu_bitmask[xelf_fsize (ld_state.outelf, ELF_T_ADDR,
   3938 					 gnu_bitmask_nwords)
   3939 			     / sizeof (*gnu_buckets)];
   3940   gnu_chain = &gnu_buckets[gnu_nbuckets];
   3941 #ifndef NDEBUG
   3942   void *endp = &gnu_chain[nsym_dyn];
   3943 #endif
   3944   assert (endp == (void *) ((char *) hashdata->d_buf + hashdata->d_size));
   3945 
   3946 
   3947   size_t *remap = xmalloc (nsym_dyn * sizeof (size_t));
   3948 #ifndef NDEBUG
   3949   size_t nsym_dyn_cnt = 1;
   3950 #endif
   3951   for (size_t cnt = nsym_local; cnt < nsym; ++cnt)
   3952     if (symstrent[cnt] != NULL)
   3953       {
   3954 	assert (ndxtosym[cnt]->outdynsymidx > 0);
   3955 	assert (ndxtosym[cnt]->outdynsymidx < nsym_dyn);
   3956 	remap[ndxtosym[cnt]->outdynsymidx] = cnt;
   3957 #ifndef NDEBUG
   3958 	++nsym_dyn_cnt;
   3959 #endif
   3960       }
   3961   assert (nsym_dyn_cnt == nsym_dyn);
   3962 
   3963   // XXX Until we can rely on qsort_r use global variables.
   3964   global_hashcodes = gnuhashcodes;
   3965   global_nbuckets = gnu_nbuckets;
   3966   qsort (remap + 1, nsym_dyn - 1, sizeof (size_t), sortfct_hashval);
   3967 
   3968   bool bm32 = (xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1)
   3969 	       ==  sizeof (Elf32_Word));
   3970 
   3971   size_t first_defined = 0;
   3972   Elf64_Word bitmask_idxbits = gnu_bitmask_nwords - 1;
   3973   Elf32_Word last_bucket = 0;
   3974   for (size_t cnt = 1; cnt < nsym_dyn; ++cnt)
   3975     {
   3976       if (first_defined == 0)
   3977 	{
   3978 	  if (! ndxtosym[remap[cnt]]->defined
   3979 	      || ndxtosym[remap[cnt]]->in_dso)
   3980 	    goto next;
   3981 
   3982 	  ((Elf32_Word *) hashdata->d_buf)[1] = first_defined = cnt;
   3983 	}
   3984 
   3985       Elf32_Word hval = gnuhashcodes[ndxtosym[remap[cnt]]->outdynsymidx];
   3986 
   3987       if (bm32)
   3988 	{
   3989 	  Elf32_Word *bsw = &gnu_bitmask[(hval / 32) & bitmask_idxbits];
   3990 	  assert ((void *) gnu_bitmask <= (void *) bsw);
   3991 	  assert ((void *) bsw < (void *) gnu_buckets);
   3992 	  *bsw |= 1 << (hval & 31);
   3993 	  *bsw |= 1 << ((hval >> gnu_shift) & 31);
   3994 	}
   3995       else
   3996 	{
   3997 	  Elf64_Word *bsw = &((Elf64_Word *) gnu_bitmask)[(hval / 64)
   3998 							  & bitmask_idxbits];
   3999 	  assert ((void *) gnu_bitmask <= (void *) bsw);
   4000 	  assert ((void *) bsw < (void *) gnu_buckets);
   4001 	  *bsw |= 1 << (hval & 63);
   4002 	  *bsw |= 1 << ((hval >> gnu_shift) & 63);
   4003 	}
   4004 
   4005       size_t this_bucket = hval % gnu_nbuckets;
   4006       if (cnt == first_defined || this_bucket != last_bucket)
   4007 	{
   4008 	  if (cnt != first_defined)
   4009 	    {
   4010 	      /* Terminate the previous chain.  */
   4011 	      assert ((void *) &gnu_chain[cnt - first_defined - 1] < endp);
   4012 	      gnu_chain[cnt - first_defined - 1] |= 1;
   4013 	    }
   4014 
   4015 	  assert (this_bucket < gnu_nbuckets);
   4016 	  gnu_buckets[this_bucket] = cnt;
   4017 	  last_bucket = this_bucket;
   4018 	}
   4019 
   4020       assert (cnt >= first_defined);
   4021       assert (cnt - first_defined < nsym_dyn);
   4022       gnu_chain[cnt - first_defined] = hval & ~1u;
   4023 
   4024     next:
   4025       ndxtosym[remap[cnt]]->outdynsymidx = cnt;
   4026     }
   4027 
   4028   /* Terminate the last chain.  */
   4029   if (first_defined != 0)
   4030     {
   4031       assert (nsym_dyn > first_defined);
   4032       assert (nsym_dyn - first_defined - 1 < nsym_dyn);
   4033       gnu_chain[nsym_dyn - first_defined - 1] |= 1;
   4034 
   4035       hashdata->d_size -= first_defined * sizeof (Elf32_Word);
   4036     }
   4037   else
   4038     /* We do not need any hash table.  */
   4039     // XXX
   4040     do { } while (0);
   4041 
   4042   free (remap);
   4043 }
   4044 
   4045 
   4046 /* Create the SysV-style hash table.  */
   4047 static void
   4048 create_hash (size_t nsym_local, size_t nsym, size_t nsym_dyn,
   4049 	     Elf32_Word *hashcodes)
   4050 {
   4051   size_t nbucket = 0;
   4052   Elf32_Word *bucket = NULL;
   4053   Elf32_Word *chain = NULL;
   4054   XElf_Shdr_vardef (shdr);
   4055 
   4056   /* Determine the "optimal" bucket size.  If we also generate the
   4057      new-style hash function there is no need to waste effort and
   4058      space on the old one which should not be used.  Make it as small
   4059      as possible.  */
   4060   if (GENERATE_GNU_HASH)
   4061     nbucket = 1;
   4062   else
   4063     nbucket = optimal_bucket_size (hashcodes, nsym_dyn, ld_state.optlevel);
   4064   /* Create the .hash section data structures.  */
   4065   Elf_Scn *hashscn = elf_getscn (ld_state.outelf, ld_state.hashscnidx);
   4066   xelf_getshdr (hashscn, shdr);
   4067   Elf_Data *hashdata = elf_newdata (hashscn);
   4068   if (shdr == NULL || hashdata == NULL)
   4069     error (EXIT_FAILURE, 0, gettext ("\
   4070 cannot create hash table section for output file: %s"),
   4071 	   elf_errmsg (-1));
   4072 
   4073   shdr->sh_link = ld_state.dynsymscnidx;
   4074   (void) xelf_update_shdr (hashscn, shdr);
   4075 
   4076   hashdata->d_size = (2 + nsym_dyn + nbucket) * sizeof (Elf32_Word);
   4077   hashdata->d_buf = xcalloc (1, hashdata->d_size);
   4078   hashdata->d_align = sizeof (Elf32_Word);
   4079   hashdata->d_type = ELF_T_WORD;
   4080   hashdata->d_off = 0;
   4081 
   4082   ((Elf32_Word *) hashdata->d_buf)[0] = nbucket;
   4083   ((Elf32_Word *) hashdata->d_buf)[1] = nsym_dyn;
   4084   bucket = &((Elf32_Word *) hashdata->d_buf)[2];
   4085   chain = &((Elf32_Word *) hashdata->d_buf)[2 + nbucket];
   4086 
   4087   for (size_t cnt = nsym_local; cnt < nsym; ++cnt)
   4088     if (symstrent[cnt] != NULL)
   4089       {
   4090 	size_t dynidx = ndxtosym[cnt]->outdynsymidx;
   4091 	size_t hashidx = hashcodes[dynidx] % nbucket;
   4092 	if (bucket[hashidx] == 0)
   4093 	  bucket[hashidx] = dynidx;
   4094 	else
   4095 	  {
   4096 	    hashidx = bucket[hashidx];
   4097 	    while (chain[hashidx] != 0)
   4098 	      hashidx = chain[hashidx];
   4099 
   4100 	    chain[hashidx] = dynidx;
   4101 	  }
   4102       }
   4103 }
   4104 
   4105 
   4106 static void
   4107 create_build_id_section (Elf_Scn *scn)
   4108 {
   4109   /* We know how large the section will be so we can create it now.  */
   4110   Elf_Data *d = elf_newdata (scn);
   4111   if (d == NULL)
   4112     error (EXIT_FAILURE, 0, gettext ("cannot create build ID section: %s"),
   4113 	   elf_errmsg (-1));
   4114 
   4115   d->d_type = ELF_T_BYTE;
   4116   d->d_version = EV_CURRENT;
   4117 
   4118   /* The note section header.  */
   4119   assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr));
   4120   d->d_size = sizeof (GElf_Nhdr);
   4121   /* The string is four bytes long.  */
   4122   d->d_size += sizeof (ELF_NOTE_GNU);
   4123   assert (d->d_size % 4 == 0);
   4124 
   4125   if (strcmp (ld_state.build_id, "md5") == 0
   4126       || strcmp (ld_state.build_id, "uuid") == 0)
   4127     d->d_size += 16;
   4128   else if (strcmp (ld_state.build_id, "sha1") == 0)
   4129     d->d_size += 20;
   4130   else
   4131     {
   4132       assert (ld_state.build_id[0] == '0' && ld_state.build_id[1] == 'x');
   4133       /* Use an upper limit of the possible number of bytes generated
   4134 	 from the string.  */
   4135       d->d_size += strlen (ld_state.build_id) / 2;
   4136     }
   4137 
   4138   d->d_buf = xcalloc (d->d_size, 1);
   4139   d->d_off = 0;
   4140   d->d_align = 0;
   4141 }
   4142 
   4143 
   4144 static void
   4145 compute_hash_sum (void (*hashfct) (const void *, size_t, void *), void *ctx)
   4146 {
   4147   /* The call cannot fail.  */
   4148   size_t shstrndx;
   4149   (void) elf_getshdrstrndx (ld_state.outelf, &shstrndx);
   4150 
   4151   const char *ident = elf_getident (ld_state.outelf, NULL);
   4152   bool same_byte_order = ((ident[EI_DATA] == ELFDATA2LSB
   4153 			   && __BYTE_ORDER == __LITTLE_ENDIAN)
   4154 			  || (ident[EI_DATA] == ELFDATA2MSB
   4155 			      && __BYTE_ORDER == __BIG_ENDIAN));
   4156 
   4157   /* Iterate over all sections to find those which are not strippable.  */
   4158   Elf_Scn *scn = NULL;
   4159   while ((scn = elf_nextscn (ld_state.outelf, scn)) != NULL)
   4160     {
   4161       /* Get the section header.  */
   4162       GElf_Shdr shdr_mem;
   4163       GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
   4164       assert (shdr != NULL);
   4165 
   4166       if (SECTION_STRIP_P (shdr, elf_strptr (ld_state.outelf, shstrndx,
   4167 					     shdr->sh_name), true))
   4168 	/* The section can be stripped.  Don't use it.  */
   4169 	continue;
   4170 
   4171       /* Do not look at NOBITS sections.  */
   4172       if (shdr->sh_type == SHT_NOBITS)
   4173 	continue;
   4174 
   4175       /* Iterate through the list of data blocks.  */
   4176       Elf_Data *data = NULL;
   4177       while ((data = INTUSE(elf_getdata) (scn, data)) != NULL)
   4178 	/* If the file byte order is the same as the host byte order
   4179 	   process the buffer directly.  If the data is just a stream
   4180 	   of bytes which the library will not convert we can use it
   4181 	   as well.  */
   4182 	if (likely (same_byte_order) || data->d_type == ELF_T_BYTE)
   4183 	  hashfct (data->d_buf, data->d_size, ctx);
   4184 	else
   4185 	  {
   4186 	    /* Convert the data to file byte order.  */
   4187 	    if (gelf_xlatetof (ld_state.outelf, data, data, ident[EI_DATA])
   4188 		== NULL)
   4189 	      error (EXIT_FAILURE, 0, gettext ("\
   4190 cannot convert section data to file format: %s"),
   4191 		     elf_errmsg (-1));
   4192 
   4193 	    hashfct (data->d_buf, data->d_size, ctx);
   4194 
   4195 	    /* And convert it back.  */
   4196 	    if (gelf_xlatetom (ld_state.outelf, data, data, ident[EI_DATA])
   4197 		== NULL)
   4198 	      error (EXIT_FAILURE, 0, gettext ("\
   4199 cannot convert section data to memory format: %s"),
   4200 		     elf_errmsg (-1));
   4201 	  }
   4202     }
   4203 }
   4204 
   4205 
   4206 /* Iterate over the sections */
   4207 static void
   4208 compute_build_id (void)
   4209 {
   4210   Elf_Data *d = elf_getdata (elf_getscn (ld_state.outelf,
   4211 					 ld_state.buildidscnidx), NULL);
   4212   assert (d != NULL);
   4213 
   4214   GElf_Nhdr *hdr = d->d_buf;
   4215   hdr->n_namesz = sizeof (ELF_NOTE_GNU);
   4216   hdr->n_type = NT_GNU_BUILD_ID;
   4217   char *dp = mempcpy (hdr + 1, ELF_NOTE_GNU, sizeof (ELF_NOTE_GNU));
   4218 
   4219   if (strcmp (ld_state.build_id, "sha1") == 0)
   4220     {
   4221       /* Compute the SHA1 sum of various parts of the generated file.
   4222 	 We compute the hash sum over the external representation.  */
   4223       struct sha1_ctx ctx;
   4224       sha1_init_ctx (&ctx);
   4225 
   4226       /* Compute the hash sum by running over all sections.  */
   4227       compute_hash_sum ((void (*) (const void *, size_t, void *)) sha1_process_bytes,
   4228 			&ctx);
   4229 
   4230       /* We are done computing the checksum.  */
   4231       (void) sha1_finish_ctx (&ctx, dp);
   4232 
   4233       hdr->n_descsz = SHA1_DIGEST_SIZE;
   4234     }
   4235   else if (strcmp (ld_state.build_id, "md5") == 0)
   4236     {
   4237       /* Compute the MD5 sum of various parts of the generated file.
   4238 	 We compute the hash sum over the external representation.  */
   4239       struct md5_ctx ctx;
   4240       md5_init_ctx (&ctx);
   4241 
   4242       /* Compute the hash sum by running over all sections.  */
   4243       compute_hash_sum ((void (*) (const void *, size_t, void *)) md5_process_bytes,
   4244 			&ctx);
   4245 
   4246       /* We are done computing the checksum.  */
   4247       (void) md5_finish_ctx (&ctx, dp);
   4248 
   4249       hdr->n_descsz = MD5_DIGEST_SIZE;
   4250     }
   4251   else if (strcmp (ld_state.build_id, "uuid") == 0)
   4252     {
   4253       int fd = open ("/dev/urandom", O_RDONLY);
   4254       if (fd == -1)
   4255 	error (EXIT_FAILURE, errno, gettext ("cannot open '%s'"),
   4256 	       "/dev/urandom");
   4257 
   4258       if (TEMP_FAILURE_RETRY (read (fd, dp, 16)) != 16)
   4259 	error (EXIT_FAILURE, 0, gettext ("cannot read enough data for UUID"));
   4260 
   4261       close (fd);
   4262 
   4263       hdr->n_descsz = 16;
   4264     }
   4265   else
   4266     {
   4267       const char *cp = ld_state.build_id + 2;
   4268 
   4269       /* The form of the string has been verified before so here we can
   4270 	 simplify the scanning.  */
   4271       do
   4272 	{
   4273 	  if (isxdigit (cp[0]))
   4274 	    {
   4275 	      char ch1 = tolower (cp[0]);
   4276 	      char ch2 = tolower (cp[1]);
   4277 
   4278 	      *dp++ = (((isdigit (ch1) ? ch1 - '0' : ch1 - 'a' + 10) << 4)
   4279 		       | (isdigit (ch2) ? ch2 - '0' : ch2 - 'a' + 10));
   4280 	    }
   4281 	  else
   4282 	    ++cp;
   4283 	}
   4284       while (*cp != '\0');
   4285     }
   4286 }
   4287 
   4288 
   4289 /* Create the output file.
   4290 
   4291    For relocatable files what basically has to happen is that all
   4292    sections from all input files are written into the output file.
   4293    Sections with the same name are combined (offsets adjusted
   4294    accordingly).  The symbol tables are combined in one single table.
   4295    When stripping certain symbol table entries are omitted.
   4296 
   4297    For executables (shared or not) we have to create the program header,
   4298    additional sections like the .interp, eventually (in addition) create
   4299    a dynamic symbol table and a dynamic section.  Also the relocations
   4300    have to be processed differently.  */
   4301 static int
   4302 ld_generic_create_outfile (struct ld_state *statep)
   4303 {
   4304   struct scnlist
   4305   {
   4306     size_t scnidx;
   4307     struct scninfo *scninfo;
   4308     struct scnlist *next;
   4309   };
   4310   struct scnlist *rellist = NULL;
   4311   size_t cnt;
   4312   Elf_Scn *symscn = NULL;
   4313   Elf_Scn *xndxscn = NULL;
   4314   Elf_Scn *strscn = NULL;
   4315   struct Ebl_Strtab *strtab = NULL;
   4316   struct Ebl_Strtab *dynstrtab = NULL;
   4317   XElf_Shdr_vardef (shdr);
   4318   Elf_Data *data;
   4319   Elf_Data *symdata = NULL;
   4320   Elf_Data *xndxdata = NULL;
   4321   struct usedfiles *file;
   4322   size_t nsym;
   4323   size_t nsym_local;
   4324   size_t nsym_allocated;
   4325   size_t nsym_dyn = 0;
   4326   Elf32_Word *dblindirect = NULL;
   4327 #ifndef NDEBUG
   4328   bool need_xndx;
   4329 #endif
   4330   Elf_Scn *shstrtab_scn;
   4331   size_t shstrtab_ndx;
   4332   XElf_Ehdr_vardef (ehdr);
   4333   struct Ebl_Strent *symtab_ent = NULL;
   4334   struct Ebl_Strent *xndx_ent = NULL;
   4335   struct Ebl_Strent *strtab_ent = NULL;
   4336   struct Ebl_Strent *shstrtab_ent;
   4337   struct scngroup *groups;
   4338   Elf_Scn *dynsymscn = NULL;
   4339   Elf_Data *dynsymdata = NULL;
   4340   Elf_Data *dynstrdata = NULL;
   4341   Elf32_Word *hashcodes = NULL;
   4342   Elf32_Word *gnuhashcodes = NULL;
   4343   size_t nsym_dyn_allocated = 0;
   4344   Elf_Scn *versymscn = NULL;
   4345   Elf_Data *versymdata = NULL;
   4346 
   4347   if (ld_state.need_symtab)
   4348     {
   4349       /* First create the symbol table.  We need the symbol section itself
   4350 	 and the string table for it.  */
   4351       symscn = elf_newscn (ld_state.outelf);
   4352       ld_state.symscnidx = elf_ndxscn (symscn);
   4353       symdata = elf_newdata (symscn);
   4354       if (symdata == NULL)
   4355 	error (EXIT_FAILURE, 0,
   4356 	       gettext ("cannot create symbol table for output file: %s"),
   4357 	       elf_errmsg (-1));
   4358 
   4359       symdata->d_type = ELF_T_SYM;
   4360       /* This is an estimated size, but it will definitely cap the real value.
   4361 	 We might have to adjust the number later.  */
   4362       nsym_allocated = (1 + ld_state.nsymtab + ld_state.nplt + ld_state.ngot
   4363 			+ ld_state.nusedsections + ld_state.nlscript_syms);
   4364       symdata->d_size = xelf_fsize (ld_state.outelf, ELF_T_SYM,
   4365 				    nsym_allocated);
   4366 
   4367       /* Optionally the extended section table.  */
   4368       /* XXX Is SHN_LORESERVE correct?  Do we need some other sections?  */
   4369       if (unlikely (ld_state.nusedsections >= SHN_LORESERVE))
   4370 	{
   4371 	  xndxscn = elf_newscn (ld_state.outelf);
   4372 	  ld_state.xndxscnidx = elf_ndxscn (xndxscn);
   4373 
   4374 	  xndxdata = elf_newdata (xndxscn);
   4375 	  if (xndxdata == NULL)
   4376 	    error (EXIT_FAILURE, 0,
   4377 		   gettext ("cannot create symbol table for output file: %s"),
   4378 		   elf_errmsg (-1));
   4379 
   4380 	  /* The following relies on the fact that Elf32_Word and Elf64_Word
   4381 	     have the same size.  */
   4382 	  xndxdata->d_type = ELF_T_WORD;
   4383 	  /* This is an estimated size, but it will definitely cap the
   4384 	     real value.  we might have to adjust the number later.  */
   4385 	  xndxdata->d_size = xelf_fsize (ld_state.outelf, ELF_T_WORD,
   4386 					 nsym_allocated);
   4387 	  /* The first entry is left empty, clear it here and now.  */
   4388 	  xndxdata->d_buf = memset (xmalloc (xndxdata->d_size), '\0',
   4389 				    xelf_fsize (ld_state.outelf, ELF_T_WORD,
   4390 						1));
   4391 	  xndxdata->d_off = 0;
   4392 	  /* XXX Should use an ebl function.  */
   4393 	  xndxdata->d_align = sizeof (Elf32_Word);
   4394 	}
   4395     }
   4396   else
   4397     {
   4398       assert (ld_state.need_dynsym);
   4399 
   4400       /* First create the symbol table.  We need the symbol section itself
   4401 	 and the string table for it.  */
   4402       symscn = elf_getscn (ld_state.outelf, ld_state.dynsymscnidx);
   4403       symdata = elf_newdata (symscn);
   4404       if (symdata == NULL)
   4405 	error (EXIT_FAILURE, 0,
   4406 	       gettext ("cannot create symbol table for output file: %s"),
   4407 	       elf_errmsg (-1));
   4408 
   4409       symdata->d_version = EV_CURRENT;
   4410       symdata->d_type = ELF_T_SYM;
   4411       /* This is an estimated size, but it will definitely cap the real value.
   4412 	 We might have to adjust the number later.  */
   4413       nsym_allocated = (1 + ld_state.nsymtab + ld_state.nplt + ld_state.ngot
   4414 			- ld_state.nlocalsymbols + ld_state.nlscript_syms);
   4415       symdata->d_size = xelf_fsize (ld_state.outelf, ELF_T_SYM,
   4416 				    nsym_allocated);
   4417     }
   4418 
   4419   /* The first entry is left empty, clear it here and now.  */
   4420   symdata->d_buf = memset (xmalloc (symdata->d_size), '\0',
   4421 			   xelf_fsize (ld_state.outelf, ELF_T_SYM, 1));
   4422   symdata->d_off = 0;
   4423   /* XXX This is ugly but how else can it be done.  */
   4424   symdata->d_align = xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1);
   4425 
   4426   /* Allocate another array to keep track of the handles for the symbol
   4427      names.  */
   4428   symstrent = (struct Ebl_Strent **) xcalloc (nsym_allocated,
   4429 					      sizeof (struct Ebl_Strent *));
   4430 
   4431   /* By starting at 1 we effectively add a null entry.  */
   4432   nsym = 1;
   4433 
   4434   /* Iteration over all sections.  */
   4435   for (cnt = 0; cnt < ld_state.nallsections; ++cnt)
   4436     {
   4437       struct scnhead *head = ld_state.allsections[cnt];
   4438       Elf_Scn *scn;
   4439       struct scninfo *runp;
   4440       XElf_Off offset;
   4441       Elf32_Word xndx;
   4442 
   4443       /* Don't handle unused sections at all.  */
   4444       if (!head->used)
   4445 	continue;
   4446 
   4447       /* Get the section handle.  */
   4448       scn = elf_getscn (ld_state.outelf, head->scnidx);
   4449 
   4450       if (unlikely (head->kind == scn_dot_interp))
   4451 	{
   4452 	  Elf_Data *outdata = elf_newdata (scn);
   4453 	  if (outdata == NULL)
   4454 	    error (EXIT_FAILURE, 0,
   4455 		   gettext ("cannot create section for output file: %s"),
   4456 		   elf_errmsg (-1));
   4457 
   4458 	  /* This is the string we'll put in the section.  */
   4459 	  const char *interp = ld_state.interp ?: "/lib/ld.so.1";
   4460 
   4461 	  /* Create the section data.  */
   4462 	  outdata->d_buf = (void *) interp;
   4463 	  outdata->d_size = strlen (interp) + 1;
   4464 	  outdata->d_type = ELF_T_BYTE;
   4465 	  outdata->d_off = 0;
   4466 	  outdata->d_align = 1;
   4467 	  outdata->d_version = EV_CURRENT;
   4468 
   4469 	  /* Remember the index of this section.  */
   4470 	  ld_state.interpscnidx = head->scnidx;
   4471 
   4472 	  continue;
   4473 	}
   4474 
   4475       if (unlikely (head->kind == scn_dot_got))
   4476 	{
   4477 	  /* Remember the index of this section.  */
   4478 	  ld_state.gotscnidx = elf_ndxscn (scn);
   4479 
   4480 	  /* Give the backend the change to initialize the section.  */
   4481 	  INITIALIZE_GOT (&ld_state, scn);
   4482 
   4483 	  continue;
   4484 	}
   4485 
   4486       if (unlikely (head->kind == scn_dot_gotplt))
   4487 	{
   4488 	  /* Remember the index of this section.  */
   4489 	  ld_state.gotpltscnidx = elf_ndxscn (scn);
   4490 
   4491 	  /* Give the backend the change to initialize the section.  */
   4492 	  INITIALIZE_GOTPLT (&ld_state, scn);
   4493 
   4494 	  continue;
   4495 	}
   4496 
   4497       if (unlikely (head->kind == scn_dot_dynrel))
   4498 	{
   4499 	  Elf_Data *outdata;
   4500 
   4501 	  outdata = elf_newdata (scn);
   4502 	  if (outdata == NULL)
   4503 	    error (EXIT_FAILURE, 0,
   4504 		   gettext ("cannot create section for output file: %s"),
   4505 		   elf_errmsg (-1));
   4506 
   4507 	  outdata->d_size = ld_state.relsize_total;
   4508 	  outdata->d_buf = xmalloc (outdata->d_size);
   4509 	  outdata->d_type = (REL_TYPE (&ld_state) == DT_REL
   4510 			     ? ELF_T_REL : ELF_T_RELA);
   4511 	  outdata->d_off = 0;
   4512 	  outdata->d_align = xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1);
   4513 
   4514 	  /* Remember the index of this section.  */
   4515 	  ld_state.reldynscnidx = elf_ndxscn (scn);
   4516 
   4517 	  continue;
   4518 	}
   4519 
   4520       if (unlikely (head->kind == scn_dot_dynamic))
   4521 	{
   4522 	  /* Only create the data for now.  */
   4523 	  Elf_Data *outdata;
   4524 
   4525 	  /* Account for a few more entries we have to add.  */
   4526 	  if (ld_state.dt_flags != 0)
   4527 	    ++ld_state.ndynamic;
   4528 	  if (ld_state.dt_flags_1 != 0)
   4529 	    ++ld_state.ndynamic;
   4530 	  if (ld_state.dt_feature_1 != 0)
   4531 	    ++ld_state.ndynamic;
   4532 
   4533 	  outdata = elf_newdata (scn);
   4534 	  if (outdata == NULL)
   4535 	    error (EXIT_FAILURE, 0,
   4536 		   gettext ("cannot create section for output file: %s"),
   4537 		   elf_errmsg (-1));
   4538 
   4539 	  /* Create the section data.  */
   4540 	  outdata->d_size = xelf_fsize (ld_state.outelf, ELF_T_DYN,
   4541 					ld_state.ndynamic);
   4542 	  outdata->d_buf = xcalloc (1, outdata->d_size);
   4543 	  outdata->d_type = ELF_T_DYN;
   4544 	  outdata->d_off = 0;
   4545 	  outdata->d_align = xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1);
   4546 
   4547 	  /* Remember the index of this section.  */
   4548 	  ld_state.dynamicscnidx = elf_ndxscn (scn);
   4549 
   4550 	  continue;
   4551 	}
   4552 
   4553       if (unlikely (head->kind == scn_dot_dynsym))
   4554 	{
   4555 	  /* We already know the section index.  */
   4556 	  assert (ld_state.dynsymscnidx == elf_ndxscn (scn));
   4557 
   4558 	  continue;
   4559 	}
   4560 
   4561       if (unlikely (head->kind == scn_dot_dynstr))
   4562 	{
   4563 	  /* Remember the index of this section.  */
   4564 	  ld_state.dynstrscnidx = elf_ndxscn (scn);
   4565 
   4566 	  /* Create the string table.  */
   4567 	  dynstrtab = ebl_strtabinit (true);
   4568 
   4569 	  /* XXX TBI
   4570 	     We have to add all the strings which are needed in the
   4571 	     dynamic section here.  This means DT_FILTER,
   4572 	     DT_AUXILIARY, ... entries.  */
   4573 	  if (ld_state.ndsofiles > 0)
   4574 	    {
   4575 	      struct usedfiles *frunp = ld_state.dsofiles;
   4576 
   4577 	      do
   4578 		if (! frunp->as_needed || frunp->used)
   4579 		  frunp->sonameent = ebl_strtabadd (dynstrtab, frunp->soname,
   4580 						    0);
   4581 	      while ((frunp = frunp->next) != ld_state.dsofiles);
   4582 	    }
   4583 
   4584 
   4585 	  /* Add the runtime path information.  The strings are stored
   4586 	     in the .dynstr section.  If both rpath and runpath are defined
   4587 	     the runpath information is used.  */
   4588 	  if (ld_state.runpath != NULL || ld_state.rpath != NULL)
   4589 	    {
   4590 	      struct pathelement *startp;
   4591 	      struct pathelement *prunp;
   4592 	      int tag;
   4593 	      size_t len;
   4594 	      char *str;
   4595 	      char *cp;
   4596 
   4597 	      if (ld_state.runpath != NULL)
   4598 		{
   4599 		  startp = ld_state.runpath;
   4600 		  tag = DT_RUNPATH;
   4601 		}
   4602 	      else
   4603 		{
   4604 		  startp = ld_state.rpath;
   4605 		  tag = DT_RPATH;
   4606 		}
   4607 
   4608 	      /* Determine how long the string will be.  */
   4609 	      for (len = 0, prunp = startp; prunp != NULL; prunp = prunp->next)
   4610 		len += strlen (prunp->pname) + 1;
   4611 
   4612 	      cp = str = (char *) obstack_alloc (&ld_state.smem, len);
   4613 	      /* Copy the string.  */
   4614 	      for (prunp = startp; prunp != NULL; prunp = prunp->next)
   4615 		{
   4616 		  cp = stpcpy (cp, prunp->pname);
   4617 		  *cp++ = ':';
   4618 		}
   4619 	      /* Remove the last colon.  */
   4620 	      cp[-1] = '\0';
   4621 
   4622 	      /* Remember the values until we can generate the dynamic
   4623 		 section.  */
   4624 	      ld_state.rxxpath_strent = ebl_strtabadd (dynstrtab, str, len);
   4625 	      ld_state.rxxpath_tag = tag;
   4626 	    }
   4627 
   4628 	  continue;
   4629 	}
   4630 
   4631       if (unlikely (head->kind == scn_dot_hash))
   4632 	{
   4633 	  /* Remember the index of this section.  */
   4634 	  ld_state.hashscnidx = elf_ndxscn (scn);
   4635 
   4636 	  continue;
   4637 	}
   4638 
   4639       if (unlikely (head->kind == scn_dot_gnu_hash))
   4640 	{
   4641 	  /* Remember the index of this section.  */
   4642 	  ld_state.gnuhashscnidx = elf_ndxscn (scn);
   4643 
   4644 	  continue;
   4645 	}
   4646 
   4647       if (unlikely (head->kind == scn_dot_plt))
   4648 	{
   4649 	  /* Remember the index of this section.  */
   4650 	  ld_state.pltscnidx = elf_ndxscn (scn);
   4651 
   4652 	  /* Give the backend the change to initialize the section.  */
   4653 	  INITIALIZE_PLT (&ld_state, scn);
   4654 
   4655 	  continue;
   4656 	}
   4657 
   4658       if (unlikely (head->kind == scn_dot_pltrel))
   4659 	{
   4660 	  /* Remember the index of this section.  */
   4661 	  ld_state.pltrelscnidx = elf_ndxscn (scn);
   4662 
   4663 	  /* Give the backend the change to initialize the section.  */
   4664 	  INITIALIZE_PLTREL (&ld_state, scn);
   4665 
   4666 	  continue;
   4667 	}
   4668 
   4669       if (unlikely (head->kind == scn_dot_version))
   4670 	{
   4671 	  /* Remember the index of this section.  */
   4672 	  ld_state.versymscnidx = elf_ndxscn (scn);
   4673 
   4674 	  continue;
   4675 	}
   4676 
   4677       if (unlikely (head->kind == scn_dot_version_r))
   4678 	{
   4679 	  /* Remember the index of this section.  */
   4680 	  ld_state.verneedscnidx = elf_ndxscn (scn);
   4681 
   4682 	  continue;
   4683 	}
   4684 
   4685       if (unlikely (head->kind == scn_dot_note_gnu_build_id))
   4686 	{
   4687 	  /* Remember the index of this section.  */
   4688 	  ld_state.buildidscnidx = elf_ndxscn (scn);
   4689 
   4690 	  create_build_id_section (scn);
   4691 
   4692 	  continue;
   4693 	}
   4694 
   4695       /* If we come here we must be handling a normal section.  */
   4696       assert (head->kind == scn_normal);
   4697 
   4698       /* Create an STT_SECTION entry in the symbol table.  But not for
   4699 	 the symbolic symbol table.  */
   4700       if (ld_state.need_symtab)
   4701 	{
   4702 	  /* XXX Can we be cleverer and do this only if needed?  */
   4703 	  XElf_Sym_vardef (sym);
   4704 
   4705 	  /* Optimization ahead: in the native linker we get a pointer
   4706 	     to the final location so that the following code writes
   4707 	     directly in the correct place.  Otherwise we write into
   4708 	     the local variable first.  */
   4709 	  xelf_getsym_ptr (symdata, nsym, sym);
   4710 
   4711 	  /* Usual section symbol: local, no specific information,
   4712 	     except the section index.  The offset here is zero, the
   4713 	     start address will later be added.  */
   4714 	  sym->st_name = 0;
   4715 	  sym->st_info = XELF_ST_INFO (STB_LOCAL, STT_SECTION);
   4716 	  sym->st_other = 0;
   4717 	  sym->st_value = 0;
   4718 	  sym->st_size = 0;
   4719 	  /* In relocatable files the section index can be too big for
   4720 	     the ElfXX_Sym struct.  we have to deal with the extended
   4721 	     symbol table.  */
   4722 	  if (likely (head->scnidx < SHN_LORESERVE))
   4723 	    {
   4724 	      sym->st_shndx = head->scnidx;
   4725 	      xndx = 0;
   4726 	    }
   4727 	  else
   4728 	    {
   4729 	      sym->st_shndx = SHN_XINDEX;
   4730 	      xndx = head->scnidx;
   4731 	    }
   4732 	  /* Commit the change.  See the optimization above, this does
   4733 	     not change the symbol table entry.  But the extended
   4734 	     section index table entry is always written, if there is
   4735 	     such a table.  */
   4736 	  assert (nsym < nsym_allocated);
   4737 	  xelf_update_symshndx (symdata, xndxdata, nsym, sym, xndx, 0);
   4738 
   4739 	  /* Remember the symbol's index in the symbol table.  */
   4740 	  head->scnsymidx = nsym++;
   4741 	}
   4742 
   4743       if (head->type == SHT_REL || head->type == SHT_RELA)
   4744 	{
   4745 	  /* Remember that we have to fill in the symbol table section
   4746 	     index.  */
   4747 	  if (ld_state.file_type == relocatable_file_type)
   4748 	    {
   4749 	      struct scnlist *newp;
   4750 
   4751 	      newp = (struct scnlist *) alloca (sizeof (*newp));
   4752 	      newp->scnidx = head->scnidx;
   4753 	      newp->scninfo = head->last->next;
   4754 #ifndef NDEBUG
   4755 	      newp->next = NULL;
   4756 #endif
   4757 	      SNGL_LIST_PUSH (rellist, newp);
   4758 	    }
   4759 	  else
   4760 	    {
   4761 	      /* When we create an executable or a DSO we don't simply
   4762 		 copy the existing relocations.  Instead many will be
   4763 		 resolved, others will be converted.  Create a data buffer
   4764 		 large enough to contain the contents which we will fill
   4765 		 in later.  */
   4766 	      int type = head->type == SHT_REL ? ELF_T_REL : ELF_T_RELA;
   4767 
   4768 	      data = elf_newdata (scn);
   4769 	      if (data == NULL)
   4770 		error (EXIT_FAILURE, 0,
   4771 		       gettext ("cannot create section for output file: %s"),
   4772 		       elf_errmsg (-1));
   4773 
   4774 	      data->d_size = xelf_fsize (ld_state.outelf, type, head->relsize);
   4775 	      data->d_buf = xcalloc (data->d_size, 1);
   4776 	      data->d_type = type;
   4777 	      data->d_align = xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1);
   4778 	      data->d_off = 0;
   4779 
   4780 	      continue;
   4781 	    }
   4782 	}
   4783 
   4784       /* Recognize string and merge flag and handle them.  */
   4785       if (head->flags & SHF_MERGE)
   4786 	{
   4787 	  /* We merge the contents of the sections.  For this we do
   4788 	     not look at the contents of section directly.  Instead we
   4789 	     look at the symbols of the section.  */
   4790 	  Elf_Data *outdata;
   4791 
   4792 	  /* Concatenate the lists of symbols for all sections.
   4793 
   4794 	     XXX In case any input section has no symbols associated
   4795 	     (this happens for debug sections) we cannot use this
   4796 	     method.  Implement parsing the other debug sections and
   4797 	     find the string pointers.  For now we don't merge.  */
   4798 	  runp = head->last->next;
   4799 	  if (runp->symbols == NULL)
   4800 	    {
   4801 	      head->flags &= ~SHF_MERGE;
   4802 	      goto no_merge;
   4803 	    }
   4804 	  head->symbols = runp->symbols;
   4805 
   4806 	  while ((runp = runp->next) != head->last->next)
   4807 	    {
   4808 	      if (runp->symbols == NULL)
   4809 		{
   4810 		  head->flags &= ~SHF_MERGE;
   4811 		  head->symbols = NULL;
   4812 		  goto no_merge;
   4813 		}
   4814 
   4815 	      struct symbol *oldhead = head->symbols->next_in_scn;
   4816 
   4817 	      head->symbols->next_in_scn = runp->symbols->next_in_scn;
   4818 	      runp->symbols->next_in_scn = oldhead;
   4819 	      head->symbols = runp->symbols;
   4820 	    }
   4821 
   4822 	  /* Create the output section.  */
   4823 	  outdata = elf_newdata (scn);
   4824 	  if (outdata == NULL)
   4825 	    error (EXIT_FAILURE, 0,
   4826 		   gettext ("cannot create section for output file: %s"),
   4827 		   elf_errmsg (-1));
   4828 
   4829 	  /* We use different merging algorithms for performance
   4830 	     reasons.  We can easily handle single-byte and
   4831 	     wchar_t-wide character strings.  All other cases (which
   4832 	     really should happen in real life) are handled by the
   4833 	     generic code.  */
   4834 	  if (SCNINFO_SHDR (head->last->shdr).sh_entsize == 1
   4835 	      && (head->flags & SHF_STRINGS))
   4836 	    {
   4837 	      /* Simple, single-byte string matching.  */
   4838 	      struct Ebl_Strtab *mergestrtab;
   4839 	      struct symbol *symrunp;
   4840 	      Elf_Data *locsymdata = NULL;
   4841 	      Elf_Data *locdata = NULL;
   4842 
   4843 	      mergestrtab = ebl_strtabinit (false);
   4844 
   4845 	      symrunp = head->symbols->next_in_scn;
   4846 	      file = NULL;
   4847 	      do
   4848 		{
   4849 		  /* Accelarate the loop.  We cache the file
   4850 		     information since it might very well be the case
   4851 		     that the previous entry was from the same
   4852 		     file.  */
   4853 		  if (symrunp->file != file)
   4854 		    {
   4855 		      /* Remember the file.  */
   4856 		      file = symrunp->file;
   4857 		      /* Symbol table data from that file.  */
   4858 		      locsymdata = file->symtabdata;
   4859 		      /* String section data.  */
   4860 		      locdata = elf_rawdata (file->scninfo[symrunp->scndx].scn,
   4861 					     NULL);
   4862 		      assert (locdata != NULL);
   4863 		      /* While we are at it, remember the output
   4864 			 section.  If we don't access the string data
   4865 			 section the section won't be in the output
   4866 			 file.  So it is sufficient to do the work
   4867 			 here.  */
   4868 		      file->scninfo[symrunp->scndx].outscnndx = head->scnidx;
   4869 		    }
   4870 
   4871 		  /* Get the symbol information.  This provides us the
   4872 		     offset into the string data section.  */
   4873 		  XElf_Sym_vardef (sym);
   4874 		  xelf_getsym (locsymdata, symrunp->symidx, sym);
   4875 		  assert (sym != NULL);
   4876 
   4877 		  /* Get the data from the file.  Note that we access
   4878 		     the raw section data; no endian-ness issues with
   4879 		     single-byte strings.  */
   4880 		  symrunp->merge.handle
   4881 		    = ebl_strtabadd (mergestrtab,
   4882 				     (char *) locdata->d_buf + sym->st_value,
   4883 				     0);
   4884 		}
   4885 	      while ((symrunp = symrunp->next_in_scn)
   4886 		     != head->symbols->next_in_scn);
   4887 
   4888 	      /* All strings have been added.  Create the final table.  */
   4889 	      ebl_strtabfinalize (mergestrtab, outdata);
   4890 
   4891 	      /* Compute the final offsets in the section.  */
   4892 	      symrunp = runp->symbols;
   4893 	      do
   4894 		{
   4895 		  symrunp->merge.value
   4896 		    = ebl_strtaboffset (symrunp->merge.handle);
   4897 		  symrunp->merged = 1;
   4898 		}
   4899 	      while ((symrunp = symrunp->next_in_scn) != runp->symbols);
   4900 
   4901 	      /* We don't need the string table anymore.  */
   4902 	      ebl_strtabfree (mergestrtab);
   4903 	    }
   4904 	  else if (likely (SCNINFO_SHDR (head->last->shdr).sh_entsize
   4905 			   == sizeof (wchar_t))
   4906 		   && likely (head->flags & SHF_STRINGS))
   4907 	    {
   4908 	      /* Simple, wchar_t string merging.  */
   4909 	      struct Ebl_WStrtab *mergestrtab;
   4910 	      struct symbol *symrunp;
   4911 	      Elf_Data *locsymdata = NULL;
   4912 	      Elf_Data *locdata = NULL;
   4913 
   4914 	      mergestrtab = ebl_wstrtabinit (false);
   4915 
   4916 	      symrunp = runp->symbols;
   4917 	      file = NULL;
   4918 	      do
   4919 		{
   4920 		  /* Accelarate the loop.  We cache the file
   4921 		     information since it might very well be the case
   4922 		     that the previous entry was from the same
   4923 		     file.  */
   4924 		  if (symrunp->file != file)
   4925 		    {
   4926 		      /* Remember the file.  */
   4927 		      file = symrunp->file;
   4928 		      /* Symbol table data from that file.  */
   4929 		      locsymdata = file->symtabdata;
   4930 		      /* String section data.  */
   4931 		      locdata = elf_rawdata (file->scninfo[symrunp->scndx].scn,
   4932 					     NULL);
   4933 		      assert (locdata != NULL);
   4934 
   4935 		      /* While we are at it, remember the output
   4936 			 section.  If we don't access the string data
   4937 			 section the section won't be in the output
   4938 			 file.  So it is sufficient to do the work
   4939 			 here.  */
   4940 		      file->scninfo[symrunp->scndx].outscnndx = head->scnidx;
   4941 		    }
   4942 
   4943 		  /* Get the symbol information.  This provides us the
   4944 		     offset into the string data section.  */
   4945 		  XElf_Sym_vardef (sym);
   4946 		  xelf_getsym (locsymdata, symrunp->symidx, sym);
   4947 		  assert (sym != NULL);
   4948 
   4949 		  /* Get the data from the file.  Using the raw
   4950 		     section data here is possible since we don't
   4951 		     interpret the string themselves except for
   4952 		     looking for the wide NUL character.  The NUL
   4953 		     character has fortunately the same representation
   4954 		     regardless of the byte order.  */
   4955 		  symrunp->merge.handle
   4956 		    = ebl_wstrtabadd (mergestrtab,
   4957 				      (wchar_t *) ((char *) locdata->d_buf
   4958 						   + sym->st_value), 0);
   4959 		}
   4960 	      while ((symrunp = symrunp->next_in_scn) != runp->symbols);
   4961 
   4962 	      /* All strings have been added.  Create the final table.  */
   4963 	      ebl_wstrtabfinalize (mergestrtab, outdata);
   4964 
   4965 	      /* Compute the final offsets in the section.  */
   4966 	      symrunp = runp->symbols;
   4967 	      do
   4968 		{
   4969 		  symrunp->merge.value
   4970 		    = ebl_wstrtaboffset (symrunp->merge.handle);
   4971 		  symrunp->merged = 1;
   4972 		}
   4973 	      while ((symrunp = symrunp->next_in_scn) != runp->symbols);
   4974 
   4975 	      /* We don't need the string table anymore.  */
   4976 	      ebl_wstrtabfree (mergestrtab);
   4977 	    }
   4978 	  else
   4979 	    {
   4980 	      /* Non-standard merging.  */
   4981 	      struct Ebl_GStrtab *mergestrtab;
   4982 	      struct symbol *symrunp;
   4983 	      Elf_Data *locsymdata = NULL;
   4984 	      Elf_Data *locdata = NULL;
   4985 	      /* If this is no string section the length of each "string"
   4986 		 is always one.  */
   4987 	      unsigned int len = (head->flags & SHF_STRINGS) ? 0 : 1;
   4988 
   4989 	      /* This is the generic string table functionality.  Much
   4990 		 slower than the specialized code.  */
   4991 	      mergestrtab
   4992 		= ebl_gstrtabinit (SCNINFO_SHDR (head->last->shdr).sh_entsize,
   4993 				   false);
   4994 
   4995 	      symrunp = runp->symbols;
   4996 	      file = NULL;
   4997 	      do
   4998 		{
   4999 		  /* Accelarate the loop.  We cache the file
   5000 		     information since it might very well be the case
   5001 		     that the previous entry was from the same
   5002 		     file.  */
   5003 		  if (symrunp->file != file)
   5004 		    {
   5005 		      /* Remember the file.  */
   5006 		      file = symrunp->file;
   5007 		      /* Symbol table data from that file.  */
   5008 		      locsymdata = file->symtabdata;
   5009 		      /* String section data.  */
   5010 		      locdata = elf_rawdata (file->scninfo[symrunp->scndx].scn,
   5011 					     NULL);
   5012 		      assert (locdata != NULL);
   5013 
   5014 		      /* While we are at it, remember the output
   5015 			 section.  If we don't access the string data
   5016 			 section the section won't be in the output
   5017 			 file.  So it is sufficient to do the work
   5018 			 here.  */
   5019 		      file->scninfo[symrunp->scndx].outscnndx = head->scnidx;
   5020 		    }
   5021 
   5022 		  /* Get the symbol information.  This provides us the
   5023 		     offset into the string data section.  */
   5024 		  XElf_Sym_vardef (sym);
   5025 		  xelf_getsym (locsymdata, symrunp->symidx, sym);
   5026 		  assert (sym != NULL);
   5027 
   5028 		  /* Get the data from the file.  Using the raw
   5029 		     section data here is possible since we don't
   5030 		     interpret the string themselves except for
   5031 		     looking for the wide NUL character.  The NUL
   5032 		     character has fortunately the same representation
   5033 		     regardless of the byte order.  */
   5034 		  symrunp->merge.handle
   5035 		    = ebl_gstrtabadd (mergestrtab,
   5036 				      (char *) locdata->d_buf + sym->st_value,
   5037 				      len);
   5038 		}
   5039 	      while ((symrunp = symrunp->next_in_scn) != runp->symbols);
   5040 
   5041 	      /* Create the final table.  */
   5042 	      ebl_gstrtabfinalize (mergestrtab, outdata);
   5043 
   5044 	      /* Compute the final offsets in the section.  */
   5045 	      symrunp = runp->symbols;
   5046 	      do
   5047 		{
   5048 		  symrunp->merge.value
   5049 		    = ebl_gstrtaboffset (symrunp->merge.handle);
   5050 		  symrunp->merged = 1;
   5051 		}
   5052 	      while ((symrunp = symrunp->next_in_scn) != runp->symbols);
   5053 
   5054 	      /* We don't need the string table anymore.  */
   5055 	      ebl_gstrtabfree (mergestrtab);
   5056 	    }
   5057 	}
   5058       else
   5059 	{
   5060 	no_merge:
   5061 	  assert (head->scnidx == elf_ndxscn (scn));
   5062 
   5063 	  /* It is important to start with the first list entry (and
   5064 	     not just any one) to add the sections in the correct
   5065 	     order.  */
   5066 	  runp = head->last->next;
   5067 	  offset = 0;
   5068 	  do
   5069 	    {
   5070 	      Elf_Data *outdata = elf_newdata (scn);
   5071 	      if (outdata == NULL)
   5072 		error (EXIT_FAILURE, 0,
   5073 		       gettext ("cannot create section for output file: %s"),
   5074 		       elf_errmsg (-1));
   5075 
   5076 	      /* Exceptional case: if we synthesize a data block SCN
   5077 		 is NULL and the sectio header info must be for a
   5078 		 SHT_NOBITS block and the size and alignment are
   5079 		 filled in.  */
   5080 	      if (likely (runp->scn != NULL))
   5081 		{
   5082 		  data = elf_getdata (runp->scn, NULL);
   5083 		  assert (data != NULL);
   5084 
   5085 		  /* We reuse the data buffer in the input file.  */
   5086 		  *outdata = *data;
   5087 
   5088 		  /* Given that we read the input file from disk we know there
   5089 		     cannot be another data part.  */
   5090 		  assert (elf_getdata (runp->scn, data) == NULL);
   5091 		}
   5092 	      else
   5093 		{
   5094 		  /* Must be a NOBITS section.  */
   5095 		  assert  (SCNINFO_SHDR (runp->shdr).sh_type == SHT_NOBITS);
   5096 
   5097 		  outdata->d_buf = NULL;	/* Not needed.  */
   5098 		  outdata->d_type = ELF_T_BYTE;
   5099 		  outdata->d_version = EV_CURRENT;
   5100 		  outdata->d_size = SCNINFO_SHDR (runp->shdr).sh_size;
   5101 		  outdata->d_align = SCNINFO_SHDR (runp->shdr).sh_addralign;
   5102 		}
   5103 
   5104 	      XElf_Off align =  MAX (1, outdata->d_align);
   5105 	      assert (powerof2 (align));
   5106 	      offset = ((offset + align - 1) & ~(align - 1));
   5107 
   5108 	      runp->offset = offset;
   5109 	      runp->outscnndx = head->scnidx;
   5110 	      runp->allsectionsidx = cnt;
   5111 
   5112 	      outdata->d_off = offset;
   5113 
   5114 	      offset += outdata->d_size;
   5115 	    }
   5116 	  while ((runp = runp->next) != head->last->next);
   5117 
   5118 	  /* If necessary add the additional line to the .comment section.  */
   5119 	  if (ld_state.add_ld_comment
   5120 	      && head->flags == 0
   5121 	      && head->type == SHT_PROGBITS
   5122 	      && strcmp (head->name, ".comment") == 0
   5123 	      && head->entsize == 0)
   5124 	    {
   5125 	      Elf_Data *outdata = elf_newdata (scn);
   5126 
   5127 	      if (outdata == NULL)
   5128 		error (EXIT_FAILURE, 0,
   5129 		       gettext ("cannot create section for output file: %s"),
   5130 		       elf_errmsg (-1));
   5131 
   5132 	      outdata->d_buf = (void *) "\0ld (" PACKAGE_NAME ") " PACKAGE_VERSION;
   5133 	      outdata->d_size = strlen ((char *) outdata->d_buf + 1) + 2;
   5134 	      outdata->d_off = offset;
   5135 	      outdata->d_type = ELF_T_BYTE;
   5136 	      outdata->d_align = 1;
   5137 	    }
   5138 	  /* XXX We should create a .comment section if none exists.
   5139 	     This requires that we early on detect that no such
   5140 	     section exists.  This should probably be implemented
   5141 	     together with some merging of the section contents.
   5142 	     Currently identical entries are not merged.  */
   5143 	}
   5144     }
   5145 
   5146   /* The table we collect the strings in.  */
   5147   strtab = ebl_strtabinit (true);
   5148   if (strtab == NULL)
   5149     error (EXIT_FAILURE, errno, gettext ("cannot create string table"));
   5150 
   5151 
   5152 #ifndef NDEBUG
   5153   /* Keep track of the use of the XINDEX.  */
   5154   need_xndx = false;
   5155 #endif
   5156 
   5157   /* We we generate a normal symbol table for an executable and the
   5158      --export-dynamic option is not given, we need an extra table
   5159      which keeps track of the symbol entry belonging to the symbol
   5160      table entry.  Note that EXPORT_ALL_DYNAMIC is always set if we
   5161      generate a DSO so we do not have to test this separately.  */
   5162   ndxtosym = (struct symbol **) xcalloc (nsym_allocated,
   5163 					 sizeof (struct symbol));
   5164 
   5165   /* Create the special symbol for the GOT section.  */
   5166   if (ld_state.got_symbol != NULL)
   5167     {
   5168       assert (nsym < nsym_allocated);
   5169       // XXX Fix so that it works even if no PLT is needed.
   5170       fillin_special_symbol (ld_state.got_symbol, ld_state.gotpltscnidx,
   5171 			     nsym++, symdata, strtab);
   5172     }
   5173 
   5174   /* Similarly for the dynamic section symbol.  */
   5175   if (ld_state.dyn_symbol != NULL)
   5176     {
   5177       assert (nsym < nsym_allocated);
   5178       fillin_special_symbol (ld_state.dyn_symbol, ld_state.dynamicscnidx,
   5179 			     nsym++, symdata, strtab);
   5180     }
   5181 
   5182   /* Create symbol table entries for the symbols defined in the linker
   5183      script.  */
   5184   if (ld_state.lscript_syms != NULL)
   5185     {
   5186       struct symbol *rsym = ld_state.lscript_syms;
   5187       do
   5188 	{
   5189 	  assert (nsym < nsym_allocated);
   5190 	  fillin_special_symbol (rsym, SHN_ABS, nsym++, symdata, strtab);
   5191 	}
   5192       while ((rsym = rsym->next) != NULL);
   5193     }
   5194 
   5195   /* Iterate over all input files to collect the symbols.  */
   5196   file = ld_state.relfiles->next;
   5197   symdata = elf_getdata (elf_getscn (ld_state.outelf, ld_state.symscnidx),
   5198 			 NULL);
   5199 
   5200   do
   5201     {
   5202       size_t maxcnt;
   5203       Elf_Data *insymdata;
   5204       Elf_Data *inxndxdata;
   5205 
   5206       /* There must be no dynamic symbol table when creating
   5207 	 relocatable files.  */
   5208       assert (ld_state.file_type != relocatable_file_type
   5209 	      || file->dynsymtabdata == NULL);
   5210 
   5211       insymdata = file->symtabdata;
   5212       assert (insymdata != NULL);
   5213       inxndxdata = file->xndxdata;
   5214 
   5215       maxcnt = file->nsymtab;
   5216 
   5217       file->symindirect = (Elf32_Word *) xcalloc (maxcnt, sizeof (Elf32_Word));
   5218 
   5219       /* The dynamic symbol table does not contain local symbols.  So
   5220          we skip those entries.  */
   5221       for (cnt = ld_state.need_symtab ? 1 : file->nlocalsymbols; cnt < maxcnt;
   5222 	   ++cnt)
   5223 	{
   5224 	  XElf_Sym_vardef (sym);
   5225 	  Elf32_Word xndx;
   5226 	  struct symbol *defp = NULL;
   5227 
   5228 	  xelf_getsymshndx (insymdata, inxndxdata, cnt, sym, xndx);
   5229 	  assert (sym != NULL);
   5230 
   5231 	  if (unlikely (XELF_ST_TYPE (sym->st_info) == STT_SECTION))
   5232 	    {
   5233 	      /* Section symbols should always be local but who knows...  */
   5234 	      if (ld_state.need_symtab)
   5235 		{
   5236 		  /* Determine the real section index in the source file.
   5237 		     Use the XINDEX section content if necessary.  We don't
   5238 		     add this information to the dynamic symbol table.  */
   5239 		  if (sym->st_shndx != SHN_XINDEX)
   5240 		    xndx = sym->st_shndx;
   5241 
   5242 		  assert (file->scninfo[xndx].allsectionsidx
   5243 			  < ld_state.nallsections);
   5244 		  file->symindirect[cnt] = ld_state.allsections[file->scninfo[xndx].allsectionsidx]->scnsymidx;
   5245 		  /* Note that the resulting index can be zero here.  There is
   5246 		     no guarantee that the output file will contain all the
   5247 		     sections the input file did.  */
   5248 		}
   5249 	      continue;
   5250 	    }
   5251 
   5252 	  if ((ld_state.strip >= strip_all || !ld_state.need_symtab)
   5253 	      /* XXX Do we need these entries?  */
   5254 	      && XELF_ST_TYPE (sym->st_info) == STT_FILE)
   5255 	    continue;
   5256 
   5257 #if NATIVE_ELF != 0
   5258 	  /* Copy old data.  We create a temporary copy because the
   5259 	     symbol might still be discarded.  */
   5260 	  XElf_Sym sym_mem;
   5261 	  sym_mem = *sym;
   5262 	  sym = &sym_mem;
   5263 #endif
   5264 
   5265 	  if (sym->st_shndx != SHN_UNDEF
   5266 	      && (sym->st_shndx < SHN_LORESERVE
   5267 		  || sym->st_shndx == SHN_XINDEX))
   5268 	    {
   5269 	      /* If we are creating an executable with no normal
   5270 		 symbol table and we do not export all symbols and
   5271 		 this symbol is not defined in a DSO as well, ignore
   5272 		 it.  */
   5273 	      if (!ld_state.export_all_dynamic && !ld_state.need_symtab)
   5274 		{
   5275 		  assert (cnt >= file->nlocalsymbols);
   5276 		  defp = file->symref[cnt];
   5277 		  assert (defp != NULL);
   5278 
   5279 		  if (!defp->in_dso)
   5280 		    /* Ignore it.  */
   5281 		    continue;
   5282 		}
   5283 
   5284 	      /* Determine the real section index in the source file.  Use
   5285 		 the XINDEX section content if necessary.  */
   5286 	      if (sym->st_shndx != SHN_XINDEX)
   5287 		xndx = sym->st_shndx;
   5288 
   5289 	      sym->st_value += file->scninfo[xndx].offset;
   5290 
   5291 	      assert (file->scninfo[xndx].outscnndx < SHN_LORESERVE
   5292 		      || file->scninfo[xndx].outscnndx > SHN_HIRESERVE);
   5293 	      if (unlikely (file->scninfo[xndx].outscnndx > SHN_LORESERVE))
   5294 		{
   5295 		  /* It is not possible to have an extended section index
   5296 		     table for the dynamic symbol table.  */
   5297 		  if (!ld_state.need_symtab)
   5298 		    error (EXIT_FAILURE, 0, gettext ("\
   5299 section index too large in dynamic symbol table"));
   5300 
   5301 		  assert (xndxdata != NULL);
   5302 		  sym->st_shndx = SHN_XINDEX;
   5303 		  xndx = file->scninfo[xndx].outscnndx;
   5304 #ifndef NDEBUG
   5305 		  need_xndx = true;
   5306 #endif
   5307 		}
   5308 	      else
   5309 		{
   5310 		  sym->st_shndx = file->scninfo[xndx].outscnndx;
   5311 		  xndx = 0;
   5312 		}
   5313 	    }
   5314 	  else if (sym->st_shndx == SHN_COMMON || sym->st_shndx == SHN_UNDEF)
   5315 	    {
   5316 	      /* Check whether we have a (real) definition for this
   5317 		 symbol.  If this is the case we skip this symbol
   5318 		 table entry.  */
   5319 	      assert (cnt >= file->nlocalsymbols);
   5320 	      defp = file->symref[cnt];
   5321 	      assert (defp != NULL);
   5322 
   5323 	      assert (sym->st_shndx != SHN_COMMON || defp->defined);
   5324 
   5325 	      if ((sym->st_shndx == SHN_COMMON && !defp->common)
   5326 		  || (sym->st_shndx == SHN_UNDEF && defp->defined)
   5327 		  || defp->added)
   5328 		/* Ignore this symbol table entry, there is a
   5329 		   "better" one or we already added it.  */
   5330 		continue;
   5331 
   5332 	      /* Remember that we already added this symbol.  */
   5333 	      defp->added = 1;
   5334 
   5335 	      /* Adjust the section number for common symbols.  */
   5336 	      if (sym->st_shndx == SHN_COMMON)
   5337 		{
   5338 		  sym->st_value = (ld_state.common_section->offset
   5339 				   + file->symref[cnt]->merge.value);
   5340 		  assert (ld_state.common_section->outscnndx < SHN_LORESERVE);
   5341 		  sym->st_shndx = ld_state.common_section->outscnndx;
   5342 		  xndx = 0;
   5343 		}
   5344 	    }
   5345 	  else if (unlikely (sym->st_shndx != SHN_ABS))
   5346 	    {
   5347 	      if (SPECIAL_SECTION_NUMBER_P (&ld_state, sym->st_shndx))
   5348 		/* XXX Add code to handle machine specific special
   5349 		   sections.  */
   5350 		abort ();
   5351 	    }
   5352 
   5353 	  /* Add the symbol name to the string table.  If the user
   5354 	     chooses the highest level of stripping avoid adding names
   5355 	     for local symbols in the string table.  */
   5356 	  if (sym->st_name != 0
   5357 	      && (ld_state.strip < strip_everything
   5358 		  || XELF_ST_BIND (sym->st_info) != STB_LOCAL))
   5359 	    symstrent[nsym] = ebl_strtabadd (strtab,
   5360 					     elf_strptr (file->elf,
   5361 							 file->symstridx,
   5362 							 sym->st_name), 0);
   5363 
   5364 	  /* Once we know the name this field will get the correct
   5365 	     offset.  For now set it to zero which means no name
   5366 	     associated.  */
   5367 	  GElf_Word st_name = sym->st_name;
   5368 	  sym->st_name = 0;
   5369 
   5370 	  /* If we had to merge sections we have a completely new
   5371 	     offset for the symbol.  */
   5372 	  if (file->has_merge_sections && file->symref[cnt] != NULL
   5373 	      && file->symref[cnt]->merged)
   5374 	    sym->st_value = file->symref[cnt]->merge.value;
   5375 
   5376 	  /* Create the record in the output sections.  */
   5377 	  assert (nsym < nsym_allocated);
   5378 	  xelf_update_symshndx (symdata, xndxdata, nsym, sym, xndx, 1);
   5379 
   5380 	  /* Add the reference to the symbol record in case we need it.
   5381 	     Find the symbol if this has not happened yet.  We do
   5382 	     not need the information for local symbols.  */
   5383 	  if (defp == NULL && cnt >= file->nlocalsymbols)
   5384 	    {
   5385 	      defp = file->symref[cnt];
   5386 
   5387 	      if (defp == NULL)
   5388 		{
   5389 		  /* This is a symbol in a discarded COMDAT section.
   5390 		     Find the definition we actually use.  */
   5391 		  // XXX The question is: do we have to do this here
   5392 		  // XXX or can we do it earlier when we discard the
   5393 		  // XXX section.
   5394 		  struct symbol search;
   5395 		  search.name = elf_strptr (file->elf, file->symstridx,
   5396 					    st_name);
   5397 		  struct symbol *realp
   5398 		    = ld_symbol_tab_find (&ld_state.symbol_tab,
   5399 					  elf_hash (search.name), &search);
   5400 		  if (realp == NULL)
   5401 		    // XXX What to do here?
   5402 		    error (EXIT_FAILURE, 0,
   5403 			   "couldn't find symbol from COMDAT section");
   5404 
   5405 		  file->symref[cnt] = realp;
   5406 
   5407 		  continue;
   5408 		}
   5409 	    }
   5410 
   5411 	  /* Store the reference to the symbol record.  The sorting
   5412 	     code will have to keep this array in the correct order, too.  */
   5413 	  ndxtosym[nsym] = defp;
   5414 
   5415 	  /* One more entry finished.  */
   5416 	  if (cnt >= file->nlocalsymbols)
   5417 	    {
   5418 	      assert (file->symref[cnt]->outsymidx == 0);
   5419 	      file->symref[cnt]->outsymidx = nsym;
   5420 	    }
   5421 	  file->symindirect[cnt] = nsym++;
   5422 	}
   5423     }
   5424   while ((file = file->next) != ld_state.relfiles->next);
   5425   /* Make sure we didn't create the extended section index table for
   5426      nothing.  */
   5427   assert (xndxdata == NULL || need_xndx);
   5428 
   5429   /* Create the version related sections.  */
   5430   if (ld_state.verneedscnidx != 0)
   5431     {
   5432       /* We know the number of input files and total number of
   5433 	 referenced versions.  This allows us to allocate the memory
   5434 	 and then we iterate over the DSOs to get the version
   5435 	 information.  */
   5436       struct usedfiles *runp;
   5437 
   5438       runp = ld_state.dsofiles->next;
   5439       do
   5440 	allocate_version_names (runp, dynstrtab);
   5441       while ((runp = runp->next) != ld_state.dsofiles->next);
   5442 
   5443       if (ld_state.needed != NULL)
   5444 	{
   5445 	  runp = ld_state.needed->next;
   5446 	  do
   5447 	    allocate_version_names (runp, dynstrtab);
   5448 	  while ((runp = runp->next) != ld_state.needed->next);
   5449 	}
   5450     }
   5451 
   5452   /* At this point we should hide symbols and so on.  */
   5453   if (ld_state.default_bind_local || ld_state.version_str_tab.filled > 0)
   5454     /* XXX Add one more test when handling of wildcard symbol names
   5455        is supported.  */
   5456     {
   5457     /* Check all non-local symbols whether they are on the export list.  */
   5458       bool any_reduced = false;
   5459 
   5460       for (cnt = 1; cnt < nsym; ++cnt)
   5461 	{
   5462 	  XElf_Sym_vardef (sym);
   5463 
   5464 	  /* Note that we don't have to use 'xelf_getsymshndx' since we
   5465 	     only need the binding and the symbol name.  */
   5466 	  xelf_getsym (symdata, cnt, sym);
   5467 	  assert (sym != NULL);
   5468 
   5469 	  if (reduce_symbol_p (sym, symstrent[cnt]))
   5470 	    {
   5471 	      // XXX Check whether this is correct...
   5472 	      assert (ndxtosym[cnt]->outdynsymidx != 0);
   5473 	      ndxtosym[cnt]->outdynsymidx = 0;
   5474 
   5475 	      sym->st_info = XELF_ST_INFO (STB_LOCAL,
   5476 					   XELF_ST_TYPE (sym->st_info));
   5477 	      (void) xelf_update_sym (symdata, cnt, sym);
   5478 
   5479 	      /* Show that we don't need this string anymore.  */
   5480 	      if (ld_state.strip == strip_everything)
   5481 		{
   5482 		  symstrent[cnt] = NULL;
   5483 		  any_reduced = true;
   5484 		}
   5485 	    }
   5486 	}
   5487 
   5488       if (unlikely (any_reduced))
   5489 	{
   5490 	  /* Since we will not write names of local symbols in the
   5491 	     output file and we have reduced the binding of some
   5492 	     symbols the string table previously constructed contains
   5493 	     too many string.  Correct it.  */
   5494 	  struct Ebl_Strtab *newp = ebl_strtabinit (true);
   5495 
   5496 	  for (cnt = 1; cnt < nsym; ++cnt)
   5497 	    if (symstrent[cnt] != NULL)
   5498 	      symstrent[cnt] = ebl_strtabadd (newp,
   5499 					      ebl_string (symstrent[cnt]), 0);
   5500 
   5501 	  ebl_strtabfree (strtab);
   5502 	  strtab = newp;
   5503 	}
   5504     }
   5505 
   5506   /* Add the references to DSOs.  We can add these entries this late
   5507      (after sorting out versioning) because references to DSOs are not
   5508      effected.  */
   5509   if (ld_state.from_dso != NULL)
   5510     {
   5511       struct symbol *runp;
   5512       size_t plt_base = nsym + ld_state.nfrom_dso - ld_state.nplt;
   5513       size_t plt_idx = 0;
   5514       size_t obj_idx = 0;
   5515 
   5516       assert (ld_state.nfrom_dso >= ld_state.nplt);
   5517       runp = ld_state.from_dso;
   5518       do
   5519 	{
   5520 	  // XXX What about functions which are only referenced via
   5521 	  // pointers and not PLT entries?  Can we distinguish such uses?
   5522 	  size_t idx;
   5523 	  if (runp->type == STT_FUNC)
   5524 	    {
   5525 	      /* Store the PLT entry number.  */
   5526 	      runp->merge.value = plt_idx + 1;
   5527 	      idx = plt_base + plt_idx++;
   5528 	    }
   5529 	  else
   5530 	    idx = nsym + obj_idx++;
   5531 
   5532 	  XElf_Sym_vardef (sym);
   5533 	  xelf_getsym_ptr (symdata, idx, sym);
   5534 
   5535 	  sym->st_value = 0;
   5536 	  sym->st_size = runp->size;
   5537 	  sym->st_info = XELF_ST_INFO (runp->weak ? STB_WEAK : STB_GLOBAL,
   5538 				       runp->type);
   5539 	  sym->st_other = STV_DEFAULT;
   5540 	  sym->st_shndx = SHN_UNDEF;
   5541 
   5542 	  /* Create the record in the output sections.  */
   5543 	  xelf_update_symshndx (symdata, xndxdata, idx, sym, 0, 0);
   5544 
   5545 	  const char *name = runp->name;
   5546 	  size_t namelen = 0;
   5547 
   5548 	  if (runp->file->verdefdata != NULL)
   5549 	    {
   5550 	      // XXX Is it useful to add the versym value to struct symbol?
   5551 	      XElf_Versym versym;
   5552 
   5553 	      (void) xelf_getversym_copy (runp->file->versymdata, runp->symidx,
   5554 					  versym);
   5555 
   5556 	      /* One can only link with the default version.  */
   5557 	      assert ((versym & 0x8000) == 0);
   5558 
   5559 	      const char *versname
   5560 		= ebl_string (runp->file->verdefent[versym]);
   5561 
   5562 	      size_t versname_len = strlen (versname) + 1;
   5563 	      namelen = strlen (name) + versname_len + 2;
   5564 	      char *newp = (char *) obstack_alloc (&ld_state.smem, namelen);
   5565 	      memcpy (stpcpy (stpcpy (newp, name), "@@"),
   5566 		      versname, versname_len);
   5567 	      name = newp;
   5568 	    }
   5569 
   5570 	  symstrent[idx] = ebl_strtabadd (strtab, name, namelen);
   5571 
   5572 	  /* Record the initial index in the symbol table.  */
   5573 	  runp->outsymidx = idx;
   5574 
   5575 	  /* Remember the symbol record this ELF symbol came from.  */
   5576 	  ndxtosym[idx] = runp;
   5577 	}
   5578       while ((runp = runp->next) != ld_state.from_dso);
   5579 
   5580       assert (nsym + obj_idx == plt_base);
   5581       assert (plt_idx == ld_state.nplt);
   5582       nsym = plt_base + plt_idx;
   5583     }
   5584 
   5585   /* Now we know how many symbols will be in the output file.  Adjust
   5586      the count in the section data.  */
   5587   symdata->d_size = xelf_fsize (ld_state.outelf, ELF_T_SYM, nsym);
   5588   if (unlikely (xndxdata != NULL))
   5589     xndxdata->d_size = xelf_fsize (ld_state.outelf, ELF_T_WORD, nsym);
   5590 
   5591   /* Create the symbol string table section.  */
   5592   strscn = elf_newscn (ld_state.outelf);
   5593   ld_state.strscnidx = elf_ndxscn (strscn);
   5594   data = elf_newdata (strscn);
   5595   xelf_getshdr (strscn, shdr);
   5596   if (data == NULL || shdr == NULL)
   5597     error (EXIT_FAILURE, 0,
   5598 	   gettext ("cannot create section for output file: %s"),
   5599 	   elf_errmsg (-1));
   5600 
   5601   /* Create a compact string table, allocate the memory for it, and
   5602      fill in the section data information.  */
   5603   ebl_strtabfinalize (strtab, data);
   5604 
   5605   shdr->sh_type = SHT_STRTAB;
   5606   assert (shdr->sh_entsize == 0);
   5607 
   5608   if (unlikely (xelf_update_shdr (strscn, shdr) == 0))
   5609     error (EXIT_FAILURE, 0,
   5610 	   gettext ("cannot create section for output file: %s"),
   5611 	   elf_errmsg (-1));
   5612 
   5613   /* Fill in the offsets of the symbol names.  */
   5614   for (cnt = 1; cnt < nsym; ++cnt)
   5615     if (symstrent[cnt] != NULL)
   5616       {
   5617 	XElf_Sym_vardef (sym);
   5618 
   5619 	/* Note that we don't have to use 'xelf_getsymshndx' since we don't
   5620 	   modify the section index.  */
   5621 	xelf_getsym (symdata, cnt, sym);
   5622 	/* This better worked, we did it before.  */
   5623 	assert (sym != NULL);
   5624 	sym->st_name = ebl_strtaboffset (symstrent[cnt]);
   5625 	(void) xelf_update_sym (symdata, cnt, sym);
   5626       }
   5627 
   5628   /* Since we are going to reorder the symbol table but still have to
   5629      be able to find the new position based on the old one (since the
   5630      latter is stored in 'symindirect' information of the input file
   5631      data structure) we have to create yet another indirection
   5632      table.  */
   5633   ld_state.dblindirect = dblindirect
   5634     = (Elf32_Word *) xmalloc (nsym * sizeof (Elf32_Word));
   5635 
   5636   /* Sort the symbol table so that the local symbols come first.  */
   5637   /* XXX We don't use stable sorting here.  It seems not necessary and
   5638      would be more expensive.  If it turns out to be necessary this can
   5639      be fixed easily.  */
   5640   nsym_local = 1;
   5641   cnt = nsym - 1;
   5642   while (nsym_local < cnt)
   5643     {
   5644       XElf_Sym_vardef (locsym);
   5645       Elf32_Word locxndx;
   5646       XElf_Sym_vardef (globsym);
   5647       Elf32_Word globxndx;
   5648 
   5649       do
   5650 	{
   5651 	  xelf_getsymshndx (symdata, xndxdata, nsym_local, locsym, locxndx);
   5652 	  /* This better works.  */
   5653 	  assert (locsym != NULL);
   5654 
   5655 	  if (XELF_ST_BIND (locsym->st_info) != STB_LOCAL
   5656 	      && (ld_state.need_symtab || ld_state.export_all_dynamic))
   5657 	    {
   5658 	      do
   5659 		{
   5660 		  xelf_getsymshndx (symdata, xndxdata, cnt, globsym, globxndx);
   5661 		  /* This better works.  */
   5662 		  assert (globsym != NULL);
   5663 
   5664 		  if (unlikely (XELF_ST_BIND (globsym->st_info) == STB_LOCAL))
   5665 		    {
   5666 		      /* We swap the two entries.  */
   5667 #if NATIVE_ELF != 0
   5668 		      /* Since we directly modify the data in the ELF
   5669 			 data structure we have to make a copy of one
   5670 			 of the entries.  */
   5671 		      XElf_Sym locsym_copy = *locsym;
   5672 		      locsym = &locsym_copy;
   5673 #endif
   5674 		      xelf_update_symshndx (symdata, xndxdata, nsym_local,
   5675 					    globsym, globxndx, 1);
   5676 		      xelf_update_symshndx (symdata, xndxdata, cnt,
   5677 					    locsym, locxndx, 1);
   5678 
   5679 		      /* Also swap the cross references.  */
   5680 		      dblindirect[nsym_local] = cnt;
   5681 		      dblindirect[cnt] = nsym_local;
   5682 
   5683 		      /* And the entries for the symbol names.  */
   5684 		      struct Ebl_Strent *strtmp = symstrent[nsym_local];
   5685 		      symstrent[nsym_local] = symstrent[cnt];
   5686 		      symstrent[cnt] = strtmp;
   5687 
   5688 		      /* And the mapping from symbol table entry to
   5689 			 struct symbol record.  */
   5690 		      struct symbol *symtmp = ndxtosym[nsym_local];
   5691 		      ndxtosym[nsym_local] = ndxtosym[cnt];
   5692 		      ndxtosym[cnt] = symtmp;
   5693 
   5694 		      /* Go to the next entry.  */
   5695 		      ++nsym_local;
   5696 		      --cnt;
   5697 
   5698 		      break;
   5699 		    }
   5700 
   5701 		  dblindirect[cnt] = cnt;
   5702 		}
   5703 	      while (nsym_local < --cnt);
   5704 
   5705 	      break;
   5706 	    }
   5707 
   5708 	  dblindirect[nsym_local] = nsym_local;
   5709 	}
   5710       while (++nsym_local < cnt);
   5711     }
   5712 
   5713   /* The symbol 'nsym_local' is currently pointing to might be local,
   5714      too.  Check and increment the variable if this is the case.  */
   5715   if (likely (nsym_local < nsym))
   5716     {
   5717       XElf_Sym_vardef (locsym);
   5718 
   5719       /* This entry isn't moved.  */
   5720       dblindirect[nsym_local] = nsym_local;
   5721 
   5722       /* Note that it is OK to not use 'xelf_getsymshndx' here.  */
   5723       xelf_getsym (symdata, nsym_local, locsym);
   5724       /* This better works.  */
   5725       assert (locsym != NULL);
   5726 
   5727       if (XELF_ST_BIND (locsym->st_info) == STB_LOCAL)
   5728 	++nsym_local;
   5729     }
   5730 
   5731 
   5732   /* We need the versym array right away to keep track of the version
   5733      symbols.  */
   5734   if (ld_state.versymscnidx != 0)
   5735     {
   5736       /* We allocate more memory than we need since the array is morroring
   5737 	 the dynamic symbol table and not the normal symbol table.  I.e.,
   5738 	 no local symbols are present.  */
   5739       versymscn = elf_getscn (ld_state.outelf, ld_state.versymscnidx);
   5740       versymdata = elf_newdata (versymscn);
   5741       if (versymdata == NULL)
   5742 	error (EXIT_FAILURE, 0,
   5743 	       gettext ("cannot create versioning section: %s"),
   5744 	       elf_errmsg (-1));
   5745 
   5746       versymdata->d_size = xelf_fsize (ld_state.outelf, ELF_T_HALF,
   5747 				       nsym - nsym_local + 1);
   5748       versymdata->d_buf = xcalloc (1, versymdata->d_size);
   5749       versymdata->d_align = xelf_fsize (ld_state.outelf, ELF_T_HALF, 1);
   5750       versymdata->d_off = 0;
   5751       versymdata->d_type = ELF_T_HALF;
   5752     }
   5753 
   5754 
   5755   /* If we have to construct the dynamic symbol table we must not include
   5756      the local symbols.  If the normal symbol has to be emitted as well
   5757      we haven't done anything else yet and we can construct it from
   5758      scratch now.  */
   5759   if (unlikely (!ld_state.need_symtab))
   5760     {
   5761       /* Note that the following code works even if there is no entry
   5762 	 to remove since the zeroth entry is always local.  */
   5763       size_t reduce = xelf_fsize (ld_state.outelf, ELF_T_SYM, nsym_local - 1);
   5764 
   5765       XElf_Sym_vardef (nullsym);
   5766       xelf_getsym_ptr (symdata, nsym_local - 1, nullsym);
   5767 
   5768       /* Note that we don't have to use 'xelf_update_symshndx' since
   5769 	 this is the dynamic symbol table we write.  */
   5770       (void) xelf_update_sym (symdata, nsym_local - 1,
   5771 			      memset (nullsym, '\0', sizeof (*nullsym)));
   5772 
   5773       /* Update the buffer pointer and size in the output data.  */
   5774       symdata->d_buf = (char *) symdata->d_buf + reduce;
   5775       symdata->d_size -= reduce;
   5776 
   5777       /* Add the version symbol information.  */
   5778       if (versymdata != NULL)
   5779 	{
   5780 	  nsym_dyn = 1;
   5781 	  for (cnt = nsym_local; cnt < nsym; ++cnt, ++nsym_dyn)
   5782 	    {
   5783 	      struct symbol *symp = ndxtosym[cnt];
   5784 
   5785 	      if (symp->file->versymdata != NULL)
   5786 		{
   5787 		  GElf_Versym versym;
   5788 
   5789 		  gelf_getversym (symp->file->versymdata, symp->symidx,
   5790 				  &versym);
   5791 
   5792 		  (void) gelf_update_versym (versymdata, symp->outdynsymidx,
   5793 					     &symp->file->verdefused[versym]);
   5794 		}
   5795 	      }
   5796 	}
   5797 
   5798       /* Since we only created the dynamic symbol table the number of
   5799 	 dynamic symbols is the total number of symbols.  */
   5800       nsym_dyn = nsym - nsym_local + 1;
   5801 
   5802       /* XXX TBI.  Create whatever data structure is missing.  */
   5803       abort ();
   5804     }
   5805   else if (ld_state.need_dynsym)
   5806     {
   5807       /* Create the dynamic symbol table section data along with the
   5808 	 string table.  We look at all non-local symbols we found for
   5809 	 the normal symbol table and add those.  */
   5810       dynsymscn = elf_getscn (ld_state.outelf, ld_state.dynsymscnidx);
   5811       dynsymdata = elf_newdata (dynsymscn);
   5812 
   5813       dynstrdata = elf_newdata (elf_getscn (ld_state.outelf,
   5814 					    ld_state.dynstrscnidx));
   5815       if (dynsymdata == NULL || dynstrdata == NULL)
   5816 	error (EXIT_FAILURE, 0, gettext ("\
   5817 cannot create dynamic symbol table for output file: %s"),
   5818 	       elf_errmsg (-1));
   5819 
   5820       nsym_dyn_allocated = nsym - nsym_local + 1;
   5821       dynsymdata->d_size = xelf_fsize (ld_state.outelf, ELF_T_SYM,
   5822 				       nsym_dyn_allocated);
   5823       dynsymdata->d_buf = memset (xmalloc (dynsymdata->d_size), '\0',
   5824 				  xelf_fsize (ld_state.outelf, ELF_T_SYM, 1));
   5825       dynsymdata->d_type = ELF_T_SYM;
   5826       dynsymdata->d_off = 0;
   5827       dynsymdata->d_align = xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1);
   5828 
   5829       /* We need one more array which contains the hash codes of the
   5830 	 symbol names.  */
   5831       hashcodes = (Elf32_Word *) xcalloc (__builtin_popcount ((int) ld_state.hash_style)
   5832 					  * nsym_dyn_allocated,
   5833 					  sizeof (Elf32_Word));
   5834       gnuhashcodes = hashcodes;
   5835       if (GENERATE_SYSV_HASH)
   5836 	gnuhashcodes += nsym_dyn_allocated;
   5837 
   5838       /* We have and empty entry at the beginning.  */
   5839       nsym_dyn = 1;
   5840 
   5841       /* Populate the table.  */
   5842       for (cnt = nsym_local; cnt < nsym; ++cnt)
   5843 	{
   5844 	  XElf_Sym_vardef (sym);
   5845 
   5846 	  xelf_getsym (symdata, cnt, sym);
   5847 	  assert (sym != NULL);
   5848 
   5849 	  if (sym->st_shndx == SHN_XINDEX)
   5850 	    error (EXIT_FAILURE, 0, gettext ("\
   5851 section index too large in dynamic symbol table"));
   5852 
   5853 	  /* We do not add the symbol to the dynamic symbol table if
   5854 
   5855 	     - the symbol is for a file
   5856 	     - it is not externally visible (internal, hidden)
   5857 	     - export_all_dynamic is not set and the symbol is only defined
   5858 	       in the executable (i.e., it is defined, but not (also) in DSO)
   5859 
   5860 	     Set symstrent[cnt] to NULL in case an entry is ignored.  */
   5861 	  if (XELF_ST_TYPE (sym->st_info) == STT_FILE
   5862 	      || XELF_ST_VISIBILITY (sym->st_other) == STV_INTERNAL
   5863 	      || XELF_ST_VISIBILITY (sym->st_other) == STV_HIDDEN
   5864 	      || (!ld_state.export_all_dynamic
   5865 		  && !ndxtosym[cnt]->in_dso && ndxtosym[cnt]->defined))
   5866 	    {
   5867 	      symstrent[cnt] = NULL;
   5868 	      continue;
   5869 	    }
   5870 
   5871 	  /* Store the index of the symbol in the dynamic symbol
   5872 	     table.  This is a preliminary value in case we use the
   5873 	     GNU-style hash table.  */
   5874 	  ndxtosym[cnt]->outdynsymidx = nsym_dyn;
   5875 
   5876 	  /* Create a new string table entry.  */
   5877 	  const char *str = ndxtosym[cnt]->name;
   5878 	  symstrent[cnt] = ebl_strtabadd (dynstrtab, str, 0);
   5879 	  if (GENERATE_SYSV_HASH)
   5880 	    hashcodes[nsym_dyn] = elf_hash (str);
   5881 	  if (GENERATE_GNU_HASH)
   5882 	    gnuhashcodes[nsym_dyn] = elf_gnu_hash (str);
   5883 	  ++nsym_dyn;
   5884 	}
   5885 
   5886       if (ld_state.file_type != relocatable_file_type)
   5887 	{
   5888 	  /* Finalize the dynamic string table.  */
   5889 	  ebl_strtabfinalize (dynstrtab, dynstrdata);
   5890 
   5891 	  assert (ld_state.hashscnidx != 0 || ld_state.gnuhashscnidx != 0);
   5892 
   5893 	  /* Create the GNU-style hash table.  */
   5894 	  if (GENERATE_GNU_HASH)
   5895 	    create_gnu_hash (nsym_local, nsym, nsym_dyn, gnuhashcodes);
   5896 
   5897 	  /* Create the SysV-style hash table.  This has to happen
   5898 	     after the GNU-style table is created since
   5899 	     CREATE-GNU-HASH might reorder the dynamic symbol table.  */
   5900 	  if (GENERATE_SYSV_HASH)
   5901 	    create_hash (nsym_local, nsym, nsym_dyn, hashcodes);
   5902 	}
   5903 
   5904 	  /* Add the version information.  */
   5905       if (versymdata != NULL)
   5906 	for (cnt = nsym_local; cnt < nsym; ++cnt)
   5907 	  if (symstrent[cnt] != NULL)
   5908 	    {
   5909 	      struct symbol *symp = ndxtosym[cnt];
   5910 
   5911 	      /* Synthetic symbols (i.e., those with no file attached)
   5912 		 have no version information.  */
   5913 	      if (symp->file != NULL && symp->file->verdefdata != NULL)
   5914 		{
   5915 		  GElf_Versym versym;
   5916 
   5917 		  gelf_getversym (symp->file->versymdata, symp->symidx,
   5918 				  &versym);
   5919 
   5920 		  (void) gelf_update_versym (versymdata, symp->outdynsymidx,
   5921 					     &symp->file->verdefused[versym]);
   5922 		}
   5923 	      else
   5924 		{
   5925 		  /* XXX Add support for version definitions.  */
   5926 		  GElf_Versym global = VER_NDX_GLOBAL;
   5927 		  (void) gelf_update_versym (versymdata, nsym_dyn, &global);
   5928 		}
   5929 	    }
   5930 
   5931       /* Update the information about the symbol section.  */
   5932       if (versymdata != NULL)
   5933 	{
   5934 	  /* Correct the size now that we know how many entries the
   5935 	     dynamic symbol table has.  */
   5936 	  versymdata->d_size = xelf_fsize (ld_state.outelf, ELF_T_HALF,
   5937 					   nsym_dyn);
   5938 
   5939 	  /* Add the reference to the symbol table.  */
   5940 	  xelf_getshdr (versymscn, shdr);
   5941 	  assert (shdr != NULL);
   5942 
   5943 	  shdr->sh_link = ld_state.dynsymscnidx;
   5944 
   5945 	  (void) xelf_update_shdr (versymscn, shdr);
   5946 	}
   5947     }
   5948 
   5949   if (ld_state.file_type != relocatable_file_type)
   5950     {
   5951       /* Now put the names in.  */
   5952       for (cnt = nsym_local; cnt < nsym; ++cnt)
   5953 	if (symstrent[cnt] != NULL)
   5954 	  {
   5955 	    XElf_Sym_vardef (sym);
   5956 	    size_t dynidx = ndxtosym[cnt]->outdynsymidx;
   5957 
   5958 #if NATIVE_ELF != 0
   5959 	    XElf_Sym *osym;
   5960 	    memcpy (xelf_getsym (dynsymdata, dynidx, sym),
   5961 		    xelf_getsym (symdata, cnt, osym),
   5962 		    sizeof (XElf_Sym));
   5963 #else
   5964 	    xelf_getsym (symdata, cnt, sym);
   5965 	    assert (sym != NULL);
   5966 #endif
   5967 
   5968 	    sym->st_name = ebl_strtaboffset (symstrent[cnt]);
   5969 
   5970 	    (void) xelf_update_sym (dynsymdata, dynidx, sym);
   5971 	  }
   5972 
   5973       free (hashcodes);
   5974 
   5975       /* Create the required version section.  */
   5976       if (ld_state.verneedscnidx != 0)
   5977 	{
   5978 	  Elf_Scn *verneedscn;
   5979 	  Elf_Data *verneeddata;
   5980 	  struct usedfiles *runp;
   5981 	  size_t verneed_size = xelf_fsize (ld_state.outelf, ELF_T_VNEED, 1);
   5982 	  size_t vernaux_size = xelf_fsize (ld_state.outelf, ELF_T_VNAUX, 1);
   5983 	  size_t offset;
   5984 	  int ntotal;
   5985 
   5986 	  verneedscn = elf_getscn (ld_state.outelf, ld_state.verneedscnidx);
   5987 	  xelf_getshdr (verneedscn, shdr);
   5988 	  verneeddata = elf_newdata (verneedscn);
   5989 	  if (shdr == NULL || verneeddata == NULL)
   5990 	    error (EXIT_FAILURE, 0,
   5991 		   gettext ("cannot create versioning data: %s"),
   5992 		   elf_errmsg (-1));
   5993 
   5994 	  verneeddata->d_size = (ld_state.nverdeffile * verneed_size
   5995 				 + ld_state.nverdefused * vernaux_size);
   5996 	  verneeddata->d_buf = xmalloc (verneeddata->d_size);
   5997 	  verneeddata->d_type = ELF_T_VNEED;
   5998 	  verneeddata->d_align = xelf_fsize (ld_state.outelf, ELF_T_WORD, 1);
   5999 	  verneeddata->d_off = 0;
   6000 
   6001 	  offset = 0;
   6002 	  ntotal = ld_state.nverdeffile;
   6003 	  runp = ld_state.dsofiles->next;
   6004 	  do
   6005 	    {
   6006 	      offset = create_verneed_data (offset, verneeddata, runp,
   6007 					    &ntotal);
   6008 	      runp = runp->next;
   6009 	    }
   6010 	  while (ntotal > 0 && runp != ld_state.dsofiles->next);
   6011 
   6012 	  if (ntotal > 0)
   6013 	    {
   6014 	      runp = ld_state.needed->next;
   6015 	      do
   6016 		{
   6017 		  offset = create_verneed_data (offset, verneeddata, runp,
   6018 						&ntotal);
   6019 		  runp = runp->next;
   6020 		}
   6021 	      while (ntotal > 0 && runp != ld_state.needed->next);
   6022 	    }
   6023 
   6024 	  assert (offset == verneeddata->d_size);
   6025 
   6026 	  /* Add the needed information to the section header.  */
   6027 	  shdr->sh_link = ld_state.dynstrscnidx;
   6028 	  shdr->sh_info = ld_state.nverdeffile;
   6029 	  (void) xelf_update_shdr (verneedscn, shdr);
   6030 	}
   6031 
   6032       /* Adjust the section size.  */
   6033       dynsymdata->d_size = xelf_fsize (ld_state.outelf, ELF_T_SYM, nsym_dyn);
   6034       if (versymdata != NULL)
   6035 	versymdata->d_size = xelf_fsize (ld_state.outelf, ELF_T_HALF,
   6036 					 nsym_dyn);
   6037 
   6038       /* Add the remaining information to the section header.  */
   6039       xelf_getshdr (dynsymscn, shdr);
   6040       /* There is always exactly one local symbol.  */
   6041       shdr->sh_info = 1;
   6042       /* Reference the string table.  */
   6043       shdr->sh_link = ld_state.dynstrscnidx;
   6044       /* Write the updated info back.  */
   6045       (void) xelf_update_shdr (dynsymscn, shdr);
   6046     }
   6047 
   6048   /* We don't need the string table anymore.  */
   6049   free (symstrent);
   6050 
   6051   /* Remember the total number of symbols in the dynamic symbol table.  */
   6052   ld_state.ndynsym = nsym_dyn;
   6053 
   6054   /* Fill in the section header information.  */
   6055   symscn = elf_getscn (ld_state.outelf, ld_state.symscnidx);
   6056   xelf_getshdr (symscn, shdr);
   6057   if (shdr == NULL)
   6058     error (EXIT_FAILURE, 0,
   6059 	   gettext ("cannot create symbol table for output file: %s"),
   6060 	   elf_errmsg (-1));
   6061 
   6062   shdr->sh_type = SHT_SYMTAB;
   6063   shdr->sh_link = ld_state.strscnidx;
   6064   shdr->sh_info = nsym_local;
   6065   shdr->sh_entsize = xelf_fsize (ld_state.outelf, ELF_T_SYM, 1);
   6066 
   6067   (void) xelf_update_shdr (symscn, shdr);
   6068 
   6069 
   6070   /* Add names for the generated sections.  */
   6071   if (ld_state.symscnidx != 0)
   6072       symtab_ent = ebl_strtabadd (ld_state.shstrtab, ".symtab", 8);
   6073   if (ld_state.xndxscnidx != 0)
   6074     xndx_ent = ebl_strtabadd (ld_state.shstrtab, ".symtab_shndx", 14);
   6075   if (ld_state.strscnidx != 0)
   6076     strtab_ent = ebl_strtabadd (ld_state.shstrtab, ".strtab", 8);
   6077   /* At this point we would have to test for failures in the
   6078      allocation.  But we skip this.  First, the problem will be caught
   6079      later when doing more allocations for the section header table.
   6080      Even if this would not be the case all that would happen is that
   6081      the section names are empty.  The binary would still be usable if
   6082      it is an executable or a DSO.  Not adding the test here saves
   6083      quite a bit of code.  */
   6084 
   6085 
   6086   /* Finally create the section for the section header string table.  */
   6087   shstrtab_scn = elf_newscn (ld_state.outelf);
   6088   shstrtab_ndx = elf_ndxscn (shstrtab_scn);
   6089   if (unlikely (shstrtab_ndx == SHN_UNDEF))
   6090     error (EXIT_FAILURE, 0,
   6091 	   gettext ("cannot create section header string section: %s"),
   6092 	   elf_errmsg (-1));
   6093 
   6094   /* Add the name of the section to the string table.  */
   6095   shstrtab_ent = ebl_strtabadd (ld_state.shstrtab, ".shstrtab", 10);
   6096   if (unlikely (shstrtab_ent == NULL))
   6097     error (EXIT_FAILURE, errno,
   6098 	   gettext ("cannot create section header string section"));
   6099 
   6100   /* Finalize the section header string table.  */
   6101   data = elf_newdata (shstrtab_scn);
   6102   if (data == NULL)
   6103     error (EXIT_FAILURE, 0,
   6104 	   gettext ("cannot create section header string section: %s"),
   6105 	   elf_errmsg (-1));
   6106   ebl_strtabfinalize (ld_state.shstrtab, data);
   6107 
   6108   /* Now we know the string offsets for all section names.  */
   6109   for (cnt = 0; cnt < ld_state.nallsections; ++cnt)
   6110     if (ld_state.allsections[cnt]->scnidx != 0)
   6111       {
   6112 	Elf_Scn *scn;
   6113 
   6114 	scn = elf_getscn (ld_state.outelf, ld_state.allsections[cnt]->scnidx);
   6115 
   6116 	xelf_getshdr (scn, shdr);
   6117 	assert (shdr != NULL);
   6118 
   6119 	shdr->sh_name = ebl_strtaboffset (ld_state.allsections[cnt]->nameent);
   6120 
   6121 	if (xelf_update_shdr (scn, shdr) == 0)
   6122 	  assert (0);
   6123       }
   6124 
   6125   /* Add the names for the generated sections to the respective
   6126      section headers.  */
   6127   if (symtab_ent != NULL)
   6128     {
   6129       Elf_Scn *scn = elf_getscn (ld_state.outelf, ld_state.symscnidx);
   6130 
   6131       xelf_getshdr (scn, shdr);
   6132       /* This cannot fail, we already accessed the header before.  */
   6133       assert (shdr != NULL);
   6134 
   6135       shdr->sh_name = ebl_strtaboffset (symtab_ent);
   6136 
   6137       (void) xelf_update_shdr (scn, shdr);
   6138     }
   6139   if (xndx_ent != NULL)
   6140     {
   6141       Elf_Scn *scn = elf_getscn (ld_state.outelf, ld_state.xndxscnidx);
   6142 
   6143       xelf_getshdr (scn, shdr);
   6144       /* This cannot fail, we already accessed the header before.  */
   6145       assert (shdr != NULL);
   6146 
   6147       shdr->sh_name = ebl_strtaboffset (xndx_ent);
   6148 
   6149       (void) xelf_update_shdr (scn, shdr);
   6150     }
   6151   if (strtab_ent != NULL)
   6152     {
   6153       Elf_Scn *scn = elf_getscn (ld_state.outelf, ld_state.strscnidx);
   6154 
   6155       xelf_getshdr (scn, shdr);
   6156       /* This cannot fail, we already accessed the header before.  */
   6157       assert (shdr != NULL);
   6158 
   6159       shdr->sh_name = ebl_strtaboffset (strtab_ent);
   6160 
   6161       (void) xelf_update_shdr (scn, shdr);
   6162     }
   6163 
   6164   /* And the section header table section itself.  */
   6165   xelf_getshdr (shstrtab_scn, shdr);
   6166   if (shdr == NULL)
   6167     error (EXIT_FAILURE, 0,
   6168 	   gettext ("cannot create section header string section: %s"),
   6169 	   elf_errmsg (-1));
   6170 
   6171   shdr->sh_name = ebl_strtaboffset (shstrtab_ent);
   6172   shdr->sh_type = SHT_STRTAB;
   6173 
   6174   if (unlikely (xelf_update_shdr (shstrtab_scn, shdr) == 0))
   6175     error (EXIT_FAILURE, 0,
   6176 	   gettext ("cannot create section header string section: %s"),
   6177 	   elf_errmsg (-1));
   6178 
   6179 
   6180   /* Add the correct section header info to the section group sections.  */
   6181   groups = ld_state.groups;
   6182   while (groups != NULL)
   6183     {
   6184       Elf_Scn *scn = elf_getscn (ld_state.outelf, groups->outscnidx);
   6185       xelf_getshdr (scn, shdr);
   6186       assert (shdr != NULL);
   6187 
   6188       shdr->sh_name = ebl_strtaboffset (groups->nameent);
   6189       shdr->sh_type = SHT_GROUP;
   6190       shdr->sh_flags = 0;
   6191       shdr->sh_link = ld_state.symscnidx;
   6192       shdr->sh_entsize = sizeof (Elf32_Word);
   6193 
   6194       /* Determine the index for the signature symbol.  */
   6195       Elf32_Word si
   6196 	= groups->symbol->file->symindirect[groups->symbol->symidx];
   6197       if (si == 0)
   6198 	{
   6199 	  assert (groups->symbol->file->symref[groups->symbol->symidx]
   6200 		  != NULL);
   6201 	  si = groups->symbol->file->symref[groups->symbol->symidx]->outsymidx;
   6202 	  assert (si != 0);
   6203 	}
   6204       shdr->sh_info = ld_state.dblindirect[si];
   6205 
   6206       (void) xelf_update_shdr (scn, shdr);
   6207 
   6208       struct scngroup *oldp = groups;
   6209       groups = groups->next;
   6210       free (oldp);
   6211     }
   6212 
   6213 
   6214   if (ld_state.file_type != relocatable_file_type)
   6215     {
   6216       /* Every executable needs a program header.  The number of entries
   6217 	 varies.  One exists for each segment.  Each SHT_NOTE section gets
   6218 	 one, too.  For dynamically linked executables we have to create
   6219 	 one for the program header, the interpreter, and the dynamic
   6220 	 section.  First count the number of segments.
   6221 
   6222 	 XXX Determine whether the segment is non-empty.  */
   6223       size_t nphdr = 0;
   6224 
   6225       /* We always add a PT_GNU_stack entry.  */
   6226       ++nphdr;
   6227 
   6228       struct output_segment *segment = ld_state.output_segments;
   6229       while (segment != NULL)
   6230 	{
   6231 	  ++nphdr;
   6232 	  segment = segment->next;
   6233 	}
   6234 
   6235       /* Add the number of SHT_NOTE sections.  We counted them earlier.  */
   6236       nphdr += ld_state.nnotesections;
   6237 
   6238       /* If we create a DSO or the file is linked against DSOs we have
   6239 	 at least one more entry: DYNAMIC.  If an interpreter is
   6240 	 specified we add PHDR and INTERP, too.  */
   6241       if (dynamically_linked_p ())
   6242 	{
   6243 	  ++nphdr;
   6244 
   6245 	  if (ld_state.interp != NULL || ld_state.file_type != dso_file_type)
   6246 	    nphdr += 2;
   6247 	}
   6248 
   6249       /* If we need a TLS segment we need an entry for that.  */
   6250       if (ld_state.need_tls)
   6251 	++nphdr;
   6252 
   6253       /* Create the program header structure.  */
   6254       XElf_Phdr_vardef (phdr);
   6255       if (xelf_newphdr (ld_state.outelf, nphdr) == 0)
   6256 	error (EXIT_FAILURE, 0, gettext ("cannot create program header: %s"),
   6257 	       elf_errmsg (-1));
   6258 
   6259 
   6260       /* Determine the section sizes and offsets.  We have to do this
   6261 	 to be able to determine the memory layout (which normally
   6262 	 differs from the file layout).  */
   6263       if (elf_update (ld_state.outelf, ELF_C_NULL) == -1)
   6264 	error (EXIT_FAILURE, 0, gettext ("while determining file layout: %s"),
   6265 	       elf_errmsg (-1));
   6266 
   6267 
   6268       /* Now determine the memory addresses of all the sections and
   6269 	 segments.  */
   6270       Elf32_Word nsec = 0;
   6271       Elf_Scn *scn = elf_getscn (ld_state.outelf,
   6272 				 ld_state.allsections[nsec]->scnidx);
   6273       xelf_getshdr (scn, shdr);
   6274       assert (shdr != NULL);
   6275 
   6276       /* The address we start with is the offset of the first (not
   6277 	 zeroth) section.  */
   6278       XElf_Addr addr = shdr->sh_offset;
   6279       XElf_Addr tls_offset = 0;
   6280       XElf_Addr tls_start = ~((XElf_Addr) 0);
   6281       XElf_Addr tls_end = 0;
   6282       XElf_Off tls_filesize = 0;
   6283       XElf_Addr tls_align = 0;
   6284 
   6285       /* The index of the first loadable segment.  */
   6286       nphdr = 0;
   6287       if (dynamically_linked_p ())
   6288 	{
   6289 	  ++nphdr;
   6290 	  if (ld_state.interp != NULL
   6291 	      || ld_state.file_type != dso_file_type)
   6292 	    nphdr += 2;
   6293 	}
   6294 
   6295       segment = ld_state.output_segments;
   6296       while (segment != NULL)
   6297 	{
   6298 	  struct output_rule *orule;
   6299 	  bool first_section = true;
   6300 	  XElf_Off nobits_size = 0;
   6301 	  XElf_Off memsize = 0;
   6302 
   6303 	  /* The minimum alignment is a page size.  */
   6304 	  segment->align = ld_state.pagesize;
   6305 
   6306 	  for (orule = segment->output_rules; orule != NULL;
   6307 	       orule = orule->next)
   6308 	    if (orule->tag == output_section)
   6309 	      {
   6310 		/* See whether this output rule corresponds to the next
   6311 		   section.  Yes, this is a pointer comparison.  */
   6312 		if (ld_state.allsections[nsec]->name
   6313 		    != orule->val.section.name)
   6314 		  /* No, ignore this output rule.  */
   6315 		  continue;
   6316 
   6317 		/* We assign addresses only in segments which are actually
   6318 		   loaded.  */
   6319 		if (segment->mode != 0)
   6320 		  {
   6321 		    /* Adjust the offset of the input sections.  */
   6322 		    struct scninfo *isect;
   6323 		    struct scninfo *first;
   6324 
   6325 		    isect = first = ld_state.allsections[nsec]->last;
   6326 		    if (isect != NULL)
   6327 		      do
   6328 			isect->offset += addr;
   6329 		      while ((isect = isect->next) != first);
   6330 
   6331 		    /* Set the address of current section.  */
   6332 		    shdr->sh_addr = addr;
   6333 
   6334 		    /* Write the result back.  */
   6335 		    (void) xelf_update_shdr (scn, shdr);
   6336 
   6337 		    /* Remember the address.  */
   6338 		    ld_state.allsections[nsec]->addr = addr;
   6339 
   6340 		    /* Handle TLS sections.  */
   6341 		    if (unlikely (shdr->sh_flags & SHF_TLS))
   6342 		      {
   6343 			if (tls_start > addr)
   6344 			  {
   6345 			    tls_start = addr;
   6346 			    tls_offset = shdr->sh_offset;
   6347 			  }
   6348 			if (tls_end < addr + shdr->sh_size)
   6349 			  tls_end = addr + shdr->sh_size;
   6350 			if (shdr->sh_type != SHT_NOBITS)
   6351 			  tls_filesize += shdr->sh_size;
   6352 			if (shdr->sh_addralign > tls_align)
   6353 			  tls_align = shdr->sh_addralign;
   6354 		      }
   6355 		  }
   6356 
   6357 		if (first_section)
   6358 		  {
   6359 		    /* The first segment starts at offset zero.  */
   6360 		    if (segment == ld_state.output_segments)
   6361 		      {
   6362 			segment->offset = 0;
   6363 			segment->addr = addr - shdr->sh_offset;
   6364 		      }
   6365 		    else
   6366 		      {
   6367 			segment->offset = shdr->sh_offset;
   6368 			segment->addr = addr;
   6369 		      }
   6370 
   6371 		    /* Determine the maximum alignment requirement.  */
   6372 		    segment->align = MAX (segment->align, shdr->sh_addralign);
   6373 
   6374 		    first_section = false;
   6375 		  }
   6376 
   6377 		/* NOBITS TLS sections are not laid out in address space
   6378 		   along with the other sections.  */
   6379 		if (shdr->sh_type != SHT_NOBITS
   6380 		    || (shdr->sh_flags & SHF_TLS) == 0)
   6381 		  {
   6382 		    memsize = (shdr->sh_offset - segment->offset
   6383 			       + shdr->sh_size);
   6384 		    if (nobits_size != 0 && shdr->sh_type != SHT_NOTE)
   6385 		      error (EXIT_FAILURE, 0, gettext ("\
   6386 internal error: non-nobits section follows nobits section"));
   6387 		    if (shdr->sh_type == SHT_NOBITS)
   6388 		      nobits_size += shdr->sh_size;
   6389 		  }
   6390 
   6391 		/* Determine the new address which is computed using
   6392 		   the difference of the offsets on the sections.  Note
   6393 		   that this assumes that the sections following each
   6394 		   other in the section header table are also
   6395 		   consecutive in the file.  This is true here because
   6396 		   libelf constructs files this way.  */
   6397 		XElf_Off oldoff = shdr->sh_offset;
   6398 
   6399 		if (++nsec >= ld_state.nallsections)
   6400 		  break;
   6401 
   6402 		scn = elf_getscn (ld_state.outelf,
   6403 				  ld_state.allsections[nsec]->scnidx);
   6404 		xelf_getshdr (scn, shdr);
   6405 		assert (shdr != NULL);
   6406 
   6407 		/* This is the new address resulting from the offsets
   6408 		   in the file.  */
   6409 		assert (oldoff <= shdr->sh_offset);
   6410 		addr += shdr->sh_offset - oldoff;
   6411 	      }
   6412 	    else
   6413 	      {
   6414 		assert (orule->tag == output_assignment);
   6415 
   6416 		if (strcmp (orule->val.assignment->variable, ".") == 0)
   6417 		  /* This is a change of the address.  */
   6418 		  addr = eval_expression (orule->val.assignment->expression,
   6419 					  addr);
   6420 		else if (orule->val.assignment->sym != NULL)
   6421 		  {
   6422 		    /* This symbol is used.  Update the symbol table
   6423 		       entry.  */
   6424 		    XElf_Sym_vardef (sym);
   6425 		    size_t idx;
   6426 
   6427 		    /* Note that we do not have to use
   6428 		       xelf_getsymshndx since we only update the
   6429 		       symbol address, not the section
   6430 		       information.  */
   6431 		    idx = dblindirect[orule->val.assignment->sym->outsymidx];
   6432 		    xelf_getsym (symdata, idx, sym);
   6433 		    sym->st_value = addr;
   6434 		    (void) xelf_update_sym (symdata, idx, sym);
   6435 
   6436 		    idx = orule->val.assignment->sym->outdynsymidx;
   6437 		    if (idx != 0)
   6438 		      {
   6439 			assert (dynsymdata != NULL);
   6440 			xelf_getsym (dynsymdata, idx, sym);
   6441 			sym->st_value = addr;
   6442 			(void) xelf_update_sym (dynsymdata, idx, sym);
   6443 		      }
   6444 		  }
   6445 	      }
   6446 
   6447 	  /* Store the segment parameter for loadable segments.  */
   6448 	  if (segment->mode != 0)
   6449 	    {
   6450 	      xelf_getphdr_ptr (ld_state.outelf, nphdr, phdr);
   6451 
   6452 	      phdr->p_type = PT_LOAD;
   6453 	      phdr->p_offset = segment->offset;
   6454 	      phdr->p_vaddr = segment->addr;
   6455 	      phdr->p_paddr = phdr->p_vaddr;
   6456 	      phdr->p_filesz = memsize - nobits_size;
   6457 	      phdr->p_memsz = memsize;
   6458 	      phdr->p_flags = segment->mode;
   6459 	      phdr->p_align = segment->align;
   6460 
   6461 	      (void) xelf_update_phdr (ld_state.outelf, nphdr, phdr);
   6462 	      ++nphdr;
   6463 	    }
   6464 
   6465 	  segment = segment->next;
   6466 	}
   6467 
   6468       /* Create the other program header entries.  */
   6469       xelf_getehdr (ld_state.outelf, ehdr);
   6470       assert (ehdr != NULL);
   6471 
   6472       /* Add the TLS information.  */
   6473       if (ld_state.need_tls)
   6474 	{
   6475 	  xelf_getphdr_ptr (ld_state.outelf, nphdr, phdr);
   6476 	  phdr->p_type = PT_TLS;
   6477 	  phdr->p_offset = tls_offset;
   6478 	  phdr->p_vaddr = tls_start;
   6479 	  phdr->p_paddr = tls_start;
   6480 	  phdr->p_filesz = tls_filesize;
   6481 	  phdr->p_memsz = tls_end - tls_start;
   6482 	  phdr->p_flags = PF_R;
   6483 	  phdr->p_align = tls_align;
   6484 	  ld_state.tls_tcb = tls_end;
   6485 	  ld_state.tls_start = tls_start;
   6486 
   6487 	  (void) xelf_update_phdr (ld_state.outelf, nphdr, phdr);
   6488 	  ++nphdr;
   6489 	}
   6490 
   6491       /* Add the stack information.  */
   6492       xelf_getphdr_ptr (ld_state.outelf, nphdr, phdr);
   6493       phdr->p_type = PT_GNU_STACK;
   6494       phdr->p_offset = 0;
   6495       phdr->p_vaddr = 0;
   6496       phdr->p_paddr = 0;
   6497       phdr->p_filesz = 0;
   6498       phdr->p_memsz = 0;
   6499       phdr->p_flags = (PF_R | PF_W
   6500 		       | (ld_state.execstack == execstack_true ? PF_X : 0));
   6501       phdr->p_align = xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1);
   6502 
   6503       (void) xelf_update_phdr (ld_state.outelf, nphdr, phdr);
   6504       ++nphdr;
   6505 
   6506 
   6507       /* Adjust the addresses in the address fields of the symbol
   6508 	 records according to the load addresses of the sections.  */
   6509       if (ld_state.need_symtab)
   6510 	for (cnt = 1; cnt < nsym; ++cnt)
   6511 	  {
   6512 	    XElf_Sym_vardef (sym);
   6513 	    Elf32_Word shndx;
   6514 
   6515 	    xelf_getsymshndx (symdata, xndxdata, cnt, sym, shndx);
   6516 	    assert (sym != NULL);
   6517 
   6518 	    if (sym->st_shndx != SHN_XINDEX)
   6519 	      shndx = sym->st_shndx;
   6520 
   6521 	    if ((shndx > SHN_UNDEF && shndx < SHN_LORESERVE)
   6522 		|| shndx > SHN_HIRESERVE)
   6523 	      {
   6524 		/* Note we subtract 1 from the section index since ALLSECTIONS
   6525 		   does not store the dummy section with offset zero.  */
   6526 		sym->st_value += ld_state.allsections[shndx - 1]->addr;
   6527 
   6528 		/* We don't have to use 'xelf_update_symshndx' since the
   6529 		   section number doesn't change.  */
   6530 		(void) xelf_update_sym (symdata, cnt, sym);
   6531 	      }
   6532 	  }
   6533 
   6534       if (ld_state.need_dynsym)
   6535 	for (cnt = 1; cnt < nsym_dyn; ++cnt)
   6536 	  {
   6537 	    XElf_Sym_vardef (sym);
   6538 
   6539 	    xelf_getsym (dynsymdata, cnt, sym);
   6540 	    assert (sym != NULL);
   6541 
   6542 	    if (sym->st_shndx > SHN_UNDEF && sym->st_shndx < SHN_LORESERVE)
   6543 	      {
   6544 		/* Note we subtract 1 from the section index since ALLSECTIONS
   6545 		   does not store the dummy section with offset zero.  */
   6546 		sym->st_value += ld_state.allsections[sym->st_shndx - 1]->addr;
   6547 
   6548 		/* We don't have to use 'xelf_update_symshndx' since the
   6549 		   section number doesn't change.  */
   6550 		(void) xelf_update_sym (dynsymdata, cnt, sym);
   6551 	      }
   6552 	  }
   6553 
   6554       /* Now is a good time to determine the values of all the symbols
   6555 	 we encountered.  */
   6556       // XXX This loop is very inefficient.  The hash tab iterator also
   6557       // returns all symbols in DSOs.
   6558       struct symbol *se;
   6559       void *p = NULL;
   6560       while ((se = ld_symbol_tab_iterate (&ld_state.symbol_tab, &p)) != NULL)
   6561 	if (! se->in_dso)
   6562 	  {
   6563 	    XElf_Sym_vardef (sym);
   6564 
   6565 	    addr = 0;
   6566 
   6567 	    if (se->outdynsymidx != 0)
   6568 	      {
   6569 		xelf_getsym (dynsymdata, se->outdynsymidx, sym);
   6570 		assert (sym != NULL);
   6571 		addr = sym->st_value;
   6572 	      }
   6573 	    else if (se->outsymidx != 0)
   6574 	      {
   6575 		assert (dblindirect[se->outsymidx] != 0);
   6576 		xelf_getsym (symdata, dblindirect[se->outsymidx], sym);
   6577 		assert (sym != NULL);
   6578 		addr = sym->st_value;
   6579 	      }
   6580 	    else
   6581 	      abort ();
   6582 
   6583 	    se->merge.value = addr;
   6584 	  }
   6585 
   6586       /* Complete the header of the .rel.dyn/.rela.dyn section.  Point
   6587 	 to the symbol table.  The sh_info field is left zero since
   6588 	 there is no specific section the contained relocations are
   6589 	 for.  */
   6590       if (ld_state.reldynscnidx != 0)
   6591 	{
   6592 	  assert (ld_state.dynsymscnidx != 0);
   6593 	  scn = elf_getscn (ld_state.outelf, ld_state.reldynscnidx);
   6594 	  xelf_getshdr (scn, shdr);
   6595 	  assert (shdr != NULL);
   6596 
   6597 	  shdr->sh_link = ld_state.dynsymscnidx;
   6598 
   6599 	  (void) xelf_update_shdr (scn, shdr);
   6600 	}
   6601 
   6602       /* Fill in the dynamic segment/section.  */
   6603       if (dynamically_linked_p ())
   6604 	{
   6605 	  Elf_Scn *outscn;
   6606 
   6607 	  int idx = 0;
   6608 	  if (ld_state.interp != NULL || ld_state.file_type != dso_file_type)
   6609 	    {
   6610 	      assert (ld_state.interpscnidx != 0);
   6611 	      xelf_getshdr (elf_getscn (ld_state.outelf,
   6612 					ld_state.interpscnidx), shdr);
   6613 	      assert (shdr != NULL);
   6614 
   6615 	      xelf_getphdr_ptr (ld_state.outelf, idx, phdr);
   6616 	      phdr->p_type = PT_PHDR;
   6617 	      phdr->p_offset = ehdr->e_phoff;
   6618 	      phdr->p_vaddr = ld_state.output_segments->addr + phdr->p_offset;
   6619 	      phdr->p_paddr = phdr->p_vaddr;
   6620 	      phdr->p_filesz = ehdr->e_phnum * ehdr->e_phentsize;
   6621 	      phdr->p_memsz = phdr->p_filesz;
   6622 	      phdr->p_flags = 0;	/* No need to set PF_R or so.  */
   6623 	      phdr->p_align = xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1);
   6624 
   6625 	      (void) xelf_update_phdr (ld_state.outelf, idx, phdr);
   6626 	      ++idx;
   6627 
   6628 	      /* The interpreter string.  */
   6629 	      xelf_getphdr_ptr (ld_state.outelf, idx, phdr);
   6630 	      phdr->p_type = PT_INTERP;
   6631 	      phdr->p_offset = shdr->sh_offset;
   6632 	      phdr->p_vaddr = shdr->sh_addr;
   6633 	      phdr->p_paddr = phdr->p_vaddr;
   6634 	      phdr->p_filesz = shdr->sh_size;
   6635 	      phdr->p_memsz = phdr->p_filesz;
   6636 	      phdr->p_flags = 0;	/* No need to set PF_R or so.  */
   6637 	      phdr->p_align = 1;	/* It's a string.  */
   6638 
   6639 	      (void) xelf_update_phdr (ld_state.outelf, idx, phdr);
   6640 	      ++idx;
   6641 	    }
   6642 
   6643 	  /* The pointer to the dynamic section.  We this we need to
   6644 	     get the information for the dynamic section first.  */
   6645 	  assert (ld_state.dynamicscnidx);
   6646 	  outscn = elf_getscn (ld_state.outelf, ld_state.dynamicscnidx);
   6647 	  xelf_getshdr (outscn, shdr);
   6648 	  assert (shdr != NULL);
   6649 
   6650 	  xelf_getphdr_ptr (ld_state.outelf, idx, phdr);
   6651 	  phdr->p_type = PT_DYNAMIC;
   6652 	  phdr->p_offset = shdr->sh_offset;
   6653 	  phdr->p_vaddr = shdr->sh_addr;
   6654 	  phdr->p_paddr = phdr->p_vaddr;
   6655 	  phdr->p_filesz = shdr->sh_size;
   6656 	  phdr->p_memsz = phdr->p_filesz;
   6657 	  phdr->p_flags = 0;		/* No need to set PF_R or so.  */
   6658 	  phdr->p_align = shdr->sh_addralign;
   6659 
   6660 	  (void) xelf_update_phdr (ld_state.outelf, idx, phdr);
   6661 
   6662 	  /* Fill in the reference to the .dynstr section.  */
   6663 	  assert (ld_state.dynstrscnidx != 0);
   6664 	  shdr->sh_link = ld_state.dynstrscnidx;
   6665 	  (void) xelf_update_shdr (outscn, shdr);
   6666 
   6667 	  /* And fill the remaining entries.  */
   6668 	  Elf_Data *dyndata = elf_getdata (outscn, NULL);
   6669 	  assert (dyndata != NULL);
   6670 
   6671 	  /* Add the DT_NEEDED entries.  */
   6672 	  if (ld_state.ndsofiles > 0)
   6673 	    {
   6674 	      struct usedfiles *runp = ld_state.dsofiles->next;
   6675 
   6676 	      do
   6677 		if (runp->used || !runp->as_needed)
   6678 		  {
   6679 		    /* Add the position-dependent flag if necessary.  */
   6680 		    if (runp->lazyload)
   6681 		      new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6682 					 DT_POSFLAG_1, DF_P1_LAZYLOAD);
   6683 
   6684 		    new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6685 				       DT_NEEDED,
   6686 				       ebl_strtaboffset (runp->sonameent));
   6687 		  }
   6688 	      while ((runp = runp->next) != ld_state.dsofiles->next);
   6689 	    }
   6690 
   6691 	  /* We can finish the DT_RUNPATH/DT_RPATH entries now.  */
   6692 	  if (ld_state.rxxpath_strent != NULL)
   6693 	    new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6694 			       ld_state.rxxpath_tag,
   6695 			       ebl_strtaboffset (ld_state.rxxpath_strent));
   6696 
   6697 	  /* Reference to initialization and finalization functions.  */
   6698 	  // XXX This code depends on symbol table being relocated.
   6699 	  if (ld_state.init_symbol != NULL)
   6700 	    {
   6701 	      XElf_Sym_vardef (sym);
   6702 
   6703 	      if (ld_state.need_symtab)
   6704 		xelf_getsym (symdata,
   6705 			     dblindirect[ld_state.init_symbol->outsymidx],
   6706 			     sym);
   6707 	      else
   6708 		xelf_getsym (dynsymdata, ld_state.init_symbol->outdynsymidx,
   6709 			     sym);
   6710 	      assert (sym != NULL);
   6711 
   6712 	      new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6713 				 DT_INIT, sym->st_value);
   6714 	    }
   6715 	  if (ld_state.fini_symbol != NULL)
   6716 	    {
   6717 	      XElf_Sym_vardef (sym);
   6718 
   6719 	      if (ld_state.need_symtab)
   6720 		xelf_getsym (symdata,
   6721 			     dblindirect[ld_state.fini_symbol->outsymidx],
   6722 			     sym);
   6723 	      else
   6724 		xelf_getsym (dynsymdata, ld_state.fini_symbol->outdynsymidx,
   6725 			     sym);
   6726 	      assert (sym != NULL);
   6727 
   6728 	      new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6729 				 DT_FINI, sym->st_value);
   6730 	    }
   6731 	  // XXX Support init,fini,preinit arrays
   6732 
   6733 	  /* The hash table which comes with dynamic symbol table.  */
   6734 	  xelf_getshdr (elf_getscn (ld_state.outelf, ld_state.hashscnidx),
   6735 			shdr);
   6736 	  assert (shdr != NULL);
   6737 	  new_dynamic_entry (dyndata, ld_state.ndynamic_filled++, DT_HASH,
   6738 			     shdr->sh_addr);
   6739 
   6740 	  /* Reference to the symbol table section.  */
   6741 	  assert (ld_state.dynsymscnidx != 0);
   6742 	  xelf_getshdr (elf_getscn (ld_state.outelf, ld_state.dynsymscnidx),
   6743 			shdr);
   6744 	  assert (shdr != NULL);
   6745 	  new_dynamic_entry (dyndata, ld_state.ndynamic_filled++, DT_SYMTAB,
   6746 			     shdr->sh_addr);
   6747 
   6748 	  new_dynamic_entry (dyndata, ld_state.ndynamic_filled++, DT_SYMENT,
   6749 			     xelf_fsize (ld_state.outelf, ELF_T_SYM, 1));
   6750 
   6751 	  /* And the string table which comes with it.  */
   6752 	  xelf_getshdr (elf_getscn (ld_state.outelf, ld_state.dynstrscnidx),
   6753 			shdr);
   6754 	  assert (shdr != NULL);
   6755 	  new_dynamic_entry (dyndata, ld_state.ndynamic_filled++, DT_STRTAB,
   6756 			     shdr->sh_addr);
   6757 
   6758 	  new_dynamic_entry (dyndata, ld_state.ndynamic_filled++, DT_STRSZ,
   6759 			     shdr->sh_size);
   6760 
   6761 	  /* Add the entries related to the .plt.  */
   6762 	  if (ld_state.nplt > 0)
   6763 	    {
   6764 	      // XXX Make this work if there is no PLT
   6765 	      xelf_getshdr (elf_getscn (ld_state.outelf,
   6766 					ld_state.gotpltscnidx), shdr);
   6767 	      assert (shdr != NULL);
   6768 	      new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6769 				 // XXX This should probably be machine
   6770 				 // dependent.
   6771 				 DT_PLTGOT, shdr->sh_addr);
   6772 
   6773 	      xelf_getshdr (elf_getscn (ld_state.outelf,
   6774 					ld_state.pltrelscnidx), shdr);
   6775 	      assert (shdr != NULL);
   6776 	      new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6777 				 DT_PLTRELSZ, shdr->sh_size);
   6778 
   6779 	      new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6780 				 DT_JMPREL, shdr->sh_addr);
   6781 
   6782 	      new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6783 				 DT_PLTREL, REL_TYPE (statep));
   6784 	    }
   6785 
   6786 	  if (ld_state.relsize_total > 0)
   6787 	    {
   6788 	      int rel = REL_TYPE (statep);
   6789 	      xelf_getshdr (elf_getscn (ld_state.outelf,
   6790 					ld_state.reldynscnidx), shdr);
   6791 	      assert (shdr != NULL);
   6792 	      new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6793 				 rel, shdr->sh_addr);
   6794 
   6795 	      /* Trick ahead.  Use arithmetic to get the right tag.
   6796 		 We check the validity of this assumption in the asserts.  */
   6797 	      assert (DT_RELASZ - DT_RELA == 1);
   6798 	      assert (DT_RELSZ - DT_REL == 1);
   6799 	      new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6800 				 rel + 1, shdr->sh_size);
   6801 
   6802 	      /* Similar for the entry size tag.  */
   6803 	      assert (DT_RELAENT - DT_RELA == 2);
   6804 	      assert (DT_RELENT - DT_REL == 2);
   6805 	      new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6806 				 rel + 2,
   6807 				 rel == DT_REL
   6808 				 ? xelf_fsize (ld_state.outelf, ELF_T_REL, 1)
   6809 				 : xelf_fsize (ld_state.outelf, ELF_T_RELA,
   6810 					       1));
   6811 	    }
   6812 
   6813 	  if (ld_state.verneedscnidx != 0)
   6814 	    {
   6815 	      xelf_getshdr (elf_getscn (ld_state.outelf,
   6816 					ld_state.verneedscnidx), shdr);
   6817 	      assert (shdr != NULL);
   6818 	      new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6819 				 DT_VERNEED, shdr->sh_addr);
   6820 
   6821 	      new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6822 				 DT_VERNEEDNUM, ld_state.nverdeffile);
   6823 	    }
   6824 
   6825 	  if (ld_state.versymscnidx != 0)
   6826 	    {
   6827 	      xelf_getshdr (elf_getscn (ld_state.outelf,
   6828 					ld_state.versymscnidx), shdr);
   6829 	      assert (shdr != NULL);
   6830 	      new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6831 				 DT_VERSYM, shdr->sh_addr);
   6832 	    }
   6833 
   6834 	  /* We always create the DT_DEBUG entry.  */
   6835 	  new_dynamic_entry (dyndata, ld_state.ndynamic_filled++, DT_DEBUG, 0);
   6836 	  assert (ld_state.ndynamic_filled < ld_state.ndynamic);
   6837 
   6838 	  /* Add the flag words if necessary.  */
   6839 	  if (ld_state.dt_flags != 0)
   6840 	    new_dynamic_entry (dyndata, ld_state.ndynamic_filled++, DT_FLAGS,
   6841 			       ld_state.dt_flags);
   6842 
   6843 	  /* Create entry for the DT_FLAGS_1 flag.  */
   6844 	  if (ld_state.dt_flags_1 != 0)
   6845 	    new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6846 			       DT_FLAGS_1, ld_state.dt_flags_1);
   6847 
   6848 	  /* Create entry for the DT_FEATURE_1 flag.  */
   6849 	  if (ld_state.dt_feature_1 != 0)
   6850 	    new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
   6851 			       DT_FEATURE_1, ld_state.dt_feature_1);
   6852 
   6853 	  assert (ld_state.ndynamic_filled <= ld_state.ndynamic);
   6854 	}
   6855     }
   6856 
   6857 
   6858   // XXX The following code isn't nice.  We use two different
   6859   // mechanisms to handle relocations, one for relocatable files, one
   6860   // for executables and DSOs.  Maybe this is the best method but also
   6861   // maybe it can be somewhat unified.
   6862 
   6863   /* Now that we created the symbol table we can add the reference to
   6864      it in the sh_link field of the section headers of the relocation
   6865      sections.  */
   6866   while (rellist != NULL)
   6867     {
   6868       assert (ld_state.file_type == relocatable_file_type);
   6869       Elf_Scn *outscn;
   6870 
   6871       outscn = elf_getscn (ld_state.outelf, rellist->scnidx);
   6872       xelf_getshdr (outscn, shdr);
   6873       /* This must not fail since we did it before.  */
   6874       assert (shdr != NULL);
   6875 
   6876       /* Remember the symbol table which belongs to the relocation section.  */
   6877       shdr->sh_link = ld_state.symscnidx;
   6878 
   6879       /* And the reference to the section which is relocated by this
   6880 	 relocation section.  We use the info from the first input
   6881 	 section but all records should have the same information.  */
   6882       shdr->sh_info =
   6883 	rellist->scninfo->fileinfo->scninfo[SCNINFO_SHDR (rellist->scninfo->shdr).sh_info].outscnndx;
   6884 
   6885 
   6886       /* Perform the actual relocations.  We only have to adjust
   6887 	 offsets and symbol indices.  */
   6888       RELOCATE_SECTION (statep, outscn, rellist->scninfo, dblindirect);
   6889 
   6890       /* Store the changes.  */
   6891       (void) xelf_update_shdr (outscn, shdr);
   6892 
   6893       /* Up to the next relocation section.  */
   6894       rellist = rellist->next;
   6895     }
   6896 
   6897   if (ld_state.rellist != NULL)
   6898     {
   6899       assert (ld_state.file_type != relocatable_file_type);
   6900       /* Create the relocations for the output file.  */
   6901       CREATE_RELOCATIONS (statep, dblindirect);
   6902     }
   6903 
   6904 
   6905   /* We need the ELF header once more.  */
   6906   xelf_getehdr (ld_state.outelf, ehdr);
   6907   assert (ehdr != NULL);
   6908 
   6909   /* Set the section header string table index.  */
   6910   if (likely (shstrtab_ndx < SHN_HIRESERVE)
   6911       && likely (shstrtab_ndx != SHN_XINDEX))
   6912     ehdr->e_shstrndx = shstrtab_ndx;
   6913   else
   6914     {
   6915       /* We have to put the section index in the sh_link field of the
   6916 	 zeroth section header.  */
   6917       Elf_Scn *scn = elf_getscn (ld_state.outelf, 0);
   6918 
   6919       xelf_getshdr (scn, shdr);
   6920       if (unlikely (shdr == NULL))
   6921 	error (EXIT_FAILURE, 0,
   6922 	       gettext ("cannot get header of 0th section: %s"),
   6923 	       elf_errmsg (-1));
   6924 
   6925       shdr->sh_link = shstrtab_ndx;
   6926 
   6927       (void) xelf_update_shdr (scn, shdr);
   6928 
   6929       ehdr->e_shstrndx = SHN_XINDEX;
   6930     }
   6931 
   6932   if (ld_state.file_type != relocatable_file_type)
   6933     /* DSOs and executables have to define the entry point symbol.  */
   6934     ehdr->e_entry = find_entry_point ();
   6935 
   6936   if (unlikely (xelf_update_ehdr (ld_state.outelf, ehdr) == 0))
   6937     error (EXIT_FAILURE, 0,
   6938 	   gettext ("cannot update ELF header: %s"),
   6939 	   elf_errmsg (-1));
   6940 
   6941 
   6942   /* Free the data which we don't need anymore.  */
   6943   free (ld_state.dblindirect);
   6944 
   6945 
   6946   /* Finalize the .plt section and what else belongs to it.  */
   6947   FINALIZE_PLT (statep, nsym, nsym_local, ndxtosym);
   6948 
   6949 
   6950   /* Finally, if we have to compute the build ID.  */
   6951   if (ld_state.build_id != NULL)
   6952     compute_build_id ();
   6953 
   6954 
   6955   /* We don't need the map from the symbol table index to the symbol
   6956      structure anymore.  */
   6957   free (ndxtosym);
   6958 
   6959   return 0;
   6960 }
   6961 
   6962 
   6963 /* This is a function which must be specified in all backends.  */
   6964 static void
   6965 ld_generic_relocate_section (struct ld_state *statep, Elf_Scn *outscn,
   6966 			     struct scninfo *firstp,
   6967 			     const Elf32_Word *dblindirect)
   6968 {
   6969   error (EXIT_FAILURE, 0, gettext ("\
   6970 linker backend didn't specify function to relocate section"));
   6971   /* NOTREACHED */
   6972 }
   6973 
   6974 
   6975 /* Finalize the output file.  */
   6976 static int
   6977 ld_generic_finalize (struct ld_state *statep)
   6978 {
   6979   /* Write out the ELF file data.  */
   6980   if (elf_update (ld_state.outelf, ELF_C_WRITE) == -1)
   6981       error (EXIT_FAILURE, 0, gettext ("while writing output file: %s"),
   6982 	     elf_errmsg (-1));
   6983 
   6984   /* Free the resources.  */
   6985   if (elf_end (ld_state.outelf) != 0)
   6986     error (EXIT_FAILURE, 0, gettext ("while finishing output file: %s"),
   6987 	   elf_errmsg (-1));
   6988 
   6989   /* Get the file status of the temporary file.  */
   6990   struct stat temp_st;
   6991   if (fstat (ld_state.outfd, &temp_st) != 0)
   6992     error (EXIT_FAILURE, errno, gettext ("cannot stat output file"));
   6993 
   6994   /* Now it's time to rename the file.  Remove an old existing file
   6995      first.  */
   6996   if (rename (ld_state.tempfname, ld_state.outfname) != 0)
   6997     /* Something went wrong.  */
   6998     error (EXIT_FAILURE, errno, gettext ("cannot rename output file"));
   6999 
   7000   /* Make sure the output file is really the one we created.  */
   7001   struct stat new_st;
   7002   if (stat (ld_state.outfname, &new_st) != 0
   7003       || new_st.st_ino != temp_st.st_ino
   7004       || new_st.st_dev != temp_st.st_dev)
   7005     {
   7006       /* Wow, somebody overwrote the output file, probably some intruder.  */
   7007       unlink (ld_state.outfname);
   7008       error (EXIT_FAILURE, 0, gettext ("\
   7009 WARNING: temporary output file overwritten before linking finished"));
   7010     }
   7011 
   7012   /* Close the file descriptor.  */
   7013   (void) close (ld_state.outfd);
   7014 
   7015   /* Signal the cleanup handler that the file is correctly created.  */
   7016   ld_state.tempfname = NULL;
   7017 
   7018   return 0;
   7019 }
   7020 
   7021 
   7022 static bool
   7023 ld_generic_special_section_number_p (struct ld_state *statep, size_t number)
   7024 {
   7025   /* There are no special section numbers in the gABI.  */
   7026   return false;
   7027 }
   7028 
   7029 
   7030 static bool
   7031 ld_generic_section_type_p (struct ld_state *statep, GElf_Word type)
   7032 {
   7033   if (type < SHT_NUM
   7034       /* XXX Enable the following two when implemented.  */
   7035       // || type == SHT_GNU_LIBLIST
   7036       // || type == SHT_CHECKSUM
   7037       /* XXX Eventually include SHT_SUNW_move, SHT_SUNW_COMDAT, and
   7038 	 SHT_SUNW_syminfo.  */
   7039       || (type >= SHT_GNU_verdef && type <= SHT_GNU_versym))
   7040     return true;
   7041 
   7042   return false;
   7043 }
   7044 
   7045 
   7046 static XElf_Xword
   7047 ld_generic_dynamic_section_flags (struct ld_state *statep)
   7048 {
   7049   /* By default the .dynamic section is writable (and is of course
   7050      loaded).  Few architecture differ from this.  */
   7051   return SHF_ALLOC | SHF_WRITE;
   7052 }
   7053 
   7054 
   7055 static void
   7056 ld_generic_initialize_plt (struct ld_state *statep, Elf_Scn *scn)
   7057 {
   7058   /* This cannot be implemented generally.  There should have been a
   7059      machine dependent implementation and we should never have arrived
   7060      here.  */
   7061   error (EXIT_FAILURE, 0, gettext ("no machine specific '%s' implementation"),
   7062 	 "initialize_plt");
   7063 }
   7064 
   7065 
   7066 static void
   7067 ld_generic_initialize_pltrel (struct ld_state *statep, Elf_Scn *scn)
   7068 {
   7069   /* This cannot be implemented generally.  There should have been a
   7070      machine dependent implementation and we should never have arrived
   7071      here.  */
   7072   error (EXIT_FAILURE, 0, gettext ("no machine specific '%s' implementation"),
   7073 	 "initialize_pltrel");
   7074 }
   7075 
   7076 
   7077 static void
   7078 ld_generic_initialize_got (struct ld_state *statep, Elf_Scn *scn)
   7079 {
   7080   /* This cannot be implemented generally.  There should have been a
   7081      machine dependent implementation and we should never have arrived
   7082      here.  */
   7083   error (EXIT_FAILURE, 0, gettext ("no machine specific '%s' implementation"),
   7084 	 "initialize_got");
   7085 }
   7086 
   7087 
   7088 static void
   7089 ld_generic_initialize_gotplt (struct ld_state *statep, Elf_Scn *scn)
   7090 {
   7091   /* This cannot be implemented generally.  There should have been a
   7092      machine dependent implementation and we should never have arrived
   7093      here.  */
   7094   error (EXIT_FAILURE, 0, gettext ("no machine specific '%s' implementation"),
   7095 	 "initialize_gotplt");
   7096 }
   7097 
   7098 
   7099 static void
   7100 ld_generic_finalize_plt (struct ld_state *statep, size_t nsym, size_t nsym_dyn,
   7101 			 struct symbol **ndxtosymp)
   7102 {
   7103   /* By default we assume that nothing has to be done.  */
   7104 }
   7105 
   7106 
   7107 static int
   7108 ld_generic_rel_type (struct ld_state *statep)
   7109 {
   7110   /* This cannot be implemented generally.  There should have been a
   7111      machine dependent implementation and we should never have arrived
   7112      here.  */
   7113   error (EXIT_FAILURE, 0, gettext ("no machine specific '%s' implementation"),
   7114 	 "rel_type");
   7115   /* Just to keep the compiler calm.  */
   7116   return 0;
   7117 }
   7118 
   7119 
   7120 static void
   7121 ld_generic_count_relocations (struct ld_state *statep, struct scninfo *scninfo)
   7122 {
   7123   /* This cannot be implemented generally.  There should have been a
   7124      machine dependent implementation and we should never have arrived
   7125      here.  */
   7126   error (EXIT_FAILURE, 0, gettext ("no machine specific '%s' implementation"),
   7127 	 "count_relocations");
   7128 }
   7129 
   7130 
   7131 static void
   7132 ld_generic_create_relocations (struct ld_state *statep,
   7133 			       const Elf32_Word *dblindirect)
   7134 {
   7135   /* This cannot be implemented generally.  There should have been a
   7136      machine dependent implementation and we should never have arrived
   7137      here.  */
   7138   error (EXIT_FAILURE, 0, gettext ("no machine specific '%s' implementation"),
   7139 	 "create_relocations");
   7140 }
   7141