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