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