1/* Pedantic checking of ELF files compliance with gABI/psABI spec.
2   Copyright (C) 2001-2012 Red Hat, Inc.
3   This file is part of Red Hat elfutils.
4   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
5
6   Red Hat elfutils is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by the
8   Free Software Foundation; version 2 of the License.
9
10   Red Hat elfutils is distributed in the hope that it will be useful, but
11   WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13   General Public License for more details.
14
15   You should have received a copy of the GNU General Public License along
16   with Red Hat elfutils; if not, write to the Free Software Foundation,
17   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
18
19   Red Hat elfutils is an included package of the Open Invention Network.
20   An included package of the Open Invention Network is a package for which
21   Open Invention Network licensees cross-license their patents.  No patent
22   license is granted, either expressly or impliedly, by designation as an
23   included package.  Should you wish to participate in the Open Invention
24   Network licensing program, please visit www.openinventionnetwork.com
25   <http://www.openinventionnetwork.com>.  */
26
27#ifdef HAVE_CONFIG_H
28# include <config.h>
29#endif
30
31#include <argp.h>
32#include <assert.h>
33#include <byteswap.h>
34#include <endian.h>
35#include <error.h>
36#include <fcntl.h>
37#include <gelf.h>
38#include <inttypes.h>
39#include <libintl.h>
40#include <locale.h>
41#include <stdbool.h>
42#include <stdlib.h>
43#include <string.h>
44#include <unistd.h>
45#include <sys/stat.h>
46#include <sys/param.h>
47
48#include <elf-knowledge.h>
49#include <system.h>
50#include "../libelf/libelfP.h"
51#include "../libelf/common.h"
52#include "../libebl/libeblP.h"
53#include "../libdw/libdwP.h"
54#include "../libdwfl/libdwflP.h"
55#include "../libdw/memory-access.h"
56
57
58/* Name and version of program.  */
59static void print_version (FILE *stream, struct argp_state *state);
60ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
61
62/* Bug report address.  */
63ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
64
65#define ARGP_strict	300
66#define ARGP_gnuld	301
67
68/* Definitions of arguments for argp functions.  */
69static const struct argp_option options[] =
70{
71  { "strict", ARGP_strict, NULL, 0,
72    N_("Be extremely strict, flag level 2 features."), 0 },
73  { "quiet", 'q', NULL, 0, N_("Do not print anything if successful"), 0 },
74  { "debuginfo", 'd', NULL, 0, N_("Binary is a separate debuginfo file"), 0 },
75  { "gnu-ld", ARGP_gnuld, NULL, 0,
76    N_("Binary has been created with GNU ld and is therefore known to be \
77broken in certain ways"), 0 },
78  { NULL, 0, NULL, 0, NULL, 0 }
79};
80
81/* Short description of program.  */
82static const char doc[] = N_("\
83Pedantic checking of ELF files compliance with gABI/psABI spec.");
84
85/* Strings for arguments in help texts.  */
86static const char args_doc[] = N_("FILE...");
87
88/* Prototype for option handler.  */
89static error_t parse_opt (int key, char *arg, struct argp_state *state);
90
91/* Data structure to communicate with argp functions.  */
92static struct argp argp =
93{
94  options, parse_opt, args_doc, doc, NULL, NULL, NULL
95};
96
97
98/* Declarations of local functions.  */
99static void process_file (int fd, Elf *elf, const char *prefix,
100			  const char *suffix, const char *fname, size_t size,
101			  bool only_one);
102static void process_elf_file (Elf *elf, const char *prefix, const char *suffix,
103			      const char *fname, size_t size, bool only_one);
104static void check_note_section (Ebl *ebl, GElf_Ehdr *ehdr,
105				GElf_Shdr *shdr, int idx);
106
107
108/* Report an error.  */
109#define ERROR(str, args...) \
110  do {									      \
111    printf (str, ##args);						      \
112    ++error_count;							      \
113  } while (0)
114static unsigned int error_count;
115
116/* True if we should perform very strict testing.  */
117static bool be_strict;
118
119/* True if no message is to be printed if the run is succesful.  */
120static bool be_quiet;
121
122/* True if binary is from strip -f, not a normal ELF file.  */
123static bool is_debuginfo;
124
125/* True if binary is assumed to be generated with GNU ld.  */
126static bool gnuld;
127
128/* Index of section header string table.  */
129static uint32_t shstrndx;
130
131/* Array to count references in section groups.  */
132static int *scnref;
133
134
135int
136main (int argc, char *argv[])
137{
138  /* Set locale.  */
139  setlocale (LC_ALL, "");
140
141  /* Initialize the message catalog.  */
142  textdomain (PACKAGE_TARNAME);
143
144  /* Parse and process arguments.  */
145  int remaining;
146  argp_parse (&argp, argc, argv, 0, &remaining, NULL);
147
148  /* Before we start tell the ELF library which version we are using.  */
149  elf_version (EV_CURRENT);
150
151  /* Now process all the files given at the command line.  */
152  bool only_one = remaining + 1 == argc;
153  do
154    {
155      /* Open the file.  */
156      int fd = open (argv[remaining], O_RDONLY);
157      if (fd == -1)
158	{
159	  error (0, errno, gettext ("cannot open input file"));
160	  continue;
161	}
162
163      /* Create an `Elf' descriptor.  */
164      Elf *elf = elf_begin (fd, ELF_C_READ_MMAP, NULL);
165      if (elf == NULL)
166	ERROR (gettext ("cannot generate Elf descriptor: %s\n"),
167	       elf_errmsg (-1));
168      else
169	{
170	  unsigned int prev_error_count = error_count;
171	  struct stat64 st;
172
173	  if (fstat64 (fd, &st) != 0)
174	    {
175	      printf ("cannot stat '%s': %m\n", argv[remaining]);
176	      close (fd);
177	      continue;
178	    }
179
180	  process_file (fd, elf, NULL, NULL, argv[remaining], st.st_size,
181			only_one);
182
183	  /* Now we can close the descriptor.  */
184	  if (elf_end (elf) != 0)
185	    ERROR (gettext ("error while closing Elf descriptor: %s\n"),
186		   elf_errmsg (-1));
187
188	  if (prev_error_count == error_count && !be_quiet)
189	    puts (gettext ("No errors"));
190	}
191
192      close (fd);
193    }
194  while (++remaining < argc);
195
196  return error_count != 0;
197}
198
199
200/* Handle program arguments.  */
201static error_t
202parse_opt (int key, char *arg __attribute__ ((unused)),
203	   struct argp_state *state __attribute__ ((unused)))
204{
205  switch (key)
206    {
207    case ARGP_strict:
208      be_strict = true;
209      break;
210
211    case 'q':
212      be_quiet = true;
213      break;
214
215    case 'd':
216      is_debuginfo = true;
217
218    case ARGP_gnuld:
219      gnuld = true;
220      break;
221
222    case ARGP_KEY_NO_ARGS:
223      fputs (gettext ("Missing file name.\n"), stderr);
224      argp_help (&argp, stderr, ARGP_HELP_SEE, program_invocation_short_name);
225      exit (EXIT_FAILURE);
226
227    default:
228      return ARGP_ERR_UNKNOWN;
229    }
230  return 0;
231}
232
233
234/* Print the version information.  */
235static void
236print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
237{
238  fprintf (stream, "elflint (%s) %s\n", PACKAGE_NAME, PACKAGE_VERSION);
239  fprintf (stream, gettext ("\
240Copyright (C) %s Red Hat, Inc.\n\
241This is free software; see the source for copying conditions.  There is NO\n\
242warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
243"), "2012");
244  fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
245}
246
247
248/* Process one file.  */
249static void
250process_file (int fd, Elf *elf, const char *prefix, const char *suffix,
251	      const char *fname, size_t size, bool only_one)
252{
253  /* We can handle two types of files: ELF files and archives.  */
254  Elf_Kind kind = elf_kind (elf);
255
256  switch (kind)
257    {
258    case ELF_K_ELF:
259      /* Yes!  It's an ELF file.  */
260      process_elf_file (elf, prefix, suffix, fname, size, only_one);
261      break;
262
263    case ELF_K_AR:
264      {
265	Elf *subelf;
266	Elf_Cmd cmd = ELF_C_READ_MMAP;
267	size_t prefix_len = prefix == NULL ? 0 : strlen (prefix);
268	size_t fname_len = strlen (fname) + 1;
269	char new_prefix[prefix_len + 1 + fname_len];
270	char new_suffix[(suffix == NULL ? 0 : strlen (suffix)) + 2];
271	char *cp = new_prefix;
272
273	/* Create the full name of the file.  */
274	if (prefix != NULL)
275	  {
276	    cp = mempcpy (cp, prefix, prefix_len);
277	    *cp++ = '(';
278	    strcpy (stpcpy (new_suffix, suffix), ")");
279	  }
280	else
281	  new_suffix[0] = '\0';
282	memcpy (cp, fname, fname_len);
283
284	/* It's an archive.  We process each file in it.  */
285	while ((subelf = elf_begin (fd, cmd, elf)) != NULL)
286	  {
287	    kind = elf_kind (subelf);
288
289	    /* Call this function recursively.  */
290	    if (kind == ELF_K_ELF || kind == ELF_K_AR)
291	      {
292		Elf_Arhdr *arhdr = elf_getarhdr (subelf);
293		assert (arhdr != NULL);
294
295		process_file (fd, subelf, new_prefix, new_suffix,
296			      arhdr->ar_name, arhdr->ar_size, false);
297	      }
298
299	    /* Get next archive element.  */
300	    cmd = elf_next (subelf);
301	    if (elf_end (subelf) != 0)
302	      ERROR (gettext (" error while freeing sub-ELF descriptor: %s\n"),
303		     elf_errmsg (-1));
304	  }
305      }
306      break;
307
308    default:
309      /* We cannot do anything.  */
310      ERROR (gettext ("\
311Not an ELF file - it has the wrong magic bytes at the start\n"));
312      break;
313    }
314}
315
316
317static const char *
318section_name (Ebl *ebl, int idx)
319{
320  GElf_Shdr shdr_mem;
321  GElf_Shdr *shdr;
322
323  shdr = gelf_getshdr (elf_getscn (ebl->elf, idx), &shdr_mem);
324
325  return elf_strptr (ebl->elf, shstrndx, shdr->sh_name);
326}
327
328
329static const int valid_e_machine[] =
330  {
331    EM_M32, EM_SPARC, EM_386, EM_68K, EM_88K, EM_860, EM_MIPS, EM_S370,
332    EM_MIPS_RS3_LE, EM_PARISC, EM_VPP500, EM_SPARC32PLUS, EM_960, EM_PPC,
333    EM_PPC64, EM_S390, EM_V800, EM_FR20, EM_RH32, EM_RCE, EM_ARM,
334    EM_FAKE_ALPHA, EM_SH, EM_SPARCV9, EM_TRICORE, EM_ARC, EM_H8_300,
335    EM_H8_300H, EM_H8S, EM_H8_500, EM_IA_64, EM_MIPS_X, EM_COLDFIRE,
336    EM_68HC12, EM_MMA, EM_PCP, EM_NCPU, EM_NDR1, EM_STARCORE, EM_ME16,
337    EM_ST100, EM_TINYJ, EM_X86_64, EM_PDSP, EM_FX66, EM_ST9PLUS, EM_ST7,
338    EM_68HC16, EM_68HC11, EM_68HC08, EM_68HC05, EM_SVX, EM_ST19, EM_VAX,
339    EM_CRIS, EM_JAVELIN, EM_FIREPATH, EM_ZSP, EM_MMIX, EM_HUANY, EM_PRISM,
340    EM_AVR, EM_FR30, EM_D10V, EM_D30V, EM_V850, EM_M32R, EM_MN10300,
341    EM_MN10200, EM_PJ, EM_OPENRISC, EM_ARC_A5, EM_XTENSA, EM_ALPHA
342  };
343#define nvalid_e_machine \
344  (sizeof (valid_e_machine) / sizeof (valid_e_machine[0]))
345
346
347/* Numbers of sections and program headers.  */
348static unsigned int shnum;
349static unsigned int phnum;
350
351
352static void
353check_elf_header (Ebl *ebl, GElf_Ehdr *ehdr, size_t size)
354{
355  char buf[512];
356  size_t cnt;
357
358  /* Check e_ident field.  */
359  if (ehdr->e_ident[EI_MAG0] != ELFMAG0)
360    ERROR ("e_ident[%d] != '%c'\n", EI_MAG0, ELFMAG0);
361  if (ehdr->e_ident[EI_MAG1] != ELFMAG1)
362    ERROR ("e_ident[%d] != '%c'\n", EI_MAG1, ELFMAG1);
363  if (ehdr->e_ident[EI_MAG2] != ELFMAG2)
364    ERROR ("e_ident[%d] != '%c'\n", EI_MAG2, ELFMAG2);
365  if (ehdr->e_ident[EI_MAG3] != ELFMAG3)
366    ERROR ("e_ident[%d] != '%c'\n", EI_MAG3, ELFMAG3);
367
368  if (ehdr->e_ident[EI_CLASS] != ELFCLASS32
369      && ehdr->e_ident[EI_CLASS] != ELFCLASS64)
370    ERROR (gettext ("e_ident[%d] == %d is no known class\n"),
371	   EI_CLASS, ehdr->e_ident[EI_CLASS]);
372
373  if (ehdr->e_ident[EI_DATA] != ELFDATA2LSB
374      && ehdr->e_ident[EI_DATA] != ELFDATA2MSB)
375    ERROR (gettext ("e_ident[%d] == %d is no known data encoding\n"),
376	   EI_DATA, ehdr->e_ident[EI_DATA]);
377
378  if (ehdr->e_ident[EI_VERSION] != EV_CURRENT)
379    ERROR (gettext ("unknown ELF header version number e_ident[%d] == %d\n"),
380	   EI_VERSION, ehdr->e_ident[EI_VERSION]);
381
382  /* We currently don't handle any OS ABIs other than Linux.  */
383  if (ehdr->e_ident[EI_OSABI] != ELFOSABI_NONE
384      && ehdr->e_ident[EI_OSABI] != ELFOSABI_LINUX)
385    ERROR (gettext ("unsupported OS ABI e_ident[%d] == '%s'\n"),
386	   EI_OSABI,
387	   ebl_osabi_name (ebl, ehdr->e_ident[EI_OSABI], buf, sizeof (buf)));
388
389  /* No ABI versions other than zero supported either.  */
390  if (ehdr->e_ident[EI_ABIVERSION] != 0)
391    ERROR (gettext ("unsupport ABI version e_ident[%d] == %d\n"),
392	   EI_ABIVERSION, ehdr->e_ident[EI_ABIVERSION]);
393
394  for (cnt = EI_PAD; cnt < EI_NIDENT; ++cnt)
395    if (ehdr->e_ident[cnt] != 0)
396      ERROR (gettext ("e_ident[%zu] is not zero\n"), cnt);
397
398  /* Check the e_type field.  */
399  if (ehdr->e_type != ET_REL && ehdr->e_type != ET_EXEC
400      && ehdr->e_type != ET_DYN && ehdr->e_type != ET_CORE)
401    ERROR (gettext ("unknown object file type %d\n"), ehdr->e_type);
402
403  /* Check the e_machine field.  */
404  for (cnt = 0; cnt < nvalid_e_machine; ++cnt)
405    if (valid_e_machine[cnt] == ehdr->e_machine)
406      break;
407  if (cnt == nvalid_e_machine)
408    ERROR (gettext ("unknown machine type %d\n"), ehdr->e_machine);
409
410  /* Check the e_version field.  */
411  if (ehdr->e_version != EV_CURRENT)
412    ERROR (gettext ("unknown object file version\n"));
413
414  /* Check the e_phoff and e_phnum fields.  */
415  if (ehdr->e_phoff == 0)
416    {
417      if (ehdr->e_phnum != 0)
418	ERROR (gettext ("invalid program header offset\n"));
419      else if (ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN)
420	ERROR (gettext ("\
421executables and DSOs cannot have zero program header offset\n"));
422    }
423  else if (ehdr->e_phnum == 0)
424    ERROR (gettext ("invalid number of program header entries\n"));
425
426  /* Check the e_shoff field.  */
427  shnum = ehdr->e_shnum;
428  shstrndx = ehdr->e_shstrndx;
429  if (ehdr->e_shoff == 0)
430    {
431      if (ehdr->e_shnum != 0)
432	ERROR (gettext ("invalid section header table offset\n"));
433      else if (ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN
434	       && ehdr->e_type != ET_CORE)
435	ERROR (gettext ("section header table must be present\n"));
436    }
437  else
438    {
439      if (ehdr->e_shnum == 0)
440	{
441	  /* Get the header of the zeroth section.  The sh_size field
442	     might contain the section number.  */
443	  GElf_Shdr shdr_mem;
444	  GElf_Shdr *shdr = gelf_getshdr (elf_getscn (ebl->elf, 0), &shdr_mem);
445	  if (shdr != NULL)
446	    {
447	      /* The error will be reported later.  */
448	      if (shdr->sh_size == 0)
449		ERROR (gettext ("\
450invalid number of section header table entries\n"));
451	      else
452		shnum = shdr->sh_size;
453	    }
454	}
455
456      if (ehdr->e_shstrndx == SHN_XINDEX)
457	{
458	  /* Get the header of the zeroth section.  The sh_size field
459	     might contain the section number.  */
460	  GElf_Shdr shdr_mem;
461	  GElf_Shdr *shdr = gelf_getshdr (elf_getscn (ebl->elf, 0), &shdr_mem);
462	  if (shdr != NULL && shdr->sh_link < shnum)
463	    shstrndx = shdr->sh_link;
464	}
465      else if (shstrndx >= shnum)
466	ERROR (gettext ("invalid section header index\n"));
467    }
468
469  phnum = ehdr->e_phnum;
470  if (ehdr->e_phnum == PN_XNUM)
471    {
472      /* Get the header of the zeroth section.  The sh_info field
473	 might contain the phnum count.  */
474      GElf_Shdr shdr_mem;
475      GElf_Shdr *shdr = gelf_getshdr (elf_getscn (ebl->elf, 0), &shdr_mem);
476      if (shdr != NULL)
477	{
478	  /* The error will be reported later.  */
479	  if (shdr->sh_info < PN_XNUM)
480	    ERROR (gettext ("\
481invalid number of program header table entries\n"));
482	  else
483	    phnum = shdr->sh_info;
484	}
485    }
486
487  /* Check the e_flags field.  */
488  if (!ebl_machine_flag_check (ebl, ehdr->e_flags))
489    ERROR (gettext ("invalid machine flags: %s\n"),
490	   ebl_machine_flag_name (ebl, ehdr->e_flags, buf, sizeof (buf)));
491
492  /* Check e_ehsize, e_phentsize, and e_shentsize fields.  */
493  if (gelf_getclass (ebl->elf) == ELFCLASS32)
494    {
495      if (ehdr->e_ehsize != 0 && ehdr->e_ehsize != sizeof (Elf32_Ehdr))
496	ERROR (gettext ("invalid ELF header size: %hd\n"), ehdr->e_ehsize);
497
498      if (ehdr->e_phentsize != 0 && ehdr->e_phentsize != sizeof (Elf32_Phdr))
499	ERROR (gettext ("invalid program header size: %hd\n"),
500	       ehdr->e_phentsize);
501      else if (ehdr->e_phoff + phnum * ehdr->e_phentsize > size)
502	ERROR (gettext ("invalid program header position or size\n"));
503
504      if (ehdr->e_shentsize != 0 && ehdr->e_shentsize != sizeof (Elf32_Shdr))
505	ERROR (gettext ("invalid section header size: %hd\n"),
506	       ehdr->e_shentsize);
507      else if (ehdr->e_shoff + shnum * ehdr->e_shentsize > size)
508	ERROR (gettext ("invalid section header position or size\n"));
509    }
510  else if (gelf_getclass (ebl->elf) == ELFCLASS64)
511    {
512      if (ehdr->e_ehsize != 0 && ehdr->e_ehsize != sizeof (Elf64_Ehdr))
513	ERROR (gettext ("invalid ELF header size: %hd\n"), ehdr->e_ehsize);
514
515      if (ehdr->e_phentsize != 0 && ehdr->e_phentsize != sizeof (Elf64_Phdr))
516	ERROR (gettext ("invalid program header size: %hd\n"),
517	       ehdr->e_phentsize);
518      else if (ehdr->e_phoff + phnum * ehdr->e_phentsize > size)
519	ERROR (gettext ("invalid program header position or size\n"));
520
521      if (ehdr->e_shentsize != 0 && ehdr->e_shentsize != sizeof (Elf64_Shdr))
522	ERROR (gettext ("invalid section header size: %hd\n"),
523	       ehdr->e_shentsize);
524      else if (ehdr->e_shoff + ehdr->e_shnum * ehdr->e_shentsize > size)
525	ERROR (gettext ("invalid section header position or size\n"));
526    }
527}
528
529
530/* Check that there is a section group section with index < IDX which
531   contains section IDX and that there is exactly one.  */
532static void
533check_scn_group (Ebl *ebl, int idx)
534{
535  if (scnref[idx] == 0)
536    {
537      /* No reference so far.  Search following sections, maybe the
538	 order is wrong.  */
539      size_t cnt;
540
541      for (cnt = idx + 1; cnt < shnum; ++cnt)
542	{
543	  Elf_Scn *scn = elf_getscn (ebl->elf, cnt);
544	  GElf_Shdr shdr_mem;
545	  GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
546	  if (shdr == NULL)
547	    /* We cannot get the section header so we cannot check it.
548	       The error to get the section header will be shown
549	       somewhere else.  */
550	    continue;
551
552	  if (shdr->sh_type != SHT_GROUP)
553	    continue;
554
555	  Elf_Data *data = elf_getdata (scn, NULL);
556	  if (data == NULL || data->d_size < sizeof (Elf32_Word))
557	    /* Cannot check the section.  */
558	    continue;
559
560	  Elf32_Word *grpdata = (Elf32_Word *) data->d_buf;
561	  for (size_t inner = 1; inner < data->d_size / sizeof (Elf32_Word);
562	       ++inner)
563	    if (grpdata[inner] == (Elf32_Word) idx)
564	      goto out;
565	}
566
567    out:
568      if (cnt == shnum)
569	ERROR (gettext ("\
570section [%2d] '%s': section with SHF_GROUP flag set not part of a section group\n"),
571	       idx, section_name (ebl, idx));
572      else
573	ERROR (gettext ("\
574section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"),
575	       idx, section_name (ebl, idx),
576	       cnt, section_name (ebl, cnt));
577    }
578}
579
580
581static void
582check_symtab (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
583{
584  bool no_xndx_warned = false;
585  int no_pt_tls = 0;
586  Elf_Data *data = elf_getdata (elf_getscn (ebl->elf, idx), NULL);
587  if (data == NULL)
588    {
589      ERROR (gettext ("section [%2d] '%s': cannot get section data\n"),
590	     idx, section_name (ebl, idx));
591      return;
592    }
593
594  GElf_Shdr strshdr_mem;
595  GElf_Shdr *strshdr = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
596				     &strshdr_mem);
597  if (strshdr == NULL)
598    return;
599
600  if (strshdr->sh_type != SHT_STRTAB)
601    {
602      ERROR (gettext ("section [%2d] '%s': referenced as string table for section [%2d] '%s' but type is not SHT_STRTAB\n"),
603	     shdr->sh_link, section_name (ebl, shdr->sh_link),
604	     idx, section_name (ebl, idx));
605      strshdr = NULL;
606    }
607
608  /* Search for an extended section index table section.  */
609  Elf_Data *xndxdata = NULL;
610  Elf32_Word xndxscnidx = 0;
611  bool found_xndx = false;
612  for (size_t cnt = 1; cnt < shnum; ++cnt)
613    if (cnt != (size_t) idx)
614      {
615	Elf_Scn *xndxscn = elf_getscn (ebl->elf, cnt);
616	GElf_Shdr xndxshdr_mem;
617	GElf_Shdr *xndxshdr = gelf_getshdr (xndxscn, &xndxshdr_mem);
618	if (xndxshdr == NULL)
619	  continue;
620
621	if (xndxshdr->sh_type == SHT_SYMTAB_SHNDX
622	    && xndxshdr->sh_link == (GElf_Word) idx)
623	  {
624	    if (found_xndx)
625	      ERROR (gettext ("\
626section [%2d] '%s': symbol table cannot have more than one extended index section\n"),
627		     idx, section_name (ebl, idx));
628
629	    xndxdata = elf_getdata (xndxscn, NULL);
630	    xndxscnidx = elf_ndxscn (xndxscn);
631	    found_xndx = true;
632	  }
633      }
634
635  if (shdr->sh_entsize != gelf_fsize (ebl->elf, ELF_T_SYM, 1, EV_CURRENT))
636    ERROR (gettext ("\
637section [%2u] '%s': entry size is does not match ElfXX_Sym\n"),
638	   idx, section_name (ebl, idx));
639
640  /* Test the zeroth entry.  */
641  GElf_Sym sym_mem;
642  Elf32_Word xndx;
643  GElf_Sym *sym = gelf_getsymshndx (data, xndxdata, 0, &sym_mem, &xndx);
644  if (sym == NULL)
645      ERROR (gettext ("section [%2d] '%s': cannot get symbol %d: %s\n"),
646	     idx, section_name (ebl, idx), 0, elf_errmsg (-1));
647  else
648    {
649      if (sym->st_name != 0)
650	ERROR (gettext ("section [%2d] '%s': '%s' in zeroth entry not zero\n"),
651	       idx, section_name (ebl, idx), "st_name");
652      if (sym->st_value != 0)
653	ERROR (gettext ("section [%2d] '%s': '%s' in zeroth entry not zero\n"),
654	       idx, section_name (ebl, idx), "st_value");
655      if (sym->st_size != 0)
656	ERROR (gettext ("section [%2d] '%s': '%s' in zeroth entry not zero\n"),
657	       idx, section_name (ebl, idx), "st_size");
658      if (sym->st_info != 0)
659	ERROR (gettext ("section [%2d] '%s': '%s' in zeroth entry not zero\n"),
660	       idx, section_name (ebl, idx), "st_info");
661      if (sym->st_other != 0)
662	ERROR (gettext ("section [%2d] '%s': '%s' in zeroth entry not zero\n"),
663	       idx, section_name (ebl, idx), "st_other");
664      if (sym->st_shndx != 0)
665	ERROR (gettext ("section [%2d] '%s': '%s' in zeroth entry not zero\n"),
666	       idx, section_name (ebl, idx), "st_shndx");
667      if (xndxdata != NULL && xndx != 0)
668	ERROR (gettext ("\
669section [%2d] '%s': XINDEX for zeroth entry not zero\n"),
670	       xndxscnidx, section_name (ebl, xndxscnidx));
671    }
672
673  for (size_t cnt = 1; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
674    {
675      sym = gelf_getsymshndx (data, xndxdata, cnt, &sym_mem, &xndx);
676      if (sym == NULL)
677	{
678	  ERROR (gettext ("section [%2d] '%s': cannot get symbol %zu: %s\n"),
679		 idx, section_name (ebl, idx), cnt, elf_errmsg (-1));
680	  continue;
681	}
682
683      const char *name = NULL;
684      if (strshdr == NULL)
685	name = "";
686      else if (sym->st_name >= strshdr->sh_size)
687	ERROR (gettext ("\
688section [%2d] '%s': symbol %zu: invalid name value\n"),
689	       idx, section_name (ebl, idx), cnt);
690      else
691	{
692	  name = elf_strptr (ebl->elf, shdr->sh_link, sym->st_name);
693	  assert (name != NULL);
694	}
695
696      if (sym->st_shndx == SHN_XINDEX)
697	{
698	  if (xndxdata == NULL)
699	    {
700	      if (!no_xndx_warned)
701		ERROR (gettext ("\
702section [%2d] '%s': symbol %zu: too large section index but no extended section index section\n"),
703		       idx, section_name (ebl, idx), cnt);
704	      no_xndx_warned = true;
705	    }
706	  else if (xndx < SHN_LORESERVE)
707	    ERROR (gettext ("\
708section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in st_shndx (%" PRIu32 ")\n"),
709		   xndxscnidx, section_name (ebl, xndxscnidx), cnt,
710		   xndx);
711	}
712      else if ((sym->st_shndx >= SHN_LORESERVE
713		// && sym->st_shndx <= SHN_HIRESERVE    always true
714		&& sym->st_shndx != SHN_ABS
715		&& sym->st_shndx != SHN_COMMON)
716	       || (sym->st_shndx >= shnum
717		   && (sym->st_shndx < SHN_LORESERVE
718		       /* || sym->st_shndx > SHN_HIRESERVE  always false */)))
719	ERROR (gettext ("\
720section [%2d] '%s': symbol %zu: invalid section index\n"),
721	       idx, section_name (ebl, idx), cnt);
722      else
723	xndx = sym->st_shndx;
724
725      if (GELF_ST_TYPE (sym->st_info) >= STT_NUM
726	  && !ebl_symbol_type_name (ebl, GELF_ST_TYPE (sym->st_info), NULL, 0))
727	ERROR (gettext ("section [%2d] '%s': symbol %zu: unknown type\n"),
728	       idx, section_name (ebl, idx), cnt);
729
730      if (GELF_ST_BIND (sym->st_info) >= STB_NUM
731	  && !ebl_symbol_binding_name (ebl, GELF_ST_BIND (sym->st_info), NULL,
732				       0))
733	ERROR (gettext ("\
734section [%2d] '%s': symbol %zu: unknown symbol binding\n"),
735	       idx, section_name (ebl, idx), cnt);
736      if (GELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE
737	  && GELF_ST_TYPE (sym->st_info) != STT_OBJECT)
738	ERROR (gettext ("\
739section [%2d] '%s': symbol %zu: unique symbol not of object type\n"),
740	       idx, section_name (ebl, idx), cnt);
741
742      if (xndx == SHN_COMMON)
743	{
744	  /* Common symbols can only appear in relocatable files.  */
745	  if (ehdr->e_type != ET_REL)
746	    ERROR (gettext ("\
747section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"),
748		   idx, section_name (ebl, idx), cnt);
749	  if (cnt < shdr->sh_info)
750	    ERROR (gettext ("\
751section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"),
752		   idx, section_name (ebl, idx), cnt);
753	  if (GELF_R_TYPE (sym->st_info) == STT_FUNC)
754	    ERROR (gettext ("\
755section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"),
756		   idx, section_name (ebl, idx), cnt);
757	}
758      else if (xndx > 0 && xndx < shnum)
759	{
760	  GElf_Shdr destshdr_mem;
761	  GElf_Shdr *destshdr;
762
763	  destshdr = gelf_getshdr (elf_getscn (ebl->elf, xndx), &destshdr_mem);
764	  if (destshdr != NULL)
765	    {
766	      GElf_Addr sh_addr = (ehdr->e_type == ET_REL ? 0
767				   : destshdr->sh_addr);
768	      if (GELF_ST_TYPE (sym->st_info) != STT_TLS)
769		{
770		  if (! ebl_check_special_symbol (ebl, ehdr, sym, name,
771						  destshdr))
772		    {
773		      if (sym->st_value - sh_addr > destshdr->sh_size)
774			{
775			  /* GNU ld has severe bugs.  When it decides to remove
776			     empty sections it leaves symbols referencing them
777			     behind.  These are symbols in .symtab.  */
778			  if (!gnuld
779			      || strcmp (section_name (ebl, idx), ".symtab")
780			      || (strcmp (name, "__preinit_array_start") != 0
781				  && strcmp (name, "__preinit_array_end") != 0
782				  && strcmp (name, "__init_array_start") != 0
783				  && strcmp (name, "__init_array_end") != 0
784				  && strcmp (name, "__fini_array_start") != 0
785				  && strcmp (name, "__fini_array_end") != 0))
786			    ERROR (gettext ("\
787section [%2d] '%s': symbol %zu: st_value out of bounds\n"),
788				   idx, section_name (ebl, idx), cnt);
789			}
790		      else if ((sym->st_value - sh_addr
791				+ sym->st_size) > destshdr->sh_size)
792			ERROR (gettext ("\
793section [%2d] '%s': symbol %zu does not fit completely in referenced section [%2d] '%s'\n"),
794			       idx, section_name (ebl, idx), cnt,
795			       (int) xndx, section_name (ebl, xndx));
796		    }
797		}
798	      else
799		{
800		  if ((destshdr->sh_flags & SHF_TLS) == 0)
801		    ERROR (gettext ("\
802section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have SHF_TLS flag set\n"),
803			   idx, section_name (ebl, idx), cnt,
804			   (int) xndx, section_name (ebl, xndx));
805
806		  if (ehdr->e_type == ET_REL)
807		    {
808		      /* For object files the symbol value must fall
809			 into the section.  */
810		      if (sym->st_value > destshdr->sh_size)
811			ERROR (gettext ("\
812section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section [%2d] '%s'\n"),
813			       idx, section_name (ebl, idx), cnt,
814			       (int) xndx, section_name (ebl, xndx));
815		      else if (sym->st_value + sym->st_size
816			       > destshdr->sh_size)
817			ERROR (gettext ("\
818section [%2d] '%s': symbol %zu does not fit completely in referenced section [%2d] '%s'\n"),
819			       idx, section_name (ebl, idx), cnt,
820			       (int) xndx, section_name (ebl, xndx));
821		    }
822		  else
823		    {
824		      GElf_Phdr phdr_mem;
825		      GElf_Phdr *phdr = NULL;
826		      unsigned int pcnt;
827
828		      for (pcnt = 0; pcnt < phnum; ++pcnt)
829			{
830			  phdr = gelf_getphdr (ebl->elf, pcnt, &phdr_mem);
831			  if (phdr != NULL && phdr->p_type == PT_TLS)
832			    break;
833			}
834
835		      if (pcnt == phnum)
836			{
837			  if (no_pt_tls++ == 0)
838			    ERROR (gettext ("\
839section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"),
840				   idx, section_name (ebl, idx), cnt);
841			}
842		      else
843			{
844			  if (sym->st_value
845			      < destshdr->sh_offset - phdr->p_offset)
846			    ERROR (gettext ("\
847section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] '%s'\n"),
848				   idx, section_name (ebl, idx), cnt,
849				   (int) xndx, section_name (ebl, xndx));
850			  else if (sym->st_value
851				   > (destshdr->sh_offset - phdr->p_offset
852				      + destshdr->sh_size))
853			    ERROR (gettext ("\
854section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section [%2d] '%s'\n"),
855				   idx, section_name (ebl, idx), cnt,
856				   (int) xndx, section_name (ebl, xndx));
857			  else if (sym->st_value + sym->st_size
858				   > (destshdr->sh_offset - phdr->p_offset
859				      + destshdr->sh_size))
860			    ERROR (gettext ("\
861section [%2d] '%s': symbol %zu does not fit completely in referenced section [%2d] '%s'\n"),
862				   idx, section_name (ebl, idx), cnt,
863				   (int) xndx, section_name (ebl, xndx));
864			}
865		    }
866		}
867	    }
868	}
869
870      if (GELF_ST_BIND (sym->st_info) == STB_LOCAL)
871	{
872	  if (cnt >= shdr->sh_info)
873	    ERROR (gettext ("\
874section [%2d] '%s': symbol %zu: local symbol outside range described in sh_info\n"),
875		   idx, section_name (ebl, idx), cnt);
876	}
877      else
878	{
879	  if (cnt < shdr->sh_info)
880	    ERROR (gettext ("\
881section [%2d] '%s': symbol %zu: non-local symbol outside range described in sh_info\n"),
882		   idx, section_name (ebl, idx), cnt);
883	}
884
885      if (GELF_ST_TYPE (sym->st_info) == STT_SECTION
886	  && GELF_ST_BIND (sym->st_info) != STB_LOCAL)
887	ERROR (gettext ("\
888section [%2d] '%s': symbol %zu: non-local section symbol\n"),
889	       idx, section_name (ebl, idx), cnt);
890
891      if (name != NULL)
892	{
893	  if (strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
894	    {
895	      /* Check that address and size match the global offset table.  */
896
897	      GElf_Shdr destshdr_mem;
898	      GElf_Shdr *destshdr = gelf_getshdr (elf_getscn (ebl->elf, xndx),
899						  &destshdr_mem);
900
901	      if (destshdr == NULL && xndx == SHN_ABS)
902		{
903		  /* In a DSO, we have to find the GOT section by name.  */
904		  Elf_Scn *gotscn = NULL;
905		  Elf_Scn *gscn = NULL;
906		  while ((gscn = elf_nextscn (ebl->elf, gscn)) != NULL)
907		    {
908		      destshdr = gelf_getshdr (gscn, &destshdr_mem);
909		      assert (destshdr != NULL);
910		      const char *sname = elf_strptr (ebl->elf,
911						      ehdr->e_shstrndx,
912						      destshdr->sh_name);
913		      if (sname != NULL)
914			{
915			  if (strcmp (sname, ".got.plt") == 0)
916			    break;
917			  if (strcmp (sname, ".got") == 0)
918			    /* Do not stop looking.
919			       There might be a .got.plt section.  */
920			    gotscn = gscn;
921			}
922
923		      destshdr = NULL;
924		    }
925
926		  if (destshdr == NULL && gotscn != NULL)
927		    destshdr = gelf_getshdr (gotscn, &destshdr_mem);
928		}
929
930	      const char *sname = ((destshdr == NULL || xndx == SHN_UNDEF)
931				   ? NULL
932				   : elf_strptr (ebl->elf, ehdr->e_shstrndx,
933						 destshdr->sh_name));
934	      if (sname == NULL)
935		{
936		  if (xndx != SHN_UNDEF || ehdr->e_type != ET_REL)
937		    ERROR (gettext ("\
938section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to \
939bad section [%2d]\n"),
940			   idx, section_name (ebl, idx), xndx);
941		}
942	      else if (strcmp (sname, ".got.plt") != 0
943		       && strcmp (sname, ".got") != 0)
944		ERROR (gettext ("\
945section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to \
946section [%2d] '%s'\n"),
947		       idx, section_name (ebl, idx), xndx, sname);
948
949	      if (destshdr != NULL)
950		{
951		  /* Found it.  */
952		  if (!ebl_check_special_symbol (ebl, ehdr, sym, name,
953						 destshdr))
954		    {
955		      if (ehdr->e_type != ET_REL
956			  && sym->st_value != destshdr->sh_addr)
957			/* This test is more strict than the psABIs which
958			   usually allow the symbol to be in the middle of
959			   the .got section, allowing negative offsets.  */
960			ERROR (gettext ("\
961section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#" PRIx64 " does not match %s section address %#" PRIx64 "\n"),
962			       idx, section_name (ebl, idx),
963			       (uint64_t) sym->st_value,
964			       sname, (uint64_t) destshdr->sh_addr);
965
966		      if (!gnuld && sym->st_size != destshdr->sh_size)
967			ERROR (gettext ("\
968section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %" PRIu64 " does not match %s section size %" PRIu64 "\n"),
969			       idx, section_name (ebl, idx),
970			       (uint64_t) sym->st_size,
971			       sname, (uint64_t) destshdr->sh_size);
972		    }
973		}
974	      else
975		ERROR (gettext ("\
976section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got section\n"),
977		       idx, section_name (ebl, idx));
978	    }
979	  else if (strcmp (name, "_DYNAMIC") == 0)
980	    /* Check that address and size match the dynamic section.
981	       We locate the dynamic section via the program header
982	       entry.  */
983	    for (unsigned int pcnt = 0; pcnt < phnum; ++pcnt)
984	      {
985		GElf_Phdr phdr_mem;
986		GElf_Phdr *phdr = gelf_getphdr (ebl->elf, pcnt, &phdr_mem);
987
988		if (phdr != NULL && phdr->p_type == PT_DYNAMIC)
989		  {
990		    if (sym->st_value != phdr->p_vaddr)
991		      ERROR (gettext ("\
992section [%2d] '%s': _DYNAMIC_ symbol value %#" PRIx64 " does not match dynamic segment address %#" PRIx64 "\n"),
993			     idx, section_name (ebl, idx),
994			     (uint64_t) sym->st_value,
995			     (uint64_t) phdr->p_vaddr);
996
997		    if (!gnuld && sym->st_size != phdr->p_memsz)
998		      ERROR (gettext ("\
999section [%2d] '%s': _DYNAMIC symbol size %" PRIu64 " does not match dynamic segment size %" PRIu64 "\n"),
1000			     idx, section_name (ebl, idx),
1001			     (uint64_t) sym->st_size,
1002			     (uint64_t) phdr->p_memsz);
1003
1004		    break;
1005		  }
1006	    }
1007	}
1008
1009      if (GELF_ST_VISIBILITY (sym->st_other) != STV_DEFAULT
1010	  && shdr->sh_type == SHT_DYNSYM)
1011	ERROR (gettext ("\
1012section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-default visibility\n"),
1013	       idx, section_name (ebl, idx), cnt);
1014      if (! ebl_check_st_other_bits (ebl, sym->st_other))
1015	ERROR (gettext ("\
1016section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"),
1017	       idx, section_name (ebl, idx), cnt);
1018
1019    }
1020}
1021
1022
1023static bool
1024is_rel_dyn (Ebl *ebl, const GElf_Ehdr *ehdr, int idx, const GElf_Shdr *shdr,
1025	    bool is_rela)
1026{
1027  /* If this is no executable or DSO it cannot be a .rel.dyn section.  */
1028  if (ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN)
1029    return false;
1030
1031  /* Check the section name.  Unfortunately necessary.  */
1032  if (strcmp (section_name (ebl, idx), is_rela ? ".rela.dyn" : ".rel.dyn"))
1033    return false;
1034
1035  /* When a .rel.dyn section is used a DT_RELCOUNT dynamic section
1036     entry can be present as well.  */
1037  Elf_Scn *scn = NULL;
1038  while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
1039    {
1040      GElf_Shdr rcshdr_mem;
1041      const GElf_Shdr *rcshdr = gelf_getshdr (scn, &rcshdr_mem);
1042      assert (rcshdr != NULL);
1043
1044      if (rcshdr->sh_type == SHT_DYNAMIC)
1045	{
1046	  /* Found the dynamic section.  Look through it.  */
1047	  Elf_Data *d = elf_getdata (scn, NULL);
1048	  size_t cnt;
1049
1050	  for (cnt = 1; cnt < rcshdr->sh_size / rcshdr->sh_entsize; ++cnt)
1051	    {
1052	      GElf_Dyn dyn_mem;
1053	      GElf_Dyn *dyn = gelf_getdyn (d, cnt, &dyn_mem);
1054	      assert (dyn != NULL);
1055
1056	      if (dyn->d_tag == DT_RELCOUNT)
1057		{
1058		  /* Found it.  Does the type match.  */
1059		  if (is_rela)
1060		    ERROR (gettext ("\
1061section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"),
1062			   idx, section_name (ebl, idx));
1063		  else
1064		    {
1065		      /* Does the number specified number of relative
1066			 relocations exceed the total number of
1067			 relocations?  */
1068		      if (dyn->d_un.d_val > shdr->sh_size / shdr->sh_entsize)
1069			ERROR (gettext ("\
1070section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"),
1071			       idx, section_name (ebl, idx),
1072			       (int) dyn->d_un.d_val);
1073
1074		      /* Make sure the specified number of relocations are
1075			 relative.  */
1076		      Elf_Data *reldata = elf_getdata (elf_getscn (ebl->elf,
1077								   idx), NULL);
1078		      if (reldata != NULL)
1079			for (size_t inner = 0;
1080			     inner < shdr->sh_size / shdr->sh_entsize;
1081			     ++inner)
1082			  {
1083			    GElf_Rel rel_mem;
1084			    GElf_Rel *rel = gelf_getrel (reldata, inner,
1085							 &rel_mem);
1086			    if (rel == NULL)
1087			      /* The problem will be reported elsewhere.  */
1088			      break;
1089
1090			    if (ebl_relative_reloc_p (ebl,
1091						      GELF_R_TYPE (rel->r_info)))
1092			      {
1093				if (inner >= dyn->d_un.d_val)
1094				  ERROR (gettext ("\
1095section [%2d] '%s': relative relocations after index %d as specified by DT_RELCOUNT\n"),
1096					 idx, section_name (ebl, idx),
1097					 (int) dyn->d_un.d_val);
1098			      }
1099			    else if (inner < dyn->d_un.d_val)
1100			      ERROR (gettext ("\
1101section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT specified %d relative relocations\n"),
1102				     idx, section_name (ebl, idx),
1103				     inner, (int) dyn->d_un.d_val);
1104			  }
1105		    }
1106		}
1107
1108	      if (dyn->d_tag == DT_RELACOUNT)
1109		{
1110		  /* Found it.  Does the type match.  */
1111		  if (!is_rela)
1112		    ERROR (gettext ("\
1113section [%2d] '%s': DT_RELACOUNT used for this REL section\n"),
1114			   idx, section_name (ebl, idx));
1115		  else
1116		    {
1117		      /* Does the number specified number of relative
1118			 relocations exceed the total number of
1119			 relocations?  */
1120		      if (dyn->d_un.d_val > shdr->sh_size / shdr->sh_entsize)
1121			ERROR (gettext ("\
1122section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"),
1123			       idx, section_name (ebl, idx),
1124			       (int) dyn->d_un.d_val);
1125
1126		      /* Make sure the specified number of relocations are
1127			 relative.  */
1128		      Elf_Data *reldata = elf_getdata (elf_getscn (ebl->elf,
1129								   idx), NULL);
1130		      if (reldata != NULL)
1131			for (size_t inner = 0;
1132			     inner < shdr->sh_size / shdr->sh_entsize;
1133			     ++inner)
1134			  {
1135			    GElf_Rela rela_mem;
1136			    GElf_Rela *rela = gelf_getrela (reldata, inner,
1137							    &rela_mem);
1138			    if (rela == NULL)
1139			      /* The problem will be reported elsewhere.  */
1140			      break;
1141
1142			    if (ebl_relative_reloc_p (ebl,
1143						      GELF_R_TYPE (rela->r_info)))
1144			      {
1145				if (inner >= dyn->d_un.d_val)
1146				  ERROR (gettext ("\
1147section [%2d] '%s': relative relocations after index %d as specified by DT_RELCOUNT\n"),
1148					 idx, section_name (ebl, idx),
1149					 (int) dyn->d_un.d_val);
1150			      }
1151			    else if (inner < dyn->d_un.d_val)
1152			      ERROR (gettext ("\
1153section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT specified %d relative relocations\n"),
1154				     idx, section_name (ebl, idx),
1155				     inner, (int) dyn->d_un.d_val);
1156			  }
1157		    }
1158		}
1159	    }
1160
1161	  break;
1162	}
1163    }
1164
1165  return true;
1166}
1167
1168
1169struct loaded_segment
1170{
1171  GElf_Addr from;
1172  GElf_Addr to;
1173  bool read_only;
1174  struct loaded_segment *next;
1175};
1176
1177
1178/* Check whether binary has text relocation flag set.  */
1179static bool textrel;
1180
1181/* Keep track of whether text relocation flag is needed.  */
1182static bool needed_textrel;
1183
1184
1185static bool
1186check_reloc_shdr (Ebl *ebl, const GElf_Ehdr *ehdr, const GElf_Shdr *shdr,
1187		  int idx, int reltype, GElf_Shdr **destshdrp,
1188		  GElf_Shdr *destshdr_memp, struct loaded_segment **loadedp)
1189{
1190  bool reldyn = false;
1191
1192  /* Check whether the link to the section we relocate is reasonable.  */
1193  if (shdr->sh_info >= shnum)
1194    ERROR (gettext ("section [%2d] '%s': invalid destination section index\n"),
1195	   idx, section_name (ebl, idx));
1196  else if (shdr->sh_info != 0)
1197    {
1198      *destshdrp = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_info),
1199				 destshdr_memp);
1200      if (*destshdrp != NULL)
1201	{
1202	  if((*destshdrp)->sh_type != SHT_PROGBITS
1203	     && (*destshdrp)->sh_type != SHT_NOBITS)
1204	    {
1205	      reldyn = is_rel_dyn (ebl, ehdr, idx, shdr, true);
1206	      if (!reldyn)
1207		ERROR (gettext ("\
1208section [%2d] '%s': invalid destination section type\n"),
1209		       idx, section_name (ebl, idx));
1210	      else
1211		{
1212		  /* There is no standard, but we require that .rel{,a}.dyn
1213		     sections have a sh_info value of zero.  */
1214		  if (shdr->sh_info != 0)
1215		    ERROR (gettext ("\
1216section [%2d] '%s': sh_info should be zero\n"),
1217			   idx, section_name (ebl, idx));
1218		}
1219	    }
1220
1221	  if (((*destshdrp)->sh_flags & (SHF_MERGE | SHF_STRINGS)) != 0)
1222	    ERROR (gettext ("\
1223section [%2d] '%s': no relocations for merge-able sections possible\n"),
1224		   idx, section_name (ebl, idx));
1225	}
1226    }
1227
1228  if (shdr->sh_entsize != gelf_fsize (ebl->elf, reltype, 1, EV_CURRENT))
1229    ERROR (gettext (reltype == ELF_T_RELA ? "\
1230section [%2d] '%s': section entry size does not match ElfXX_Rela\n" : "\
1231section [%2d] '%s': section entry size does not match ElfXX_Rel\n"),
1232	   idx, section_name (ebl, idx));
1233
1234  /* In preparation of checking whether relocations are text
1235     relocations or not we need to determine whether the file is
1236     flagged to have text relocation and we need to determine a) what
1237     the loaded segments are and b) which are read-only.  This will
1238     also allow us to determine whether the same reloc section is
1239     modifying loaded and not loaded segments.  */
1240  for (unsigned int i = 0; i < phnum; ++i)
1241    {
1242      GElf_Phdr phdr_mem;
1243      GElf_Phdr *phdr = gelf_getphdr (ebl->elf, i, &phdr_mem);
1244      if (phdr == NULL)
1245	continue;
1246
1247      if (phdr->p_type == PT_LOAD)
1248	{
1249	  struct loaded_segment *newp = xmalloc (sizeof (*newp));
1250	  newp->from = phdr->p_vaddr;
1251	  newp->to = phdr->p_vaddr + phdr->p_memsz;
1252	  newp->read_only = (phdr->p_flags & PF_W) == 0;
1253	  newp->next = *loadedp;
1254	  *loadedp = newp;
1255	}
1256      else if (phdr->p_type == PT_DYNAMIC)
1257	{
1258	  Elf_Scn *dynscn = gelf_offscn (ebl->elf, phdr->p_offset);
1259	  GElf_Shdr dynshdr_mem;
1260	  GElf_Shdr *dynshdr = gelf_getshdr (dynscn, &dynshdr_mem);
1261	  Elf_Data *dyndata = elf_getdata (dynscn, NULL);
1262	  if (dynshdr != NULL && dynshdr->sh_type == SHT_DYNAMIC
1263	      && dyndata != NULL)
1264	    for (size_t j = 0; j < dynshdr->sh_size / dynshdr->sh_entsize; ++j)
1265	      {
1266		GElf_Dyn dyn_mem;
1267		GElf_Dyn *dyn = gelf_getdyn (dyndata, j, &dyn_mem);
1268		if (dyn != NULL
1269		    && (dyn->d_tag == DT_TEXTREL
1270			|| (dyn->d_tag == DT_FLAGS
1271			    && (dyn->d_un.d_val & DF_TEXTREL) != 0)))
1272		  {
1273		    textrel = true;
1274		    break;
1275		  }
1276	      }
1277	}
1278    }
1279
1280  /* A quick test which can be easily done here (although it is a bit
1281     out of place): the text relocation flag makes only sense if there
1282     is a segment which is not writable.  */
1283  if (textrel)
1284    {
1285      struct loaded_segment *seg = *loadedp;
1286      while (seg != NULL && !seg->read_only)
1287	seg = seg->next;
1288      if (seg == NULL)
1289	ERROR (gettext ("\
1290text relocation flag set but there is no read-only segment\n"));
1291    }
1292
1293  return reldyn;
1294}
1295
1296
1297enum load_state
1298  {
1299    state_undecided,
1300    state_loaded,
1301    state_unloaded,
1302    state_error
1303  };
1304
1305
1306static void
1307check_one_reloc (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *relshdr, int idx,
1308		 size_t cnt, const GElf_Shdr *symshdr, Elf_Data *symdata,
1309		 GElf_Addr r_offset, GElf_Xword r_info,
1310		 const GElf_Shdr *destshdr, bool reldyn,
1311		 struct loaded_segment *loaded, enum load_state *statep)
1312{
1313  bool known_broken = gnuld;
1314
1315  if (!ebl_reloc_type_check (ebl, GELF_R_TYPE (r_info)))
1316    ERROR (gettext ("section [%2d] '%s': relocation %zu: invalid type\n"),
1317	   idx, section_name (ebl, idx), cnt);
1318  else if (((ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN)
1319	    /* The executable/DSO can contain relocation sections with
1320	       all the relocations the linker has applied.  Those sections
1321	       are marked non-loaded, though.  */
1322	    || (relshdr->sh_flags & SHF_ALLOC) != 0)
1323	   && !ebl_reloc_valid_use (ebl, GELF_R_TYPE (r_info)))
1324    ERROR (gettext ("\
1325section [%2d] '%s': relocation %zu: relocation type invalid for the file type\n"),
1326	   idx, section_name (ebl, idx), cnt);
1327
1328  if (symshdr != NULL
1329      && ((GELF_R_SYM (r_info) + 1)
1330	  * gelf_fsize (ebl->elf, ELF_T_SYM, 1, EV_CURRENT)
1331	  > symshdr->sh_size))
1332    ERROR (gettext ("\
1333section [%2d] '%s': relocation %zu: invalid symbol index\n"),
1334	   idx, section_name (ebl, idx), cnt);
1335
1336  /* No more tests if this is a no-op relocation.  */
1337  if (ebl_none_reloc_p (ebl, GELF_R_TYPE (r_info)))
1338    return;
1339
1340  if (ebl_gotpc_reloc_check (ebl, GELF_R_TYPE (r_info)))
1341    {
1342      const char *name;
1343      char buf[64];
1344      GElf_Sym sym_mem;
1345      GElf_Sym *sym = gelf_getsym (symdata, GELF_R_SYM (r_info), &sym_mem);
1346      if (sym != NULL
1347	  /* Get the name for the symbol.  */
1348	  && (name = elf_strptr (ebl->elf, symshdr->sh_link, sym->st_name))
1349	  && strcmp (name, "_GLOBAL_OFFSET_TABLE_") !=0 )
1350	ERROR (gettext ("\
1351section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can be used with %s\n"),
1352	       idx, section_name (ebl, idx), cnt,
1353	       ebl_reloc_type_name (ebl, GELF_R_SYM (r_info),
1354				    buf, sizeof (buf)));
1355    }
1356
1357  if (reldyn)
1358    {
1359      // XXX TODO Check .rel.dyn section addresses.
1360    }
1361  else if (!known_broken)
1362    {
1363      if (destshdr != NULL
1364	  && GELF_R_TYPE (r_info) != 0
1365	  && (r_offset - (ehdr->e_type == ET_REL ? 0
1366			  : destshdr->sh_addr)) >= destshdr->sh_size)
1367	ERROR (gettext ("\
1368section [%2d] '%s': relocation %zu: offset out of bounds\n"),
1369	       idx, section_name (ebl, idx), cnt);
1370    }
1371
1372  GElf_Sym sym_mem;
1373  GElf_Sym *sym = gelf_getsym (symdata, GELF_R_SYM (r_info), &sym_mem);
1374
1375  if (ebl_copy_reloc_p (ebl, GELF_R_TYPE (r_info))
1376      /* Make sure the referenced symbol is an object or unspecified.  */
1377      && sym != NULL
1378      && GELF_ST_TYPE (sym->st_info) != STT_NOTYPE
1379      && GELF_ST_TYPE (sym->st_info) != STT_OBJECT)
1380    {
1381      char buf[64];
1382      ERROR (gettext ("section [%2d] '%s': relocation %zu: copy relocation against symbol of type %s\n"),
1383	     idx, section_name (ebl, idx), cnt,
1384	     ebl_symbol_type_name (ebl, GELF_ST_TYPE (sym->st_info),
1385				   buf, sizeof (buf)));
1386    }
1387
1388  if ((ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN)
1389      || (relshdr->sh_flags & SHF_ALLOC) != 0)
1390    {
1391      bool in_loaded_seg = false;
1392      while (loaded != NULL)
1393	{
1394	  if (r_offset < loaded->to
1395	      && r_offset + (sym == NULL ? 0 : sym->st_size) >= loaded->from)
1396	    {
1397	      /* The symbol is in this segment.  */
1398	      if  (loaded->read_only)
1399		{
1400		  if (textrel)
1401		    needed_textrel = true;
1402		  else
1403		    ERROR (gettext ("section [%2d] '%s': relocation %zu: read-only section modified but text relocation flag not set\n"),
1404			   idx, section_name (ebl, idx), cnt);
1405		}
1406
1407	      in_loaded_seg = true;
1408	    }
1409
1410	  loaded = loaded->next;
1411	}
1412
1413      if (*statep == state_undecided)
1414	*statep = in_loaded_seg ? state_loaded : state_unloaded;
1415      else if ((*statep == state_unloaded && in_loaded_seg)
1416	       || (*statep == state_loaded && !in_loaded_seg))
1417	{
1418	  ERROR (gettext ("\
1419section [%2d] '%s': relocations are against loaded and unloaded data\n"),
1420		 idx, section_name (ebl, idx));
1421	  *statep = state_error;
1422	}
1423    }
1424}
1425
1426
1427static void
1428check_rela (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
1429{
1430  Elf_Data *data = elf_getdata (elf_getscn (ebl->elf, idx), NULL);
1431  if (data == NULL)
1432    {
1433      ERROR (gettext ("section [%2d] '%s': cannot get section data\n"),
1434	     idx, section_name (ebl, idx));
1435      return;
1436    }
1437
1438  /* Check the fields of the section header.  */
1439  GElf_Shdr destshdr_mem;
1440  GElf_Shdr *destshdr = NULL;
1441  struct loaded_segment *loaded = NULL;
1442  bool reldyn = check_reloc_shdr (ebl, ehdr, shdr, idx, ELF_T_RELA, &destshdr,
1443				  &destshdr_mem, &loaded);
1444
1445  Elf_Scn *symscn = elf_getscn (ebl->elf, shdr->sh_link);
1446  GElf_Shdr symshdr_mem;
1447  GElf_Shdr *symshdr = gelf_getshdr (symscn, &symshdr_mem);
1448  Elf_Data *symdata = elf_getdata (symscn, NULL);
1449  enum load_state state = state_undecided;
1450
1451  for (size_t cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
1452    {
1453      GElf_Rela rela_mem;
1454      GElf_Rela *rela = gelf_getrela (data, cnt, &rela_mem);
1455      if (rela == NULL)
1456	{
1457	  ERROR (gettext ("\
1458section [%2d] '%s': cannot get relocation %zu: %s\n"),
1459		 idx, section_name (ebl, idx), cnt, elf_errmsg (-1));
1460	  continue;
1461	}
1462
1463      check_one_reloc (ebl, ehdr, shdr, idx, cnt, symshdr, symdata,
1464		       rela->r_offset, rela->r_info, destshdr, reldyn, loaded,
1465		       &state);
1466    }
1467
1468  while (loaded != NULL)
1469    {
1470      struct loaded_segment *old = loaded;
1471      loaded = loaded->next;
1472      free (old);
1473    }
1474}
1475
1476
1477static void
1478check_rel (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
1479{
1480  Elf_Data *data = elf_getdata (elf_getscn (ebl->elf, idx), NULL);
1481  if (data == NULL)
1482    {
1483      ERROR (gettext ("section [%2d] '%s': cannot get section data\n"),
1484	     idx, section_name (ebl, idx));
1485      return;
1486    }
1487
1488  /* Check the fields of the section header.  */
1489  GElf_Shdr destshdr_mem;
1490  GElf_Shdr *destshdr = NULL;
1491  struct loaded_segment *loaded = NULL;
1492  bool reldyn = check_reloc_shdr (ebl, ehdr, shdr, idx, ELF_T_REL, &destshdr,
1493				  &destshdr_mem, &loaded);
1494
1495  Elf_Scn *symscn = elf_getscn (ebl->elf, shdr->sh_link);
1496  GElf_Shdr symshdr_mem;
1497  GElf_Shdr *symshdr = gelf_getshdr (symscn, &symshdr_mem);
1498  Elf_Data *symdata = elf_getdata (symscn, NULL);
1499  enum load_state state = state_undecided;
1500
1501  for (size_t cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
1502    {
1503      GElf_Rel rel_mem;
1504      GElf_Rel *rel = gelf_getrel (data, cnt, &rel_mem);
1505      if (rel == NULL)
1506	{
1507	  ERROR (gettext ("\
1508section [%2d] '%s': cannot get relocation %zu: %s\n"),
1509		 idx, section_name (ebl, idx), cnt, elf_errmsg (-1));
1510	  continue;
1511	}
1512
1513      check_one_reloc (ebl, ehdr, shdr, idx, cnt, symshdr, symdata,
1514		       rel->r_offset, rel->r_info, destshdr, reldyn, loaded,
1515		       &state);
1516    }
1517
1518  while (loaded != NULL)
1519    {
1520      struct loaded_segment *old = loaded;
1521      loaded = loaded->next;
1522      free (old);
1523    }
1524}
1525
1526
1527/* Number of dynamic sections.  */
1528static int ndynamic;
1529
1530
1531static void
1532check_dynamic (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
1533{
1534  Elf_Data *data;
1535  GElf_Shdr strshdr_mem;
1536  GElf_Shdr *strshdr;
1537  size_t cnt;
1538  static const bool dependencies[DT_NUM][DT_NUM] =
1539    {
1540      [DT_NEEDED] = { [DT_STRTAB] = true },
1541      [DT_PLTRELSZ] = { [DT_JMPREL] = true },
1542      [DT_HASH] = { [DT_SYMTAB] = true },
1543      [DT_STRTAB] = { [DT_STRSZ] = true },
1544      [DT_SYMTAB] = { [DT_STRTAB] = true, [DT_SYMENT] = true },
1545      [DT_RELA] = { [DT_RELASZ] = true, [DT_RELAENT] = true },
1546      [DT_RELASZ] = { [DT_RELA] = true },
1547      [DT_RELAENT] = { [DT_RELA] = true },
1548      [DT_STRSZ] = { [DT_STRTAB] = true },
1549      [DT_SYMENT] = { [DT_SYMTAB] = true },
1550      [DT_SONAME] = { [DT_STRTAB] = true },
1551      [DT_RPATH] = { [DT_STRTAB] = true },
1552      [DT_REL] = { [DT_RELSZ] = true, [DT_RELENT] = true },
1553      [DT_RELSZ] = { [DT_REL] = true },
1554      [DT_RELENT] = { [DT_REL] = true },
1555      [DT_JMPREL] = { [DT_PLTRELSZ] = true, [DT_PLTREL] = true },
1556      [DT_RUNPATH] = { [DT_STRTAB] = true },
1557      [DT_PLTREL] = { [DT_JMPREL] = true },
1558    };
1559  bool has_dt[DT_NUM];
1560  bool has_val_dt[DT_VALNUM];
1561  bool has_addr_dt[DT_ADDRNUM];
1562  static const bool level2[DT_NUM] =
1563    {
1564      [DT_RPATH] = true,
1565      [DT_SYMBOLIC] = true,
1566      [DT_TEXTREL] = true,
1567      [DT_BIND_NOW] = true
1568    };
1569  static const bool mandatory[DT_NUM] =
1570    {
1571      [DT_NULL] = true,
1572      [DT_STRTAB] = true,
1573      [DT_SYMTAB] = true,
1574      [DT_STRSZ] = true,
1575      [DT_SYMENT] = true
1576    };
1577
1578  memset (has_dt, '\0', sizeof (has_dt));
1579  memset (has_val_dt, '\0', sizeof (has_val_dt));
1580  memset (has_addr_dt, '\0', sizeof (has_addr_dt));
1581
1582  if (++ndynamic == 2)
1583    ERROR (gettext ("more than one dynamic section present\n"));
1584
1585  data = elf_getdata (elf_getscn (ebl->elf, idx), NULL);
1586  if (data == NULL)
1587    {
1588      ERROR (gettext ("section [%2d] '%s': cannot get section data\n"),
1589	     idx, section_name (ebl, idx));
1590      return;
1591    }
1592
1593  strshdr = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), &strshdr_mem);
1594  if (strshdr != NULL && strshdr->sh_type != SHT_STRTAB)
1595    ERROR (gettext ("\
1596section [%2d] '%s': referenced as string table for section [%2d] '%s' but type is not SHT_STRTAB\n"),
1597	   shdr->sh_link, section_name (ebl, shdr->sh_link),
1598	   idx, section_name (ebl, idx));
1599
1600  if (shdr->sh_entsize != gelf_fsize (ebl->elf, ELF_T_DYN, 1, EV_CURRENT))
1601    ERROR (gettext ("\
1602section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"),
1603	   idx, section_name (ebl, idx));
1604
1605  if (shdr->sh_info != 0)
1606    ERROR (gettext ("section [%2d] '%s': sh_info not zero\n"),
1607	   idx, section_name (ebl, idx));
1608
1609  bool non_null_warned = false;
1610  for (cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
1611    {
1612      GElf_Dyn dyn_mem;
1613      GElf_Dyn *dyn = gelf_getdyn (data, cnt, &dyn_mem);
1614      if (dyn == NULL)
1615	{
1616	  ERROR (gettext ("\
1617section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"),
1618		 idx, section_name (ebl, idx), cnt, elf_errmsg (-1));
1619	  continue;
1620	}
1621
1622      if (has_dt[DT_NULL] && dyn->d_tag != DT_NULL && ! non_null_warned)
1623	{
1624	  ERROR (gettext ("\
1625section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"),
1626		 idx, section_name (ebl, idx));
1627	  non_null_warned = true;
1628	}
1629
1630      if (!ebl_dynamic_tag_check (ebl, dyn->d_tag))
1631	ERROR (gettext ("section [%2d] '%s': entry %zu: unknown tag\n"),
1632	       idx, section_name (ebl, idx), cnt);
1633
1634      if (dyn->d_tag >= 0 && dyn->d_tag < DT_NUM)
1635	{
1636	  if (has_dt[dyn->d_tag]
1637	      && dyn->d_tag != DT_NEEDED
1638	      && dyn->d_tag != DT_NULL
1639	      && dyn->d_tag != DT_POSFLAG_1)
1640	    {
1641	      char buf[50];
1642	      ERROR (gettext ("\
1643section [%2d] '%s': entry %zu: more than one entry with tag %s\n"),
1644		     idx, section_name (ebl, idx), cnt,
1645		     ebl_dynamic_tag_name (ebl, dyn->d_tag,
1646					   buf, sizeof (buf)));
1647	    }
1648
1649	  if (be_strict && level2[dyn->d_tag])
1650	    {
1651	      char buf[50];
1652	      ERROR (gettext ("\
1653section [%2d] '%s': entry %zu: level 2 tag %s used\n"),
1654		     idx, section_name (ebl, idx), cnt,
1655		     ebl_dynamic_tag_name (ebl, dyn->d_tag,
1656					   buf, sizeof (buf)));
1657	    }
1658
1659	  has_dt[dyn->d_tag] = true;
1660	}
1661      else if (dyn->d_tag <= DT_VALRNGHI
1662	       && DT_VALTAGIDX (dyn->d_tag) < DT_VALNUM)
1663	has_val_dt[DT_VALTAGIDX (dyn->d_tag)] = true;
1664      else if (dyn->d_tag <= DT_ADDRRNGHI
1665	       && DT_ADDRTAGIDX (dyn->d_tag) < DT_ADDRNUM)
1666	has_addr_dt[DT_ADDRTAGIDX (dyn->d_tag)] = true;
1667
1668      if (dyn->d_tag == DT_PLTREL && dyn->d_un.d_val != DT_REL
1669	  && dyn->d_un.d_val != DT_RELA)
1670	ERROR (gettext ("\
1671section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"),
1672	       idx, section_name (ebl, idx), cnt);
1673
1674      /* Check that addresses for entries are in loaded segments.  */
1675      switch (dyn->d_tag)
1676	{
1677	  size_t n;
1678	case DT_STRTAB:
1679	  /* We require the referenced section is the same as the one
1680	     specified in sh_link.  */
1681	  if (strshdr->sh_addr != dyn->d_un.d_val)
1682	    {
1683	      ERROR (gettext ("\
1684section [%2d] '%s': entry %zu: pointer does not match address of section [%2d] '%s' referenced by sh_link\n"),
1685		     idx, section_name (ebl, idx), cnt,
1686		     shdr->sh_link, section_name (ebl, shdr->sh_link));
1687	      break;
1688	    }
1689	  goto check_addr;
1690
1691	default:
1692	  if (dyn->d_tag < DT_ADDRRNGLO || dyn->d_tag > DT_ADDRRNGHI)
1693	    /* Value is no pointer.  */
1694	    break;
1695	  /* FALLTHROUGH */
1696
1697	case DT_AUXILIARY:
1698	case DT_FILTER:
1699	case DT_FINI:
1700	case DT_FINI_ARRAY:
1701	case DT_HASH:
1702	case DT_INIT:
1703	case DT_INIT_ARRAY:
1704	case DT_JMPREL:
1705	case DT_PLTGOT:
1706	case DT_REL:
1707	case DT_RELA:
1708	case DT_SYMBOLIC:
1709	case DT_SYMTAB:
1710	case DT_VERDEF:
1711	case DT_VERNEED:
1712	case DT_VERSYM:
1713	check_addr:
1714	  for (n = 0; n < phnum; ++n)
1715	    {
1716	      GElf_Phdr phdr_mem;
1717	      GElf_Phdr *phdr = gelf_getphdr (ebl->elf, n, &phdr_mem);
1718	      if (phdr != NULL && phdr->p_type == PT_LOAD
1719		  && phdr->p_vaddr <= dyn->d_un.d_ptr
1720		  && phdr->p_vaddr + phdr->p_memsz > dyn->d_un.d_ptr)
1721		break;
1722	    }
1723	  if (unlikely (n >= phnum))
1724	    {
1725	      char buf[50];
1726	      ERROR (gettext ("\
1727section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"),
1728		     idx, section_name (ebl, idx), cnt,
1729		     ebl_dynamic_tag_name (ebl, dyn->d_tag, buf,
1730					   sizeof (buf)));
1731	    }
1732	  break;
1733
1734	case DT_NEEDED:
1735	case DT_RPATH:
1736	case DT_RUNPATH:
1737	case DT_SONAME:
1738	  if (dyn->d_un.d_ptr >= strshdr->sh_size)
1739	    {
1740	      char buf[50];
1741	      ERROR (gettext ("\
1742section [%2d] '%s': entry %zu: %s value must be valid offset in section [%2d] '%s'\n"),
1743		     idx, section_name (ebl, idx), cnt,
1744		     ebl_dynamic_tag_name (ebl, dyn->d_tag, buf,
1745					   sizeof (buf)),
1746		     shdr->sh_link, section_name (ebl, shdr->sh_link));
1747	    }
1748	  break;
1749	}
1750    }
1751
1752  for (cnt = 1; cnt < DT_NUM; ++cnt)
1753    if (has_dt[cnt])
1754      {
1755	for (int inner = 0; inner < DT_NUM; ++inner)
1756	  if (dependencies[cnt][inner] && ! has_dt[inner])
1757	    {
1758	      char buf1[50];
1759	      char buf2[50];
1760
1761	      ERROR (gettext ("\
1762section [%2d] '%s': contains %s entry but not %s\n"),
1763		     idx, section_name (ebl, idx),
1764		     ebl_dynamic_tag_name (ebl, cnt, buf1, sizeof (buf1)),
1765		     ebl_dynamic_tag_name (ebl, inner, buf2, sizeof (buf2)));
1766	    }
1767      }
1768    else
1769      {
1770	if (mandatory[cnt])
1771	  {
1772	    char buf[50];
1773	    ERROR (gettext ("\
1774section [%2d] '%s': mandatory tag %s not present\n"),
1775		   idx, section_name (ebl, idx),
1776		   ebl_dynamic_tag_name (ebl, cnt, buf, sizeof (buf)));
1777	  }
1778      }
1779
1780  /* Make sure we have an hash table.  */
1781  if (!has_dt[DT_HASH] && !has_addr_dt[DT_ADDRTAGIDX (DT_GNU_HASH)])
1782    ERROR (gettext ("\
1783section [%2d] '%s': no hash section present\n"),
1784	   idx, section_name (ebl, idx));
1785
1786  /* The GNU-style hash table also needs a symbol table.  */
1787  if (!has_dt[DT_HASH] && has_addr_dt[DT_ADDRTAGIDX (DT_GNU_HASH)]
1788      && !has_dt[DT_SYMTAB])
1789    ERROR (gettext ("\
1790section [%2d] '%s': contains %s entry but not %s\n"),
1791	   idx, section_name (ebl, idx),
1792	   "DT_GNU_HASH", "DT_SYMTAB");
1793
1794  /* Check the rel/rela tags.  At least one group must be available.  */
1795  if ((has_dt[DT_RELA] || has_dt[DT_RELASZ] || has_dt[DT_RELAENT])
1796      && (!has_dt[DT_RELA] || !has_dt[DT_RELASZ] || !has_dt[DT_RELAENT]))
1797    ERROR (gettext ("\
1798section [%2d] '%s': not all of %s, %s, and %s are present\n"),
1799	   idx, section_name (ebl, idx),
1800	   "DT_RELA", "DT_RELASZ", "DT_RELAENT");
1801
1802  if ((has_dt[DT_REL] || has_dt[DT_RELSZ] || has_dt[DT_RELENT])
1803      && (!has_dt[DT_REL] || !has_dt[DT_RELSZ] || !has_dt[DT_RELENT]))
1804    ERROR (gettext ("\
1805section [%2d] '%s': not all of %s, %s, and %s are present\n"),
1806	   idx, section_name (ebl, idx),
1807	   "DT_REL", "DT_RELSZ", "DT_RELENT");
1808
1809  /* Check that all prelink sections are present if any of them is.  */
1810  if (has_val_dt[DT_VALTAGIDX (DT_GNU_PRELINKED)]
1811      || has_val_dt[DT_VALTAGIDX (DT_CHECKSUM)])
1812    {
1813      if (!has_val_dt[DT_VALTAGIDX (DT_GNU_PRELINKED)])
1814	ERROR (gettext ("\
1815section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"),
1816	       idx, section_name (ebl, idx), "DT_GNU_PRELINKED");
1817      if (!has_val_dt[DT_VALTAGIDX (DT_CHECKSUM)])
1818	ERROR (gettext ("\
1819section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"),
1820	       idx, section_name (ebl, idx), "DT_CHECKSUM");
1821
1822      /* Only DSOs can be marked like this.  */
1823      if (ehdr->e_type != ET_DYN)
1824	ERROR (gettext ("\
1825section [%2d] '%s': non-DSO file marked as dependency during prelink\n"),
1826	       idx, section_name (ebl, idx));
1827    }
1828
1829  if (has_val_dt[DT_VALTAGIDX (DT_GNU_CONFLICTSZ)]
1830      || has_val_dt[DT_VALTAGIDX (DT_GNU_LIBLISTSZ)]
1831      || has_addr_dt[DT_ADDRTAGIDX (DT_GNU_CONFLICT)]
1832      || has_addr_dt[DT_ADDRTAGIDX (DT_GNU_LIBLIST)])
1833    {
1834      if (!has_val_dt[DT_VALTAGIDX (DT_GNU_CONFLICTSZ)])
1835	ERROR (gettext ("\
1836section [%2d] '%s': %s tag missing in prelinked executable\n"),
1837	       idx, section_name (ebl, idx), "DT_GNU_CONFLICTSZ");
1838      if (!has_val_dt[DT_VALTAGIDX (DT_GNU_LIBLISTSZ)])
1839	ERROR (gettext ("\
1840section [%2d] '%s': %s tag missing in prelinked executable\n"),
1841	       idx, section_name (ebl, idx), "DT_GNU_LIBLISTSZ");
1842      if (!has_addr_dt[DT_ADDRTAGIDX (DT_GNU_CONFLICT)])
1843	ERROR (gettext ("\
1844section [%2d] '%s': %s tag missing in prelinked executable\n"),
1845	       idx, section_name (ebl, idx), "DT_GNU_CONFLICT");
1846      if (!has_addr_dt[DT_ADDRTAGIDX (DT_GNU_LIBLIST)])
1847	ERROR (gettext ("\
1848section [%2d] '%s': %s tag missing in prelinked executable\n"),
1849	       idx, section_name (ebl, idx), "DT_GNU_LIBLIST");
1850    }
1851}
1852
1853
1854static void
1855check_symtab_shndx (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
1856{
1857  if (ehdr->e_type != ET_REL)
1858    {
1859      ERROR (gettext ("\
1860section [%2d] '%s': only relocatable files can have extended section index\n"),
1861	     idx, section_name (ebl, idx));
1862      return;
1863    }
1864
1865  Elf_Scn *symscn = elf_getscn (ebl->elf, shdr->sh_link);
1866  GElf_Shdr symshdr_mem;
1867  GElf_Shdr *symshdr = gelf_getshdr (symscn, &symshdr_mem);
1868  if (symshdr != NULL && symshdr->sh_type != SHT_SYMTAB)
1869    ERROR (gettext ("\
1870section [%2d] '%s': extended section index section not for symbol table\n"),
1871	   idx, section_name (ebl, idx));
1872  Elf_Data *symdata = elf_getdata (symscn, NULL);
1873  if (symdata == NULL)
1874    ERROR (gettext ("cannot get data for symbol section\n"));
1875
1876  if (shdr->sh_entsize != sizeof (Elf32_Word))
1877    ERROR (gettext ("\
1878section [%2d] '%s': entry size does not match Elf32_Word\n"),
1879	   idx, section_name (ebl, idx));
1880
1881  if (symshdr != NULL
1882      && (shdr->sh_size / shdr->sh_entsize
1883	  < symshdr->sh_size / symshdr->sh_entsize))
1884    ERROR (gettext ("\
1885section [%2d] '%s': extended index table too small for symbol table\n"),
1886	   idx, section_name (ebl, idx));
1887
1888  if (shdr->sh_info != 0)
1889    ERROR (gettext ("section [%2d] '%s': sh_info not zero\n"),
1890	   idx, section_name (ebl, idx));
1891
1892  for (size_t cnt = idx + 1; cnt < shnum; ++cnt)
1893    {
1894      GElf_Shdr rshdr_mem;
1895      GElf_Shdr *rshdr = gelf_getshdr (elf_getscn (ebl->elf, cnt), &rshdr_mem);
1896      if (rshdr != NULL && rshdr->sh_type == SHT_SYMTAB_SHNDX
1897	  && rshdr->sh_link == shdr->sh_link)
1898	{
1899	  ERROR (gettext ("\
1900section [%2d] '%s': extended section index in section [%2zu] '%s' refers to same symbol table\n"),
1901		 idx, section_name (ebl, idx),
1902		 cnt, section_name (ebl, cnt));
1903	  break;
1904	}
1905    }
1906
1907  Elf_Data *data = elf_getdata (elf_getscn (ebl->elf, idx), NULL);
1908
1909  if (*((Elf32_Word *) data->d_buf) != 0)
1910    ERROR (gettext ("symbol 0 should have zero extended section index\n"));
1911
1912  for (size_t cnt = 1; cnt < data->d_size / sizeof (Elf32_Word); ++cnt)
1913    {
1914      Elf32_Word xndx = ((Elf32_Word *) data->d_buf)[cnt];
1915
1916      if (xndx != 0)
1917	{
1918	  GElf_Sym sym_data;
1919	  GElf_Sym *sym = gelf_getsym (symdata, cnt, &sym_data);
1920	  if (sym == NULL)
1921	    {
1922	      ERROR (gettext ("cannot get data for symbol %zu\n"), cnt);
1923	      continue;
1924	    }
1925
1926	  if (sym->st_shndx != SHN_XINDEX)
1927	    ERROR (gettext ("\
1928extended section index is %" PRIu32 " but symbol index is not XINDEX\n"),
1929		   (uint32_t) xndx);
1930	}
1931    }
1932}
1933
1934
1935static void
1936check_sysv_hash (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *data, int idx,
1937		 GElf_Shdr *symshdr)
1938{
1939  Elf32_Word nbucket = ((Elf32_Word *) data->d_buf)[0];
1940  Elf32_Word nchain = ((Elf32_Word *) data->d_buf)[1];
1941
1942  if (shdr->sh_size < (2 + nbucket + nchain) * shdr->sh_entsize)
1943    ERROR (gettext ("\
1944section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"),
1945	   idx, section_name (ebl, idx), (long int) shdr->sh_size,
1946	   (long int) ((2 + nbucket + nchain) * shdr->sh_entsize));
1947
1948  size_t maxidx = nchain;
1949
1950  if (symshdr != NULL)
1951    {
1952      size_t symsize = symshdr->sh_size / symshdr->sh_entsize;
1953
1954      if (nchain > symshdr->sh_size / symshdr->sh_entsize)
1955	ERROR (gettext ("section [%2d] '%s': chain array too large\n"),
1956	       idx, section_name (ebl, idx));
1957
1958      maxidx = symsize;
1959    }
1960
1961  size_t cnt;
1962  for (cnt = 2; cnt < 2 + nbucket; ++cnt)
1963    if (((Elf32_Word *) data->d_buf)[cnt] >= maxidx)
1964      ERROR (gettext ("\
1965section [%2d] '%s': hash bucket reference %zu out of bounds\n"),
1966	     idx, section_name (ebl, idx), cnt - 2);
1967
1968  for (; cnt < 2 + nbucket + nchain; ++cnt)
1969    if (((Elf32_Word *) data->d_buf)[cnt] >= maxidx)
1970      ERROR (gettext ("\
1971section [%2d] '%s': hash chain reference %zu out of bounds\n"),
1972	     idx, section_name (ebl, idx), cnt - 2 - nbucket);
1973}
1974
1975
1976static void
1977check_sysv_hash64 (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *data, int idx,
1978		 GElf_Shdr *symshdr)
1979{
1980  Elf64_Xword nbucket = ((Elf64_Xword *) data->d_buf)[0];
1981  Elf64_Xword nchain = ((Elf64_Xword *) data->d_buf)[1];
1982
1983  if (shdr->sh_size < (2 + nbucket + nchain) * shdr->sh_entsize)
1984    ERROR (gettext ("\
1985section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"),
1986	   idx, section_name (ebl, idx), (long int) shdr->sh_size,
1987	   (long int) ((2 + nbucket + nchain) * shdr->sh_entsize));
1988
1989  size_t maxidx = nchain;
1990
1991  if (symshdr != NULL)
1992    {
1993      size_t symsize = symshdr->sh_size / symshdr->sh_entsize;
1994
1995      if (nchain > symshdr->sh_size / symshdr->sh_entsize)
1996	ERROR (gettext ("section [%2d] '%s': chain array too large\n"),
1997	       idx, section_name (ebl, idx));
1998
1999      maxidx = symsize;
2000    }
2001
2002  size_t cnt;
2003  for (cnt = 2; cnt < 2 + nbucket; ++cnt)
2004    if (((Elf64_Xword *) data->d_buf)[cnt] >= maxidx)
2005      ERROR (gettext ("\
2006section [%2d] '%s': hash bucket reference %zu out of bounds\n"),
2007	     idx, section_name (ebl, idx), cnt - 2);
2008
2009  for (; cnt < 2 + nbucket + nchain; ++cnt)
2010    if (((Elf64_Xword *) data->d_buf)[cnt] >= maxidx)
2011      ERROR (gettext ("\
2012section [%2d] '%s': hash chain reference %" PRIu64 " out of bounds\n"),
2013	     idx, section_name (ebl, idx), (uint64_t) (cnt - 2 - nbucket));
2014}
2015
2016
2017static void
2018check_gnu_hash (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *data, int idx,
2019		GElf_Shdr *symshdr)
2020{
2021  Elf32_Word nbuckets = ((Elf32_Word *) data->d_buf)[0];
2022  Elf32_Word symbias = ((Elf32_Word *) data->d_buf)[1];
2023  Elf32_Word bitmask_words = ((Elf32_Word *) data->d_buf)[2];
2024
2025  if (!powerof2 (bitmask_words))
2026    ERROR (gettext ("\
2027section [%2d] '%s': bitmask size not power of 2: %u\n"),
2028	   idx, section_name (ebl, idx), bitmask_words);
2029
2030  size_t bitmask_idxmask = bitmask_words - 1;
2031  if (gelf_getclass (ebl->elf) == ELFCLASS64)
2032    bitmask_words *= 2;
2033  Elf32_Word shift = ((Elf32_Word *) data->d_buf)[3];
2034
2035  if (shdr->sh_size < (4 + bitmask_words + nbuckets) * sizeof (Elf32_Word))
2036    {
2037      ERROR (gettext ("\
2038section [%2d] '%s': hash table section is too small (is %ld, expected at least%ld)\n"),
2039	     idx, section_name (ebl, idx), (long int) shdr->sh_size,
2040	     (long int) ((4 + bitmask_words + nbuckets) * sizeof (Elf32_Word)));
2041      return;
2042    }
2043
2044  if (shift > 31)
2045    ERROR (gettext ("\
2046section [%2d] '%s': 2nd hash function shift too big: %u\n"),
2047	   idx, section_name (ebl, idx), shift);
2048
2049  size_t maxidx = shdr->sh_size / sizeof (Elf32_Word) - (4 + bitmask_words
2050							 + nbuckets);
2051
2052  if (symshdr != NULL)
2053    maxidx = MIN (maxidx, symshdr->sh_size / symshdr->sh_entsize);
2054
2055  /* We need the symbol section data.  */
2056  Elf_Data *symdata = elf_getdata (elf_getscn (ebl->elf, shdr->sh_link), NULL);
2057
2058  union
2059  {
2060    Elf32_Word *p32;
2061    Elf64_Xword *p64;
2062  } bitmask = { .p32 = &((Elf32_Word *) data->d_buf)[4] },
2063      collected = { .p32 = xcalloc (bitmask_words, sizeof (Elf32_Word)) };
2064
2065  size_t classbits = gelf_getclass (ebl->elf) == ELFCLASS32 ? 32 : 64;
2066
2067  size_t cnt;
2068  for (cnt = 4 + bitmask_words; cnt < 4 + bitmask_words + nbuckets; ++cnt)
2069    {
2070      Elf32_Word symidx = ((Elf32_Word *) data->d_buf)[cnt];
2071
2072      if (symidx == 0)
2073	continue;
2074
2075      if (symidx < symbias)
2076	{
2077	  ERROR (gettext ("\
2078section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"),
2079		 idx, section_name (ebl, idx), cnt - (4 + bitmask_words));
2080	  continue;
2081	}
2082
2083      while (symidx - symbias < maxidx)
2084	{
2085	  Elf32_Word chainhash = ((Elf32_Word *) data->d_buf)[4
2086							      + bitmask_words
2087							      + nbuckets
2088							      + symidx
2089							      - symbias];
2090
2091	  if (symdata != NULL)
2092	    {
2093	      /* Check that the referenced symbol is not undefined.  */
2094	      GElf_Sym sym_mem;
2095	      GElf_Sym *sym = gelf_getsym (symdata, symidx, &sym_mem);
2096	      if (sym != NULL && sym->st_shndx == SHN_UNDEF
2097		  && GELF_ST_TYPE (sym->st_info) != STT_FUNC)
2098		ERROR (gettext ("\
2099section [%2d] '%s': symbol %u referenced in chain for bucket %zu is undefined\n"),
2100		       idx, section_name (ebl, idx), symidx,
2101		       cnt - (4 + bitmask_words));
2102
2103	      const char *symname = elf_strptr (ebl->elf, symshdr->sh_link,
2104						sym->st_name);
2105	      if (symname != NULL)
2106		{
2107		  Elf32_Word hval = elf_gnu_hash (symname);
2108		  if ((hval & ~1u) != (chainhash & ~1u))
2109		    ERROR (gettext ("\
2110section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"),
2111			   idx, section_name (ebl, idx), symidx,
2112			   cnt - (4 + bitmask_words));
2113
2114		  /* Set the bits in the bitmask.  */
2115		  size_t maskidx = (hval / classbits) & bitmask_idxmask;
2116		  if (classbits == 32)
2117		    {
2118		      collected.p32[maskidx]
2119			|= UINT32_C (1) << (hval & (classbits - 1));
2120		      collected.p32[maskidx]
2121			|= UINT32_C (1) << ((hval >> shift) & (classbits - 1));
2122		    }
2123		  else
2124		    {
2125		      collected.p64[maskidx]
2126			|= UINT64_C (1) << (hval & (classbits - 1));
2127		      collected.p64[maskidx]
2128			|= UINT64_C (1) << ((hval >> shift) & (classbits - 1));
2129		    }
2130		}
2131	    }
2132
2133	  if ((chainhash & 1) != 0)
2134	    break;
2135
2136	  ++symidx;
2137	}
2138
2139      if (symidx - symbias >= maxidx)
2140	ERROR (gettext ("\
2141section [%2d] '%s': hash chain for bucket %zu out of bounds\n"),
2142	       idx, section_name (ebl, idx), cnt - (4 + bitmask_words));
2143      else if (symshdr != NULL
2144	       && symidx > symshdr->sh_size / symshdr->sh_entsize)
2145	ERROR (gettext ("\
2146section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"),
2147	       idx, section_name (ebl, idx), cnt - (4 + bitmask_words));
2148    }
2149
2150  if (memcmp (collected.p32, bitmask.p32, bitmask_words * sizeof (Elf32_Word)))
2151    ERROR (gettext ("\
2152section [%2d] '%s': bitmask does not match names in the hash table\n"),
2153	   idx, section_name (ebl, idx));
2154
2155  free (collected.p32);
2156}
2157
2158
2159static void
2160check_hash (int tag, Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
2161{
2162  if (ehdr->e_type == ET_REL)
2163    {
2164      ERROR (gettext ("\
2165section [%2d] '%s': relocatable files cannot have hash tables\n"),
2166	     idx, section_name (ebl, idx));
2167      return;
2168    }
2169
2170  Elf_Data *data = elf_getdata (elf_getscn (ebl->elf, idx), NULL);
2171  if (data == NULL)
2172    {
2173      ERROR (gettext ("section [%2d] '%s': cannot get section data\n"),
2174	     idx, section_name (ebl, idx));
2175      return;
2176    }
2177
2178  GElf_Shdr symshdr_mem;
2179  GElf_Shdr *symshdr = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
2180				     &symshdr_mem);
2181  if (symshdr != NULL && symshdr->sh_type != SHT_DYNSYM)
2182    ERROR (gettext ("\
2183section [%2d] '%s': hash table not for dynamic symbol table\n"),
2184	   idx, section_name (ebl, idx));
2185
2186  if (shdr->sh_entsize != (tag == SHT_GNU_HASH
2187			   ? (gelf_getclass (ebl->elf) == ELFCLASS32
2188			      ? sizeof (Elf32_Word) : 0)
2189			   : (size_t) ebl_sysvhash_entrysize (ebl)))
2190    ERROR (gettext ("\
2191section [%2d] '%s': hash table entry size incorrect\n"),
2192	   idx, section_name (ebl, idx));
2193
2194  if ((shdr->sh_flags & SHF_ALLOC) == 0)
2195    ERROR (gettext ("section [%2d] '%s': not marked to be allocated\n"),
2196	   idx, section_name (ebl, idx));
2197
2198  if (shdr->sh_size < (tag == SHT_GNU_HASH ? 4 : 2) * (shdr->sh_entsize ?: 4))
2199    {
2200      ERROR (gettext ("\
2201section [%2d] '%s': hash table has not even room for initial administrative entries\n"),
2202	     idx, section_name (ebl, idx));
2203      return;
2204    }
2205
2206  switch (tag)
2207    {
2208    case SHT_HASH:
2209      if (ebl_sysvhash_entrysize (ebl) == sizeof (Elf64_Xword))
2210	check_sysv_hash64 (ebl, shdr, data, idx, symshdr);
2211      else
2212	check_sysv_hash (ebl, shdr, data, idx, symshdr);
2213      break;
2214
2215    case SHT_GNU_HASH:
2216      check_gnu_hash (ebl, shdr, data, idx, symshdr);
2217      break;
2218
2219    default:
2220      assert (! "should not happen");
2221    }
2222}
2223
2224
2225/* Compare content of both hash tables, it must be identical.  */
2226static void
2227compare_hash_gnu_hash (Ebl *ebl, GElf_Ehdr *ehdr, size_t hash_idx,
2228		       size_t gnu_hash_idx)
2229{
2230  Elf_Scn *hash_scn = elf_getscn (ebl->elf, hash_idx);
2231  Elf_Data *hash_data = elf_getdata (hash_scn, NULL);
2232  GElf_Shdr hash_shdr_mem;
2233  GElf_Shdr *hash_shdr = gelf_getshdr (hash_scn, &hash_shdr_mem);
2234  Elf_Scn *gnu_hash_scn = elf_getscn (ebl->elf, gnu_hash_idx);
2235  Elf_Data *gnu_hash_data = elf_getdata (gnu_hash_scn, NULL);
2236  GElf_Shdr gnu_hash_shdr_mem;
2237  GElf_Shdr *gnu_hash_shdr = gelf_getshdr (gnu_hash_scn, &gnu_hash_shdr_mem);
2238
2239  if (hash_shdr == NULL || gnu_hash_shdr == NULL
2240      || hash_data == NULL || gnu_hash_data == NULL)
2241    /* None of these pointers should be NULL since we used the
2242       sections already.  We are careful nonetheless.  */
2243    return;
2244
2245  /* The link must point to the same symbol table.  */
2246  if (hash_shdr->sh_link != gnu_hash_shdr->sh_link)
2247    {
2248      ERROR (gettext ("\
2249sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"),
2250	     hash_idx, elf_strptr (ebl->elf, shstrndx, hash_shdr->sh_name),
2251	     gnu_hash_idx,
2252	     elf_strptr (ebl->elf, shstrndx, gnu_hash_shdr->sh_name));
2253      return;
2254    }
2255
2256  Elf_Scn *sym_scn = elf_getscn (ebl->elf, hash_shdr->sh_link);
2257  Elf_Data *sym_data = elf_getdata (sym_scn, NULL);
2258  GElf_Shdr sym_shdr_mem;
2259  GElf_Shdr *sym_shdr = gelf_getshdr (sym_scn, &sym_shdr_mem);
2260
2261  if (sym_data == NULL || sym_shdr == NULL)
2262    return;
2263
2264  int nentries = sym_shdr->sh_size / sym_shdr->sh_entsize;
2265  char *used = alloca (nentries);
2266  memset (used, '\0', nentries);
2267
2268  /* First go over the GNU_HASH table and mark the entries as used.  */
2269  const Elf32_Word *gnu_hasharr = (Elf32_Word *) gnu_hash_data->d_buf;
2270  Elf32_Word gnu_nbucket = gnu_hasharr[0];
2271  const int bitmap_factor = ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 1 : 2;
2272  const Elf32_Word *gnu_bucket = (gnu_hasharr
2273				  + (4 + gnu_hasharr[2] * bitmap_factor));
2274  const Elf32_Word *gnu_chain = gnu_bucket + gnu_hasharr[0] - gnu_hasharr[1];
2275
2276  for (Elf32_Word cnt = 0; cnt < gnu_nbucket; ++cnt)
2277    {
2278      Elf32_Word symidx = gnu_bucket[cnt];
2279      if (symidx != STN_UNDEF)
2280	do
2281	  used[symidx] |= 1;
2282	while ((gnu_chain[symidx++] & 1u) == 0);
2283    }
2284
2285  /* Now go over the old hash table and check that we cover the same
2286     entries.  */
2287  if (hash_shdr->sh_entsize == sizeof (Elf32_Word))
2288    {
2289      const Elf32_Word *hasharr = (Elf32_Word *) hash_data->d_buf;
2290      Elf32_Word nbucket = hasharr[0];
2291      const Elf32_Word *bucket = &hasharr[2];
2292      const Elf32_Word *chain = &hasharr[2 + nbucket];
2293
2294      for (Elf32_Word cnt = 0; cnt < nbucket; ++cnt)
2295	{
2296	  Elf32_Word symidx = bucket[cnt];
2297	  while (symidx != STN_UNDEF)
2298	    {
2299	      used[symidx] |= 2;
2300	      symidx = chain[symidx];
2301	    }
2302	}
2303    }
2304  else
2305    {
2306      const Elf64_Xword *hasharr = (Elf64_Xword *) hash_data->d_buf;
2307      Elf64_Xword nbucket = hasharr[0];
2308      const Elf64_Xword *bucket = &hasharr[2];
2309      const Elf64_Xword *chain = &hasharr[2 + nbucket];
2310
2311      for (Elf64_Xword cnt = 0; cnt < nbucket; ++cnt)
2312	{
2313	  Elf64_Xword symidx = bucket[cnt];
2314	  while (symidx != STN_UNDEF)
2315	    {
2316	      used[symidx] |= 2;
2317	      symidx = chain[symidx];
2318	    }
2319	}
2320    }
2321
2322  /* Now see which entries are not set in one or both hash tables
2323     (unless the symbol is undefined in which case it can be omitted
2324     in the new table format).  */
2325  if ((used[0] & 1) != 0)
2326    ERROR (gettext ("section [%2zu] '%s': reference to symbol index 0\n"),
2327	   gnu_hash_idx,
2328	   elf_strptr (ebl->elf, shstrndx, gnu_hash_shdr->sh_name));
2329  if ((used[0] & 2) != 0)
2330    ERROR (gettext ("section [%2zu] '%s': reference to symbol index 0\n"),
2331	   hash_idx, elf_strptr (ebl->elf, shstrndx, hash_shdr->sh_name));
2332
2333  for (int cnt = 1; cnt < nentries; ++cnt)
2334    if (used[cnt] != 0 && used[cnt] != 3)
2335      {
2336	if (used[cnt] == 1)
2337	  ERROR (gettext ("\
2338symbol %d referenced in new hash table in [%2zu] '%s' but not in old hash table in [%2zu] '%s'\n"),
2339		 cnt, gnu_hash_idx,
2340		 elf_strptr (ebl->elf, shstrndx, gnu_hash_shdr->sh_name),
2341		 hash_idx,
2342		 elf_strptr (ebl->elf, shstrndx, hash_shdr->sh_name));
2343	else
2344	  {
2345	    GElf_Sym sym_mem;
2346	    GElf_Sym *sym = gelf_getsym (sym_data, cnt, &sym_mem);
2347
2348	    if (sym != NULL && sym->st_shndx != STN_UNDEF)
2349	      ERROR (gettext ("\
2350symbol %d referenced in old hash table in [%2zu] '%s' but not in new hash table in [%2zu] '%s'\n"),
2351		     cnt, hash_idx,
2352		     elf_strptr (ebl->elf, shstrndx, hash_shdr->sh_name),
2353		     gnu_hash_idx,
2354		     elf_strptr (ebl->elf, shstrndx, gnu_hash_shdr->sh_name));
2355	  }
2356      }
2357}
2358
2359
2360static void
2361check_null (Ebl *ebl, GElf_Shdr *shdr, int idx)
2362{
2363#define TEST(name, extra) \
2364  if (extra && shdr->sh_##name != 0)					      \
2365    ERROR (gettext ("section [%2d] '%s': nonzero sh_%s for NULL section\n"),  \
2366	   idx, section_name (ebl, idx), #name)
2367
2368  TEST (name, 1);
2369  TEST (flags, 1);
2370  TEST (addr, 1);
2371  TEST (offset, 1);
2372  TEST (size, idx != 0);
2373  TEST (link, idx != 0);
2374  TEST (info, 1);
2375  TEST (addralign, 1);
2376  TEST (entsize, 1);
2377}
2378
2379
2380static void
2381check_group (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
2382{
2383  if (ehdr->e_type != ET_REL)
2384    {
2385      ERROR (gettext ("\
2386section [%2d] '%s': section groups only allowed in relocatable object files\n"),
2387	     idx, section_name (ebl, idx));
2388      return;
2389    }
2390
2391  /* Check that sh_link is an index of a symbol table.  */
2392  Elf_Scn *symscn = elf_getscn (ebl->elf, shdr->sh_link);
2393  GElf_Shdr symshdr_mem;
2394  GElf_Shdr *symshdr = gelf_getshdr (symscn, &symshdr_mem);
2395  if (symshdr == NULL)
2396    ERROR (gettext ("section [%2d] '%s': cannot get symbol table: %s\n"),
2397	   idx, section_name (ebl, idx), elf_errmsg (-1));
2398  else
2399    {
2400      if (symshdr->sh_type != SHT_SYMTAB)
2401	ERROR (gettext ("\
2402section [%2d] '%s': section reference in sh_link is no symbol table\n"),
2403	       idx, section_name (ebl, idx));
2404
2405      if (shdr->sh_info >= symshdr->sh_size / gelf_fsize (ebl->elf, ELF_T_SYM,
2406							  1, EV_CURRENT))
2407	ERROR (gettext ("\
2408section [%2d] '%s': invalid symbol index in sh_info\n"),
2409	       idx, section_name (ebl, idx));
2410
2411      if (shdr->sh_flags != 0)
2412	ERROR (gettext ("section [%2d] '%s': sh_flags not zero\n"),
2413	       idx, section_name (ebl, idx));
2414
2415      GElf_Sym sym_data;
2416      GElf_Sym *sym = gelf_getsym (elf_getdata (symscn, NULL), shdr->sh_info,
2417				   &sym_data);
2418      if (sym == NULL)
2419	ERROR (gettext ("\
2420section [%2d] '%s': cannot get symbol for signature\n"),
2421	       idx, section_name (ebl, idx));
2422      else if (strcmp (elf_strptr (ebl->elf, symshdr->sh_link, sym->st_name),
2423		       "") == 0)
2424	ERROR (gettext ("\
2425section [%2d] '%s': signature symbol cannot be empty string\n"),
2426	       idx, section_name (ebl, idx));
2427
2428      if (be_strict
2429	  && shdr->sh_entsize != elf32_fsize (ELF_T_WORD, 1, EV_CURRENT))
2430	ERROR (gettext ("section [%2d] '%s': sh_flags not set correctly\n"),
2431	       idx, section_name (ebl, idx));
2432    }
2433
2434  Elf_Data *data = elf_getdata (elf_getscn (ebl->elf, idx), NULL);
2435  if (data == NULL)
2436    ERROR (gettext ("section [%2d] '%s': cannot get data: %s\n"),
2437	   idx, section_name (ebl, idx), elf_errmsg (-1));
2438  else
2439    {
2440      size_t elsize = elf32_fsize (ELF_T_WORD, 1, EV_CURRENT);
2441      size_t cnt;
2442      Elf32_Word val;
2443
2444      if (data->d_size % elsize != 0)
2445	ERROR (gettext ("\
2446section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"),
2447	       idx, section_name (ebl, idx));
2448
2449      if (data->d_size < elsize)
2450	ERROR (gettext ("\
2451section [%2d] '%s': section group without flags word\n"),
2452	       idx, section_name (ebl, idx));
2453      else if (be_strict)
2454	{
2455	  if (data->d_size < 2 * elsize)
2456	    ERROR (gettext ("\
2457section [%2d] '%s': section group without member\n"),
2458		   idx, section_name (ebl, idx));
2459	  else if (data->d_size < 3 * elsize)
2460	    ERROR (gettext ("\
2461section [%2d] '%s': section group with only one member\n"),
2462		   idx, section_name (ebl, idx));
2463	}
2464
2465#if ALLOW_UNALIGNED
2466      val = *((Elf32_Word *) data->d_buf);
2467#else
2468      memcpy (&val, data->d_buf, elsize);
2469#endif
2470      if ((val & ~GRP_COMDAT) != 0)
2471	ERROR (gettext ("section [%2d] '%s': unknown section group flags\n"),
2472	       idx, section_name (ebl, idx));
2473
2474      for (cnt = elsize; cnt < data->d_size; cnt += elsize)
2475	{
2476#if ALLOW_UNALIGNED
2477	  val = *((Elf32_Word *) ((char *) data->d_buf + cnt));
2478#else
2479	  memcpy (&val, (char *) data->d_buf + cnt, elsize);
2480#endif
2481
2482	  if (val > shnum)
2483	    ERROR (gettext ("\
2484section [%2d] '%s': section index %Zu out of range\n"),
2485		   idx, section_name (ebl, idx), cnt / elsize);
2486	  else
2487	    {
2488	      GElf_Shdr refshdr_mem;
2489	      GElf_Shdr *refshdr = gelf_getshdr (elf_getscn (ebl->elf, val),
2490						 &refshdr_mem);
2491	      if (refshdr == NULL)
2492		ERROR (gettext ("\
2493section [%2d] '%s': cannot get section header for element %zu: %s\n"),
2494		       idx, section_name (ebl, idx), cnt / elsize,
2495		       elf_errmsg (-1));
2496	      else
2497		{
2498		  if (refshdr->sh_type == SHT_GROUP)
2499		    ERROR (gettext ("\
2500section [%2d] '%s': section group contains another group [%2d] '%s'\n"),
2501			   idx, section_name (ebl, idx),
2502			   val, section_name (ebl, val));
2503
2504		  if ((refshdr->sh_flags & SHF_GROUP) == 0)
2505		    ERROR (gettext ("\
2506section [%2d] '%s': element %Zu references section [%2d] '%s' without SHF_GROUP flag set\n"),
2507			   idx, section_name (ebl, idx), cnt / elsize,
2508			   val, section_name (ebl, val));
2509		}
2510
2511	      if (++scnref[val] == 2)
2512		ERROR (gettext ("\
2513section [%2d] '%s' is contained in more than one section group\n"),
2514		       val, section_name (ebl, val));
2515	    }
2516	}
2517    }
2518}
2519
2520
2521static const char *
2522section_flags_string (GElf_Word flags, char *buf, size_t len)
2523{
2524  if (flags == 0)
2525    return "none";
2526
2527  static const struct
2528  {
2529    GElf_Word flag;
2530    const char *name;
2531  } known_flags[] =
2532    {
2533#define NEWFLAG(name) { SHF_##name, #name }
2534      NEWFLAG (WRITE),
2535      NEWFLAG (ALLOC),
2536      NEWFLAG (EXECINSTR),
2537      NEWFLAG (MERGE),
2538      NEWFLAG (STRINGS),
2539      NEWFLAG (INFO_LINK),
2540      NEWFLAG (LINK_ORDER),
2541      NEWFLAG (OS_NONCONFORMING),
2542      NEWFLAG (GROUP),
2543      NEWFLAG (TLS)
2544    };
2545#undef NEWFLAG
2546  const size_t nknown_flags = sizeof (known_flags) / sizeof (known_flags[0]);
2547
2548  char *cp = buf;
2549
2550  for (size_t cnt = 0; cnt < nknown_flags; ++cnt)
2551    if (flags & known_flags[cnt].flag)
2552      {
2553	if (cp != buf && len > 1)
2554	  {
2555	    *cp++ = '|';
2556	    --len;
2557	  }
2558
2559	size_t ncopy = MIN (len - 1, strlen (known_flags[cnt].name));
2560	cp = mempcpy (cp, known_flags[cnt].name, ncopy);
2561	len -= ncopy;
2562
2563	flags ^= known_flags[cnt].flag;
2564      }
2565
2566  if (flags != 0 || cp == buf)
2567    snprintf (cp, len - 1, "%" PRIx64, (uint64_t) flags);
2568
2569  *cp = '\0';
2570
2571  return buf;
2572}
2573
2574
2575static int
2576has_copy_reloc (Ebl *ebl, unsigned int symscnndx, unsigned int symndx)
2577{
2578  /* First find the relocation section for the symbol table.  */
2579  Elf_Scn *scn = NULL;
2580  GElf_Shdr shdr_mem;
2581  GElf_Shdr *shdr = NULL;
2582  while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
2583    {
2584      shdr = gelf_getshdr (scn, &shdr_mem);
2585      if (shdr != NULL
2586	  && (shdr->sh_type == SHT_REL || shdr->sh_type == SHT_RELA)
2587	  && shdr->sh_link == symscnndx)
2588	/* Found the section.  */
2589	break;
2590    }
2591
2592  if (scn == NULL)
2593    return 0;
2594
2595  Elf_Data *data = elf_getdata (scn, NULL);
2596  if (data == NULL)
2597    return 0;
2598
2599  if (shdr->sh_type == SHT_REL)
2600    for (int i = 0; (size_t) i < shdr->sh_size / shdr->sh_entsize; ++i)
2601      {
2602	GElf_Rel rel_mem;
2603	GElf_Rel *rel = gelf_getrel (data, i, &rel_mem);
2604	if (rel == NULL)
2605	  continue;
2606
2607	if (GELF_R_SYM (rel->r_info) == symndx
2608	    && ebl_copy_reloc_p (ebl, GELF_R_TYPE (rel->r_info)))
2609	  return 1;
2610      }
2611  else
2612    for (int i = 0; (size_t) i < shdr->sh_size / shdr->sh_entsize; ++i)
2613      {
2614	GElf_Rela rela_mem;
2615	GElf_Rela *rela = gelf_getrela (data, i, &rela_mem);
2616	if (rela == NULL)
2617	  continue;
2618
2619	if (GELF_R_SYM (rela->r_info) == symndx
2620	    && ebl_copy_reloc_p (ebl, GELF_R_TYPE (rela->r_info)))
2621	  return 1;
2622      }
2623
2624  return 0;
2625}
2626
2627
2628static int
2629in_nobits_scn (Ebl *ebl, unsigned int shndx)
2630{
2631  GElf_Shdr shdr_mem;
2632  GElf_Shdr *shdr = gelf_getshdr (elf_getscn (ebl->elf, shndx), &shdr_mem);
2633  return shdr != NULL && shdr->sh_type == SHT_NOBITS;
2634}
2635
2636
2637static struct version_namelist
2638{
2639  const char *objname;
2640  const char *name;
2641  GElf_Versym ndx;
2642  enum { ver_def, ver_need } type;
2643  struct version_namelist *next;
2644} *version_namelist;
2645
2646
2647static int
2648add_version (const char *objname, const char *name, GElf_Versym ndx, int type)
2649{
2650  /* Check that there are no duplications.  */
2651  struct version_namelist *nlp = version_namelist;
2652  while (nlp != NULL)
2653    {
2654      if (((nlp->objname == NULL && objname == NULL)
2655	   || (nlp->objname != NULL && objname != NULL
2656	       && strcmp (nlp->objname, objname) == 0))
2657	  && strcmp (nlp->name, name) == 0)
2658	return nlp->type == ver_def ? 1 : -1;
2659      nlp = nlp->next;
2660    }
2661
2662  nlp = xmalloc (sizeof (*nlp));
2663  nlp->objname = objname;
2664  nlp->name = name;
2665  nlp->ndx = ndx;
2666  nlp->type = type;
2667  nlp->next = version_namelist;
2668  version_namelist = nlp;
2669
2670  return 0;
2671}
2672
2673
2674static void
2675check_versym (Ebl *ebl, int idx)
2676{
2677  Elf_Scn *scn = elf_getscn (ebl->elf, idx);
2678  GElf_Shdr shdr_mem;
2679  GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
2680  if (shdr == NULL)
2681    /* The error has already been reported.  */
2682    return;
2683
2684  Elf_Data *data = elf_getdata (scn, NULL);
2685  if (data == NULL)
2686    {
2687      ERROR (gettext ("section [%2d] '%s': cannot get section data\n"),
2688	     idx, section_name (ebl, idx));
2689      return;
2690    }
2691
2692  Elf_Scn *symscn = elf_getscn (ebl->elf, shdr->sh_link);
2693  GElf_Shdr symshdr_mem;
2694  GElf_Shdr *symshdr = gelf_getshdr (symscn, &symshdr_mem);
2695  if (symshdr == NULL)
2696    /* The error has already been reported.  */
2697    return;
2698
2699  if (symshdr->sh_type != SHT_DYNSYM)
2700    {
2701      ERROR (gettext ("\
2702section [%2d] '%s' refers in sh_link to section [%2d] '%s' which is no dynamic symbol table\n"),
2703	     idx, section_name (ebl, idx),
2704	     shdr->sh_link, section_name (ebl, shdr->sh_link));
2705      return;
2706    }
2707
2708  /* The number of elements in the version symbol table must be the
2709     same as the number of symbols.  */
2710  if (shdr->sh_size / shdr->sh_entsize
2711      != symshdr->sh_size / symshdr->sh_entsize)
2712    ERROR (gettext ("\
2713section [%2d] '%s' has different number of entries than symbol table [%2d] '%s'\n"),
2714	   idx, section_name (ebl, idx),
2715	   shdr->sh_link, section_name (ebl, shdr->sh_link));
2716
2717  Elf_Data *symdata = elf_getdata (symscn, NULL);
2718  if (symdata == NULL)
2719    /* The error has already been reported.  */
2720    return;
2721
2722  for (int cnt = 1; (size_t) cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
2723    {
2724      GElf_Versym versym_mem;
2725      GElf_Versym *versym = gelf_getversym (data, cnt, &versym_mem);
2726      if (versym == NULL)
2727	{
2728	  ERROR (gettext ("\
2729section [%2d] '%s': symbol %d: cannot read version data\n"),
2730		 idx, section_name (ebl, idx), cnt);
2731	  break;
2732	}
2733
2734      GElf_Sym sym_mem;
2735      GElf_Sym *sym = gelf_getsym (symdata, cnt, &sym_mem);
2736      if (sym == NULL)
2737	/* Already reported elsewhere.  */
2738	continue;
2739
2740      if (*versym == VER_NDX_GLOBAL)
2741	{
2742	  /* Global symbol.  Make sure it is not defined as local.  */
2743	  if (GELF_ST_BIND (sym->st_info) == STB_LOCAL)
2744	    ERROR (gettext ("\
2745section [%2d] '%s': symbol %d: local symbol with global scope\n"),
2746		   idx, section_name (ebl, idx), cnt);
2747	}
2748      else if (*versym != VER_NDX_LOCAL)
2749	{
2750	  /* Versioned symbol.  Make sure it is not defined as local.  */
2751	  if (!gnuld && GELF_ST_BIND (sym->st_info) == STB_LOCAL)
2752	    ERROR (gettext ("\
2753section [%2d] '%s': symbol %d: local symbol with version\n"),
2754		   idx, section_name (ebl, idx), cnt);
2755
2756	  /* Look through the list of defined versions and locate the
2757	     index we need for this symbol.  */
2758	  struct version_namelist *runp = version_namelist;
2759	  while (runp != NULL)
2760	    if (runp->ndx == (*versym & (GElf_Versym) 0x7fff))
2761	      break;
2762	    else
2763	      runp = runp->next;
2764
2765	  if (runp == NULL)
2766	    ERROR (gettext ("\
2767section [%2d] '%s': symbol %d: invalid version index %d\n"),
2768		   idx, section_name (ebl, idx), cnt, (int) *versym);
2769	  else if (sym->st_shndx == SHN_UNDEF
2770		   && runp->type == ver_def)
2771	    ERROR (gettext ("\
2772section [%2d] '%s': symbol %d: version index %d is for defined version\n"),
2773		   idx, section_name (ebl, idx), cnt, (int) *versym);
2774	  else if (sym->st_shndx != SHN_UNDEF
2775		   && runp->type == ver_need)
2776	    {
2777	      /* Unless this symbol has a copy relocation associated
2778		 this must not happen.  */
2779	      if (!has_copy_reloc (ebl, shdr->sh_link, cnt)
2780		  && !in_nobits_scn (ebl, sym->st_shndx))
2781		ERROR (gettext ("\
2782section [%2d] '%s': symbol %d: version index %d is for requested version\n"),
2783		       idx, section_name (ebl, idx), cnt, (int) *versym);
2784	    }
2785	}
2786    }
2787}
2788
2789
2790static int
2791unknown_dependency_p (Elf *elf, const char *fname)
2792{
2793  GElf_Phdr phdr_mem;
2794  GElf_Phdr *phdr = NULL;
2795
2796  unsigned int i;
2797  for (i = 0; i < phnum; ++i)
2798    if ((phdr = gelf_getphdr (elf, i, &phdr_mem)) != NULL
2799	&& phdr->p_type == PT_DYNAMIC)
2800      break;
2801
2802  if (i == phnum)
2803    return 1;
2804  assert (phdr != NULL);
2805  Elf_Scn *scn = gelf_offscn (elf, phdr->p_offset);
2806  GElf_Shdr shdr_mem;
2807  GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
2808  Elf_Data *data = elf_getdata (scn, NULL);
2809  if (shdr != NULL && shdr->sh_type == SHT_DYNAMIC && data != NULL)
2810    for (size_t j = 0; j < shdr->sh_size / shdr->sh_entsize; ++j)
2811      {
2812	GElf_Dyn dyn_mem;
2813	GElf_Dyn *dyn = gelf_getdyn (data, j, &dyn_mem);
2814	if (dyn != NULL && dyn->d_tag == DT_NEEDED)
2815	  {
2816	    const char *str = elf_strptr (elf, shdr->sh_link, dyn->d_un.d_val);
2817	    if (str != NULL && strcmp (str, fname) == 0)
2818	      /* Found it.  */
2819	      return 0;
2820	  }
2821      }
2822
2823  return 1;
2824}
2825
2826
2827static unsigned int nverneed;
2828
2829static void
2830check_verneed (Ebl *ebl, GElf_Shdr *shdr, int idx)
2831{
2832  if (++nverneed == 2)
2833    ERROR (gettext ("more than one version reference section present\n"));
2834
2835  GElf_Shdr strshdr_mem;
2836  GElf_Shdr *strshdr = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
2837				     &strshdr_mem);
2838  if (strshdr == NULL)
2839    return;
2840  if (strshdr->sh_type != SHT_STRTAB)
2841    ERROR (gettext ("\
2842section [%2d] '%s': sh_link does not link to string table\n"),
2843	   idx, section_name (ebl, idx));
2844
2845  Elf_Data *data = elf_getdata (elf_getscn (ebl->elf, idx), NULL);
2846  if (data == NULL)
2847    {
2848      ERROR (gettext ("section [%2d] '%s': cannot get section data\n"),
2849	     idx, section_name (ebl, idx));
2850      return;
2851    }
2852  unsigned int offset = 0;
2853  for (int cnt = shdr->sh_info; --cnt >= 0; )
2854    {
2855      /* Get the data at the next offset.  */
2856      GElf_Verneed needmem;
2857      GElf_Verneed *need = gelf_getverneed (data, offset, &needmem);
2858      if (need == NULL)
2859	break;
2860
2861      unsigned int auxoffset = offset + need->vn_aux;
2862
2863      if (need->vn_version != EV_CURRENT)
2864	ERROR (gettext ("\
2865section [%2d] '%s': entry %d has wrong version %d\n"),
2866	       idx, section_name (ebl, idx), cnt, (int) need->vn_version);
2867
2868      if (need->vn_cnt > 0 && need->vn_aux < gelf_fsize (ebl->elf, ELF_T_VNEED,
2869							 1, EV_CURRENT))
2870	ERROR (gettext ("\
2871section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"),
2872	       idx, section_name (ebl, idx), cnt);
2873
2874      const char *libname = elf_strptr (ebl->elf, shdr->sh_link,
2875					need->vn_file);
2876      if (libname == NULL)
2877	{
2878	  ERROR (gettext ("\
2879section [%2d] '%s': entry %d has invalid file reference\n"),
2880		 idx, section_name (ebl, idx), cnt);
2881	  goto next_need;
2882	}
2883
2884      /* Check that there is a DT_NEEDED entry for the referenced library.  */
2885      if (unknown_dependency_p (ebl->elf, libname))
2886	ERROR (gettext ("\
2887section [%2d] '%s': entry %d references unknown dependency\n"),
2888	       idx, section_name (ebl, idx), cnt);
2889
2890      for (int cnt2 = need->vn_cnt; --cnt2 >= 0; )
2891	{
2892	  GElf_Vernaux auxmem;
2893	  GElf_Vernaux *aux = gelf_getvernaux (data, auxoffset, &auxmem);
2894	  if (aux == NULL)
2895	    break;
2896
2897	  if ((aux->vna_flags & ~VER_FLG_WEAK) != 0)
2898	    ERROR (gettext ("\
2899section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"),
2900		   idx, section_name (ebl, idx), need->vn_cnt - cnt2, cnt);
2901
2902	  const char *verstr = elf_strptr (ebl->elf, shdr->sh_link,
2903					   aux->vna_name);
2904	  if (verstr == NULL)
2905	    ERROR (gettext ("\
2906section [%2d] '%s': auxiliary entry %d of entry %d has invalid name reference\n"),
2907		   idx, section_name (ebl, idx), need->vn_cnt - cnt2, cnt);
2908	  else
2909	    {
2910	      GElf_Word hashval = elf_hash (verstr);
2911	      if (hashval != aux->vna_hash)
2912		ERROR (gettext ("\
2913section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: %#x, expected %#x\n"),
2914		       idx, section_name (ebl, idx), need->vn_cnt - cnt2,
2915		       cnt, (int) hashval, (int) aux->vna_hash);
2916
2917	      int res = add_version (libname, verstr, aux->vna_other,
2918				     ver_need);
2919	      if (unlikely (res !=0))
2920		{
2921		  assert (res > 0);
2922		  ERROR (gettext ("\
2923section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version name '%s'\n"),
2924			 idx, section_name (ebl, idx), need->vn_cnt - cnt2,
2925			 cnt, verstr);
2926		}
2927	    }
2928
2929	  if ((aux->vna_next != 0 || cnt2 > 0)
2930	      && aux->vna_next < gelf_fsize (ebl->elf, ELF_T_VNAUX, 1,
2931					     EV_CURRENT))
2932	    {
2933	      ERROR (gettext ("\
2934section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"),
2935		     idx, section_name (ebl, idx), need->vn_cnt - cnt2, cnt);
2936	      break;
2937	    }
2938
2939	  auxoffset += MAX (aux->vna_next,
2940			    gelf_fsize (ebl->elf, ELF_T_VNAUX, 1, EV_CURRENT));
2941	}
2942
2943      /* Find the next offset.  */
2944    next_need:
2945      offset += need->vn_next;
2946
2947      if ((need->vn_next != 0 || cnt > 0)
2948	  && offset < auxoffset)
2949	ERROR (gettext ("\
2950section [%2d] '%s': entry %d has invalid offset to next entry\n"),
2951	       idx, section_name (ebl, idx), cnt);
2952    }
2953}
2954
2955
2956static unsigned int nverdef;
2957
2958static void
2959check_verdef (Ebl *ebl, GElf_Shdr *shdr, int idx)
2960{
2961  if (++nverdef == 2)
2962    ERROR (gettext ("more than one version definition section present\n"));
2963
2964  GElf_Shdr strshdr_mem;
2965  GElf_Shdr *strshdr = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
2966				     &strshdr_mem);
2967  if (strshdr == NULL)
2968    return;
2969  if (strshdr->sh_type != SHT_STRTAB)
2970    ERROR (gettext ("\
2971section [%2d] '%s': sh_link does not link to string table\n"),
2972	   idx, section_name (ebl, idx));
2973
2974  Elf_Data *data = elf_getdata (elf_getscn (ebl->elf, idx), NULL);
2975  if (data == NULL)
2976    {
2977    no_data:
2978      ERROR (gettext ("section [%2d] '%s': cannot get section data\n"),
2979	     idx, section_name (ebl, idx));
2980      return;
2981    }
2982
2983  /* Iterate over all version definition entries.  We check that there
2984     is a BASE entry and that each index is unique.  To do the later
2985     we collection the information in a list which is later
2986     examined.  */
2987  struct namelist
2988  {
2989    const char *name;
2990    struct namelist *next;
2991  } *namelist = NULL;
2992  struct namelist *refnamelist = NULL;
2993
2994  bool has_base = false;
2995  unsigned int offset = 0;
2996  for (int cnt = shdr->sh_info; --cnt >= 0; )
2997    {
2998      /* Get the data at the next offset.  */
2999      GElf_Verdef defmem;
3000      GElf_Verdef *def = gelf_getverdef (data, offset, &defmem);
3001      if (def == NULL)
3002	goto no_data;
3003
3004      if ((def->vd_flags & VER_FLG_BASE) != 0)
3005	{
3006	  if (has_base)
3007	    ERROR (gettext ("\
3008section [%2d] '%s': more than one BASE definition\n"),
3009		   idx, section_name (ebl, idx));
3010	  if (def->vd_ndx != VER_NDX_GLOBAL)
3011	    ERROR (gettext ("\
3012section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"),
3013		   idx, section_name (ebl, idx));
3014	  has_base = true;
3015	}
3016      if ((def->vd_flags & ~(VER_FLG_BASE|VER_FLG_WEAK)) != 0)
3017	ERROR (gettext ("\
3018section [%2d] '%s': entry %d has unknown flag\n"),
3019	       idx, section_name (ebl, idx), cnt);
3020
3021      if (def->vd_version != EV_CURRENT)
3022	ERROR (gettext ("\
3023section [%2d] '%s': entry %d has wrong version %d\n"),
3024	       idx, section_name (ebl, idx), cnt, (int) def->vd_version);
3025
3026      if (def->vd_cnt > 0 && def->vd_aux < gelf_fsize (ebl->elf, ELF_T_VDEF,
3027						       1, EV_CURRENT))
3028	ERROR (gettext ("\
3029section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"),
3030	       idx, section_name (ebl, idx), cnt);
3031
3032      unsigned int auxoffset = offset + def->vd_aux;
3033      GElf_Verdaux auxmem;
3034      GElf_Verdaux *aux = gelf_getverdaux (data, auxoffset, &auxmem);
3035      if (aux == NULL)
3036	goto no_data;
3037
3038      const char *name = elf_strptr (ebl->elf, shdr->sh_link, aux->vda_name);
3039      if (name == NULL)
3040	{
3041	  ERROR (gettext ("\
3042section [%2d] '%s': entry %d has invalid name reference\n"),
3043		 idx, section_name (ebl, idx), cnt);
3044	  goto next_def;
3045	}
3046      GElf_Word hashval = elf_hash (name);
3047      if (def->vd_hash != hashval)
3048	ERROR (gettext ("\
3049section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"),
3050	       idx, section_name (ebl, idx), cnt, (int) hashval,
3051	       (int) def->vd_hash);
3052
3053      int res = add_version (NULL, name, def->vd_ndx, ver_def);
3054      if (unlikely (res !=0))
3055	{
3056	  assert (res > 0);
3057	  ERROR (gettext ("\
3058section [%2d] '%s': entry %d has duplicate version name '%s'\n"),
3059		 idx, section_name (ebl, idx), cnt, name);
3060	}
3061
3062      struct namelist *newname = alloca (sizeof (*newname));
3063      newname->name = name;
3064      newname->next = namelist;
3065      namelist = newname;
3066
3067      auxoffset += aux->vda_next;
3068      for (int cnt2 = 1; cnt2 < def->vd_cnt; ++cnt2)
3069	{
3070	  aux = gelf_getverdaux (data, auxoffset, &auxmem);
3071	  if (aux == NULL)
3072	    goto no_data;
3073
3074	  name = elf_strptr (ebl->elf, shdr->sh_link, aux->vda_name);
3075	  if (name == NULL)
3076	    ERROR (gettext ("\
3077section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"),
3078		   idx, section_name (ebl, idx), cnt);
3079	  else
3080	    {
3081	      newname = alloca (sizeof (*newname));
3082	      newname->name = name;
3083	      newname->next = refnamelist;
3084	      refnamelist = newname;
3085	    }
3086
3087	  if ((aux->vda_next != 0 || cnt2 + 1 < def->vd_cnt)
3088	      && aux->vda_next < gelf_fsize (ebl->elf, ELF_T_VDAUX, 1,
3089					     EV_CURRENT))
3090	    {
3091	      ERROR (gettext ("\
3092section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"),
3093		     idx, section_name (ebl, idx), cnt);
3094	      break;
3095	    }
3096
3097	  auxoffset += MAX (aux->vda_next,
3098			    gelf_fsize (ebl->elf, ELF_T_VDAUX, 1, EV_CURRENT));
3099	}
3100
3101      /* Find the next offset.  */
3102    next_def:
3103      offset += def->vd_next;
3104
3105      if ((def->vd_next != 0 || cnt > 0)
3106	  && offset < auxoffset)
3107	ERROR (gettext ("\
3108section [%2d] '%s': entry %d has invalid offset to next entry\n"),
3109	       idx, section_name (ebl, idx), cnt);
3110    }
3111
3112  if (!has_base)
3113    ERROR (gettext ("section [%2d] '%s': no BASE definition\n"),
3114	   idx, section_name (ebl, idx));
3115
3116  /* Check whether the referenced names are available.  */
3117  while (namelist != NULL)
3118    {
3119      struct version_namelist *runp = version_namelist;
3120      while (runp != NULL)
3121	{
3122	  if (runp->type == ver_def
3123	      && strcmp (runp->name, namelist->name) == 0)
3124	    break;
3125	  runp = runp->next;
3126	}
3127
3128      if (runp == NULL)
3129	ERROR (gettext ("\
3130section [%2d] '%s': unknown parent version '%s'\n"),
3131	       idx, section_name (ebl, idx), namelist->name);
3132
3133      namelist = namelist->next;
3134    }
3135}
3136
3137static void
3138check_attributes (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
3139{
3140  if (shdr->sh_size == 0)
3141    {
3142      ERROR (gettext ("section [%2d] '%s': empty object attributes section\n"),
3143	     idx, section_name (ebl, idx));
3144      return;
3145    }
3146
3147  Elf_Data *data = elf_rawdata (elf_getscn (ebl->elf, idx), NULL);
3148  if (data == NULL || data->d_size == 0)
3149    {
3150      ERROR (gettext ("section [%2d] '%s': cannot get section data\n"),
3151	     idx, section_name (ebl, idx));
3152      return;
3153    }
3154
3155  inline size_t pos (const unsigned char *p)
3156  {
3157    return p - (const unsigned char *) data->d_buf;
3158  }
3159
3160  const unsigned char *p = data->d_buf;
3161  if (*p++ != 'A')
3162    {
3163      ERROR (gettext ("section [%2d] '%s': unrecognized attribute format\n"),
3164	     idx, section_name (ebl, idx));
3165      return;
3166    }
3167
3168  inline size_t left (void)
3169  {
3170    return (const unsigned char *) data->d_buf + data->d_size - p;
3171  }
3172
3173  while (left () >= 4)
3174    {
3175      uint32_t len;
3176      memcpy (&len, p, sizeof len);
3177
3178      if (len == 0)
3179	ERROR (gettext ("\
3180section [%2d] '%s': offset %zu: zero length field in attribute section\n"),
3181	       idx, section_name (ebl, idx), pos (p));
3182
3183      if (MY_ELFDATA != ehdr->e_ident[EI_DATA])
3184	CONVERT (len);
3185
3186      if (len > left ())
3187	{
3188	  ERROR (gettext ("\
3189section [%2d] '%s': offset %zu: invalid length in attribute section\n"),
3190		 idx, section_name (ebl, idx), pos (p));
3191	  break;
3192	}
3193
3194      const unsigned char *name = p + sizeof len;
3195      p += len;
3196
3197      unsigned const char *q = memchr (name, '\0', len);
3198      if (q == NULL)
3199	{
3200	  ERROR (gettext ("\
3201section [%2d] '%s': offset %zu: unterminated vendor name string\n"),
3202		 idx, section_name (ebl, idx), pos (p));
3203	  continue;
3204	}
3205      ++q;
3206
3207      if (q - name == sizeof "gnu" && !memcmp (name, "gnu", sizeof "gnu"))
3208	while (q < p)
3209	  {
3210	    unsigned const char *chunk = q;
3211
3212	    unsigned int subsection_tag;
3213	    get_uleb128 (subsection_tag, q);
3214
3215	    if (q >= p)
3216	      {
3217		ERROR (gettext ("\
3218section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"),
3219		       idx, section_name (ebl, idx), pos (chunk));
3220		break;
3221	      }
3222
3223	    uint32_t subsection_len;
3224	    if (p - q < (ptrdiff_t) sizeof subsection_len)
3225	      {
3226		ERROR (gettext ("\
3227section [%2d] '%s': offset %zu: truncated attribute section\n"),
3228		       idx, section_name (ebl, idx), pos (q));
3229		break;
3230	      }
3231
3232	    memcpy (&subsection_len, q, sizeof subsection_len);
3233	    if (subsection_len == 0)
3234	      {
3235		ERROR (gettext ("\
3236section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"),
3237		       idx, section_name (ebl, idx), pos (q));
3238
3239		q += sizeof subsection_len;
3240		continue;
3241	      }
3242
3243	    if (MY_ELFDATA != ehdr->e_ident[EI_DATA])
3244	      CONVERT (subsection_len);
3245
3246	    if (p - chunk < (ptrdiff_t) subsection_len)
3247	      {
3248		ERROR (gettext ("\
3249section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"),
3250		       idx, section_name (ebl, idx), pos (q));
3251		break;
3252	      }
3253
3254	    const unsigned char *subsection_end = chunk + subsection_len;
3255	    chunk = q;
3256	    q = subsection_end;
3257
3258	    if (subsection_tag != 1) /* Tag_File */
3259	      ERROR (gettext ("\
3260section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"),
3261		     idx, section_name (ebl, idx), pos (chunk), subsection_tag);
3262	    else
3263	      {
3264		chunk += sizeof subsection_len;
3265		while (chunk < q)
3266		  {
3267		    unsigned int tag;
3268		    get_uleb128 (tag, chunk);
3269
3270		    uint64_t value = 0;
3271		    const unsigned char *r = chunk;
3272		    if (tag == 32 || (tag & 1) == 0)
3273		      {
3274			get_uleb128 (value, r);
3275			if (r > q)
3276			  {
3277			    ERROR (gettext ("\
3278section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"),
3279				   idx, section_name (ebl, idx), pos (chunk));
3280			    break;
3281			  }
3282		      }
3283		    if (tag == 32 || (tag & 1) != 0)
3284		      {
3285			r = memchr (r, '\0', q - r);
3286			if (r == NULL)
3287			  {
3288			    ERROR (gettext ("\
3289section [%2d] '%s': offset %zu: unterminated string in attribute\n"),
3290				   idx, section_name (ebl, idx), pos (chunk));
3291			    break;
3292			  }
3293			++r;
3294		      }
3295
3296		    const char *tag_name = NULL;
3297		    const char *value_name = NULL;
3298		    if (!ebl_check_object_attribute (ebl, (const char *) name,
3299						     tag, value,
3300						     &tag_name, &value_name))
3301		      ERROR (gettext ("\
3302section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"),
3303			     idx, section_name (ebl, idx), pos (chunk), tag);
3304		    else if ((tag & 1) == 0 && value_name == NULL)
3305		      ERROR (gettext ("\
3306section [%2d] '%s': offset %zu: unrecognized %s attribute value %" PRIu64 "\n"),
3307			     idx, section_name (ebl, idx), pos (chunk),
3308			     tag_name, value);
3309
3310		    chunk = r;
3311		  }
3312	      }
3313	  }
3314      else
3315	ERROR (gettext ("\
3316section [%2d] '%s': offset %zu: vendor '%s' unknown\n"),
3317	       idx, section_name (ebl, idx), pos (p), name);
3318    }
3319
3320  if (left () != 0)
3321    ERROR (gettext ("\
3322section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"),
3323	   idx, section_name (ebl, idx), pos (p));
3324}
3325
3326static bool has_loadable_segment;
3327static bool has_interp_segment;
3328
3329static const struct
3330{
3331  const char *name;
3332  size_t namelen;
3333  GElf_Word type;
3334  enum { unused, exact, atleast, exact_or_gnuld } attrflag;
3335  GElf_Word attr;
3336  GElf_Word attr2;
3337} special_sections[] =
3338  {
3339    /* See figure 4-14 in the gABI.  */
3340    { ".bss", 5, SHT_NOBITS, exact, SHF_ALLOC | SHF_WRITE, 0 },
3341    { ".comment", 8, SHT_PROGBITS, atleast, 0, SHF_MERGE | SHF_STRINGS },
3342    { ".data", 6, SHT_PROGBITS, exact, SHF_ALLOC | SHF_WRITE, 0 },
3343    { ".data1", 7, SHT_PROGBITS, exact, SHF_ALLOC | SHF_WRITE, 0 },
3344    { ".debug_str", 11, SHT_PROGBITS, exact_or_gnuld, SHF_MERGE | SHF_STRINGS, 0 },
3345    { ".debug", 6, SHT_PROGBITS, exact, 0, 0 },
3346    { ".dynamic", 9, SHT_DYNAMIC, atleast, SHF_ALLOC, SHF_WRITE },
3347    { ".dynstr", 8, SHT_STRTAB, exact, SHF_ALLOC, 0 },
3348    { ".dynsym", 8, SHT_DYNSYM, exact, SHF_ALLOC, 0 },
3349    { ".fini", 6, SHT_PROGBITS, exact, SHF_ALLOC | SHF_EXECINSTR, 0 },
3350    { ".fini_array", 12, SHT_FINI_ARRAY, exact, SHF_ALLOC | SHF_WRITE, 0 },
3351    { ".got", 5, SHT_PROGBITS, unused, 0, 0 }, // XXX more info?
3352    { ".hash", 6, SHT_HASH, exact, SHF_ALLOC, 0 },
3353    { ".init", 6, SHT_PROGBITS, exact, SHF_ALLOC | SHF_EXECINSTR, 0 },
3354    { ".init_array", 12, SHT_INIT_ARRAY, exact, SHF_ALLOC | SHF_WRITE, 0 },
3355    { ".interp", 8, SHT_PROGBITS, atleast, 0, SHF_ALLOC }, // XXX more tests?
3356    { ".line", 6, SHT_PROGBITS, exact, 0, 0 },
3357    { ".note", 6, SHT_NOTE, atleast, 0, SHF_ALLOC },
3358    { ".plt", 5, SHT_PROGBITS, unused, 0, 0 }, // XXX more tests
3359    { ".preinit_array", 15, SHT_PREINIT_ARRAY, exact, SHF_ALLOC | SHF_WRITE, 0 },
3360    { ".rela", 5, SHT_RELA, atleast, 0, SHF_ALLOC }, // XXX more tests
3361    { ".rel", 4, SHT_REL, atleast, 0, SHF_ALLOC }, // XXX more tests
3362    { ".rodata", 8, SHT_PROGBITS, atleast, SHF_ALLOC, SHF_MERGE | SHF_STRINGS },
3363    { ".rodata1", 9, SHT_PROGBITS, atleast, SHF_ALLOC, SHF_MERGE | SHF_STRINGS },
3364    { ".shstrtab", 10, SHT_STRTAB, exact, 0, 0 },
3365    { ".strtab", 8, SHT_STRTAB, atleast, 0, SHF_ALLOC }, // XXX more tests
3366    { ".symtab", 8, SHT_SYMTAB, atleast, 0, SHF_ALLOC }, // XXX more tests
3367    { ".symtab_shndx", 14, SHT_SYMTAB_SHNDX, atleast, 0, SHF_ALLOC }, // XXX more tests
3368    { ".tbss", 6, SHT_NOBITS, exact, SHF_ALLOC | SHF_WRITE | SHF_TLS, 0 },
3369    { ".tdata", 7, SHT_PROGBITS, exact, SHF_ALLOC | SHF_WRITE | SHF_TLS, 0 },
3370    { ".tdata1", 8, SHT_PROGBITS, exact, SHF_ALLOC | SHF_WRITE | SHF_TLS, 0 },
3371    { ".text", 6, SHT_PROGBITS, exact, SHF_ALLOC | SHF_EXECINSTR, 0 },
3372
3373    /* The following are GNU extensions.  */
3374    { ".gnu.version", 13, SHT_GNU_versym, exact, SHF_ALLOC, 0 },
3375    { ".gnu.version_d", 15, SHT_GNU_verdef, exact, SHF_ALLOC, 0 },
3376    { ".gnu.version_r", 15, SHT_GNU_verneed, exact, SHF_ALLOC, 0 },
3377    { ".gnu.attributes", 16, SHT_GNU_ATTRIBUTES, exact, 0, 0 },
3378  };
3379#define nspecial_sections \
3380  (sizeof (special_sections) / sizeof (special_sections[0]))
3381
3382#define IS_KNOWN_SPECIAL(idx, string, prefix)			      \
3383  (special_sections[idx].namelen == sizeof string - (prefix ? 1 : 0)  \
3384   && !memcmp (special_sections[idx].name, string, \
3385	       sizeof string - (prefix ? 1 : 0)))
3386
3387
3388/* Indeces of some sections we need later.  */
3389static size_t eh_frame_hdr_scnndx;
3390static size_t eh_frame_scnndx;
3391static size_t gcc_except_table_scnndx;
3392
3393
3394static void
3395check_sections (Ebl *ebl, GElf_Ehdr *ehdr)
3396{
3397  if (ehdr->e_shoff == 0)
3398    /* No section header.  */
3399    return;
3400
3401  /* Allocate array to count references in section groups.  */
3402  scnref = (int *) xcalloc (shnum, sizeof (int));
3403
3404  /* Check the zeroth section first.  It must not have any contents
3405     and the section header must contain nonzero value at most in the
3406     sh_size and sh_link fields.  */
3407  GElf_Shdr shdr_mem;
3408  GElf_Shdr *shdr = gelf_getshdr (elf_getscn (ebl->elf, 0), &shdr_mem);
3409  if (shdr == NULL)
3410    ERROR (gettext ("cannot get section header of zeroth section\n"));
3411  else
3412    {
3413      if (shdr->sh_name != 0)
3414	ERROR (gettext ("zeroth section has nonzero name\n"));
3415      if (shdr->sh_type != 0)
3416	ERROR (gettext ("zeroth section has nonzero type\n"));
3417      if (shdr->sh_flags != 0)
3418	ERROR (gettext ("zeroth section has nonzero flags\n"));
3419      if (shdr->sh_addr != 0)
3420	ERROR (gettext ("zeroth section has nonzero address\n"));
3421      if (shdr->sh_offset != 0)
3422	ERROR (gettext ("zeroth section has nonzero offset\n"));
3423      if (shdr->sh_addralign != 0)
3424	ERROR (gettext ("zeroth section has nonzero align value\n"));
3425      if (shdr->sh_entsize != 0)
3426	ERROR (gettext ("zeroth section has nonzero entry size value\n"));
3427
3428      if (shdr->sh_size != 0 && ehdr->e_shnum != 0)
3429	ERROR (gettext ("\
3430zeroth section has nonzero size value while ELF header has nonzero shnum value\n"));
3431
3432      if (shdr->sh_link != 0 && ehdr->e_shstrndx != SHN_XINDEX)
3433	ERROR (gettext ("\
3434zeroth section has nonzero link value while ELF header does not signal overflow in shstrndx\n"));
3435
3436      if (shdr->sh_info != 0 && ehdr->e_phnum != PN_XNUM)
3437	ERROR (gettext ("\
3438zeroth section has nonzero link value while ELF header does not signal overflow in phnum\n"));
3439    }
3440
3441  int *segment_flags = xcalloc (phnum, sizeof segment_flags[0]);
3442
3443  bool dot_interp_section = false;
3444
3445  size_t hash_idx = 0;
3446  size_t gnu_hash_idx = 0;
3447
3448  size_t versym_scnndx = 0;
3449  for (size_t cnt = 1; cnt < shnum; ++cnt)
3450    {
3451      shdr = gelf_getshdr (elf_getscn (ebl->elf, cnt), &shdr_mem);
3452      if (shdr == NULL)
3453	{
3454	  ERROR (gettext ("\
3455cannot get section header for section [%2zu] '%s': %s\n"),
3456		 cnt, section_name (ebl, cnt), elf_errmsg (-1));
3457	  continue;
3458	}
3459
3460      const char *scnname = elf_strptr (ebl->elf, shstrndx, shdr->sh_name);
3461
3462      if (scnname == NULL)
3463	ERROR (gettext ("section [%2zu]: invalid name\n"), cnt);
3464      else
3465	{
3466	  /* Check whether it is one of the special sections defined in
3467	     the gABI.  */
3468	  size_t s;
3469	  for (s = 0; s < nspecial_sections; ++s)
3470	    if (strncmp (scnname, special_sections[s].name,
3471			 special_sections[s].namelen) == 0)
3472	      {
3473		char stbuf1[100];
3474		char stbuf2[100];
3475		char stbuf3[100];
3476
3477		GElf_Word good_type = special_sections[s].type;
3478		if (IS_KNOWN_SPECIAL (s, ".plt", false)
3479		    && ebl_bss_plt_p (ebl, ehdr))
3480		  good_type = SHT_NOBITS;
3481
3482		/* In a debuginfo file, any normal section can be SHT_NOBITS.
3483		   This is only invalid for DWARF sections and .shstrtab.  */
3484		if (shdr->sh_type != good_type
3485		    && (shdr->sh_type != SHT_NOBITS
3486			|| !is_debuginfo
3487			|| IS_KNOWN_SPECIAL (s, ".debug_str", false)
3488			|| IS_KNOWN_SPECIAL (s, ".debug", true)
3489			|| IS_KNOWN_SPECIAL (s, ".shstrtab", false)))
3490		  ERROR (gettext ("\
3491section [%2d] '%s' has wrong type: expected %s, is %s\n"),
3492			 (int) cnt, scnname,
3493			 ebl_section_type_name (ebl, special_sections[s].type,
3494						stbuf1, sizeof (stbuf1)),
3495			 ebl_section_type_name (ebl, shdr->sh_type,
3496						stbuf2, sizeof (stbuf2)));
3497
3498		if (special_sections[s].attrflag == exact
3499		    || special_sections[s].attrflag == exact_or_gnuld)
3500		  {
3501		    /* Except for the link order and group bit all the
3502		       other bits should match exactly.  */
3503		    if ((shdr->sh_flags & ~(SHF_LINK_ORDER | SHF_GROUP))
3504			!= special_sections[s].attr
3505			&& (special_sections[s].attrflag == exact || !gnuld))
3506		      ERROR (gettext ("\
3507section [%2zu] '%s' has wrong flags: expected %s, is %s\n"),
3508			     cnt, scnname,
3509			     section_flags_string (special_sections[s].attr,
3510						   stbuf1, sizeof (stbuf1)),
3511			     section_flags_string (shdr->sh_flags
3512						   & ~SHF_LINK_ORDER,
3513						   stbuf2, sizeof (stbuf2)));
3514		  }
3515		else if (special_sections[s].attrflag == atleast)
3516		  {
3517		    if ((shdr->sh_flags & special_sections[s].attr)
3518			!= special_sections[s].attr
3519			|| ((shdr->sh_flags & ~(SHF_LINK_ORDER | SHF_GROUP
3520						| special_sections[s].attr
3521						| special_sections[s].attr2))
3522			    != 0))
3523		      ERROR (gettext ("\
3524section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"),
3525			     cnt, scnname,
3526			     section_flags_string (special_sections[s].attr,
3527						   stbuf1, sizeof (stbuf1)),
3528			     section_flags_string (special_sections[s].attr2,
3529						   stbuf2, sizeof (stbuf2)),
3530			     section_flags_string (shdr->sh_flags
3531						   & ~(SHF_LINK_ORDER
3532						       | SHF_GROUP),
3533						   stbuf3, sizeof (stbuf3)));
3534		  }
3535
3536		if (strcmp (scnname, ".interp") == 0)
3537		  {
3538		    dot_interp_section = true;
3539
3540		    if (ehdr->e_type == ET_REL)
3541		      ERROR (gettext ("\
3542section [%2zu] '%s' present in object file\n"),
3543			     cnt, scnname);
3544
3545		    if ((shdr->sh_flags & SHF_ALLOC) != 0
3546			&& !has_loadable_segment)
3547		      ERROR (gettext ("\
3548section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"),
3549			     cnt, scnname);
3550		    else if ((shdr->sh_flags & SHF_ALLOC) == 0
3551			     && has_loadable_segment)
3552		      ERROR (gettext ("\
3553section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable segments\n"),
3554			     cnt, scnname);
3555		  }
3556		else
3557		  {
3558		    if (strcmp (scnname, ".symtab_shndx") == 0
3559			&& ehdr->e_type != ET_REL)
3560		      ERROR (gettext ("\
3561section [%2zu] '%s' is extension section index table in non-object file\n"),
3562			     cnt, scnname);
3563
3564		    /* These sections must have the SHF_ALLOC flag set iff
3565		       a loadable segment is available.
3566
3567		       .relxxx
3568		       .strtab
3569		       .symtab
3570		       .symtab_shndx
3571
3572		       Check that if there is a reference from the
3573		       loaded section these sections also have the
3574		       ALLOC flag set.  */
3575#if 0
3576		    // XXX TODO
3577		    if ((shdr->sh_flags & SHF_ALLOC) != 0
3578			&& !has_loadable_segment)
3579		      ERROR (gettext ("\
3580section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"),
3581			     cnt, scnname);
3582		    else if ((shdr->sh_flags & SHF_ALLOC) == 0
3583			     && has_loadable_segment)
3584		      ERROR (gettext ("\
3585section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable segments\n"),
3586			     cnt, scnname);
3587#endif
3588		  }
3589
3590		break;
3591	      }
3592
3593	  /* Remember a few special sections for later.  */
3594	  if (strcmp (scnname, ".eh_frame_hdr") == 0)
3595	    eh_frame_hdr_scnndx = cnt;
3596	  else if (strcmp (scnname, ".eh_frame") == 0)
3597	    eh_frame_scnndx = cnt;
3598	  else if (strcmp (scnname, ".gcc_except_table") == 0)
3599	    gcc_except_table_scnndx = cnt;
3600	}
3601
3602      if (shdr->sh_entsize != 0 && shdr->sh_size % shdr->sh_entsize)
3603	ERROR (gettext ("\
3604section [%2zu] '%s': size not multiple of entry size\n"),
3605	       cnt, section_name (ebl, cnt));
3606
3607      if (elf_strptr (ebl->elf, shstrndx, shdr->sh_name) == NULL)
3608	ERROR (gettext ("cannot get section header\n"));
3609
3610      if (shdr->sh_type >= SHT_NUM
3611	  && shdr->sh_type != SHT_GNU_ATTRIBUTES
3612	  && shdr->sh_type != SHT_GNU_LIBLIST
3613	  && shdr->sh_type != SHT_CHECKSUM
3614	  && shdr->sh_type != SHT_GNU_verdef
3615	  && shdr->sh_type != SHT_GNU_verneed
3616	  && shdr->sh_type != SHT_GNU_versym
3617	  && ebl_section_type_name (ebl, shdr->sh_type, NULL, 0) == NULL)
3618	ERROR (gettext ("section [%2zu] '%s' has unsupported type %d\n"),
3619	       cnt, section_name (ebl, cnt),
3620	       (int) shdr->sh_type);
3621
3622#define ALL_SH_FLAGS (SHF_WRITE | SHF_ALLOC | SHF_EXECINSTR | SHF_MERGE \
3623		      | SHF_STRINGS | SHF_INFO_LINK | SHF_LINK_ORDER \
3624		      | SHF_OS_NONCONFORMING | SHF_GROUP | SHF_TLS)
3625      if (shdr->sh_flags & ~(GElf_Xword) ALL_SH_FLAGS)
3626	{
3627	  GElf_Xword sh_flags = shdr->sh_flags & ~(GElf_Xword) ALL_SH_FLAGS;
3628	  if (sh_flags & SHF_MASKPROC)
3629	    {
3630	      if (!ebl_machine_section_flag_check (ebl,
3631						   sh_flags & SHF_MASKPROC))
3632		ERROR (gettext ("section [%2zu] '%s'"
3633				" contains invalid processor-specific flag(s)"
3634				" %#" PRIx64 "\n"),
3635		       cnt, section_name (ebl, cnt), sh_flags & SHF_MASKPROC);
3636	      sh_flags &= ~(GElf_Xword) SHF_MASKPROC;
3637	    }
3638	  if (sh_flags != 0)
3639	    ERROR (gettext ("section [%2zu] '%s' contains unknown flag(s)"
3640			    " %#" PRIx64 "\n"),
3641		   cnt, section_name (ebl, cnt), sh_flags);
3642	}
3643      if (shdr->sh_flags & SHF_TLS)
3644	{
3645	  // XXX Correct?
3646	  if (shdr->sh_addr != 0 && !gnuld)
3647	    ERROR (gettext ("\
3648section [%2zu] '%s': thread-local data sections address not zero\n"),
3649		   cnt, section_name (ebl, cnt));
3650
3651	  // XXX TODO more tests!?
3652	}
3653
3654      if (shdr->sh_link >= shnum)
3655	ERROR (gettext ("\
3656section [%2zu] '%s': invalid section reference in link value\n"),
3657	       cnt, section_name (ebl, cnt));
3658
3659      if (SH_INFO_LINK_P (shdr) && shdr->sh_info >= shnum)
3660	ERROR (gettext ("\
3661section [%2zu] '%s': invalid section reference in info value\n"),
3662	       cnt, section_name (ebl, cnt));
3663
3664      if ((shdr->sh_flags & SHF_MERGE) == 0
3665	  && (shdr->sh_flags & SHF_STRINGS) != 0
3666	  && be_strict)
3667	ERROR (gettext ("\
3668section [%2zu] '%s': strings flag set without merge flag\n"),
3669	       cnt, section_name (ebl, cnt));
3670
3671      if ((shdr->sh_flags & SHF_MERGE) != 0 && shdr->sh_entsize == 0)
3672	ERROR (gettext ("\
3673section [%2zu] '%s': merge flag set but entry size is zero\n"),
3674	       cnt, section_name (ebl, cnt));
3675
3676      if (shdr->sh_flags & SHF_GROUP)
3677	check_scn_group (ebl, cnt);
3678
3679      if (shdr->sh_flags & SHF_EXECINSTR)
3680	{
3681	  switch (shdr->sh_type)
3682	    {
3683	    case SHT_PROGBITS:
3684	      break;
3685
3686	    case SHT_NOBITS:
3687	      if (is_debuginfo)
3688		break;
3689	    default:
3690	      ERROR (gettext ("\
3691section [%2zu] '%s' has unexpected type %d for an executable section\n"),
3692		     cnt, section_name (ebl, cnt), shdr->sh_type);
3693	      break;
3694	    }
3695
3696	  if ((shdr->sh_flags & SHF_WRITE)
3697	      && !ebl_check_special_section (ebl, cnt, shdr,
3698					     section_name (ebl, cnt)))
3699	    ERROR (gettext ("\
3700section [%2zu] '%s' is both executable and writable\n"),
3701		   cnt, section_name (ebl, cnt));
3702	}
3703
3704      if (ehdr->e_type != ET_REL && (shdr->sh_flags & SHF_ALLOC) != 0)
3705	{
3706	  /* Make sure the section is contained in a loaded segment
3707	     and that the initialization part matches NOBITS sections.  */
3708	  unsigned int pcnt;
3709	  GElf_Phdr phdr_mem;
3710	  GElf_Phdr *phdr;
3711
3712	  for (pcnt = 0; pcnt < phnum; ++pcnt)
3713	    if ((phdr = gelf_getphdr (ebl->elf, pcnt, &phdr_mem)) != NULL
3714		&& ((phdr->p_type == PT_LOAD
3715		     && (shdr->sh_flags & SHF_TLS) == 0)
3716		    || (phdr->p_type == PT_TLS
3717			&& (shdr->sh_flags & SHF_TLS) != 0))
3718		&& phdr->p_offset <= shdr->sh_offset
3719		&& (phdr->p_offset + phdr->p_filesz > shdr->sh_offset
3720		    || (phdr->p_offset + phdr->p_memsz > shdr->sh_offset
3721			&& shdr->sh_type == SHT_NOBITS)))
3722	      {
3723		/* Found the segment.  */
3724		if (phdr->p_offset + phdr->p_memsz
3725		    < shdr->sh_offset + shdr->sh_size)
3726		  ERROR (gettext ("\
3727section [%2zu] '%s' not fully contained in segment of program header entry %d\n"),
3728			 cnt, section_name (ebl, cnt), pcnt);
3729
3730		if (shdr->sh_type == SHT_NOBITS)
3731		  {
3732		    if (shdr->sh_offset < phdr->p_offset + phdr->p_filesz
3733			&& !is_debuginfo)
3734		      ERROR (gettext ("\
3735section [%2zu] '%s' has type NOBITS but is read from the file in segment of program header entry %d\n"),
3736			 cnt, section_name (ebl, cnt), pcnt);
3737		  }
3738		else
3739		  {
3740		    const GElf_Off end = phdr->p_offset + phdr->p_filesz;
3741		    if (shdr->sh_offset > end ||
3742			(shdr->sh_offset == end && shdr->sh_size != 0))
3743		      ERROR (gettext ("\
3744section [%2zu] '%s' has not type NOBITS but is not read from the file in segment of program header entry %d\n"),
3745			 cnt, section_name (ebl, cnt), pcnt);
3746		  }
3747
3748		if (shdr->sh_type != SHT_NOBITS)
3749		  {
3750		    if ((shdr->sh_flags & SHF_EXECINSTR) != 0)
3751		      {
3752			segment_flags[pcnt] |= PF_X;
3753			if ((phdr->p_flags & PF_X) == 0)
3754			  ERROR (gettext ("\
3755section [%2zu] '%s' is executable in nonexecutable segment %d\n"),
3756				 cnt, section_name (ebl, cnt), pcnt);
3757		      }
3758
3759		    if ((shdr->sh_flags & SHF_WRITE) != 0)
3760		      {
3761			segment_flags[pcnt] |= PF_W;
3762			if (0	/* XXX vdso images have this */
3763			    && (phdr->p_flags & PF_W) == 0)
3764			  ERROR (gettext ("\
3765section [%2zu] '%s' is writable in unwritable segment %d\n"),
3766				 cnt, section_name (ebl, cnt), pcnt);
3767		      }
3768		  }
3769
3770		break;
3771	      }
3772
3773	  if (pcnt == phnum)
3774	    ERROR (gettext ("\
3775section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"),
3776		   cnt, section_name (ebl, cnt));
3777	}
3778
3779      if (cnt == shstrndx && shdr->sh_type != SHT_STRTAB)
3780	ERROR (gettext ("\
3781section [%2zu] '%s': ELF header says this is the section header string table but type is not SHT_TYPE\n"),
3782	       cnt, section_name (ebl, cnt));
3783
3784      switch (shdr->sh_type)
3785	{
3786	case SHT_DYNSYM:
3787	  if (ehdr->e_type == ET_REL)
3788	    ERROR (gettext ("\
3789section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"),
3790		   cnt, section_name (ebl, cnt));
3791	  /* FALLTHROUGH */
3792	case SHT_SYMTAB:
3793	  check_symtab (ebl, ehdr, shdr, cnt);
3794	  break;
3795
3796	case SHT_RELA:
3797	  check_rela (ebl, ehdr, shdr, cnt);
3798	  break;
3799
3800	case SHT_REL:
3801	  check_rel (ebl, ehdr, shdr, cnt);
3802	  break;
3803
3804	case SHT_DYNAMIC:
3805	  check_dynamic (ebl, ehdr, shdr, cnt);
3806	  break;
3807
3808	case SHT_SYMTAB_SHNDX:
3809	  check_symtab_shndx (ebl, ehdr, shdr, cnt);
3810	  break;
3811
3812	case SHT_HASH:
3813	  check_hash (shdr->sh_type, ebl, ehdr, shdr, cnt);
3814	  hash_idx = cnt;
3815	  break;
3816
3817	case SHT_GNU_HASH:
3818	  check_hash (shdr->sh_type, ebl, ehdr, shdr, cnt);
3819	  gnu_hash_idx = cnt;
3820	  break;
3821
3822	case SHT_NULL:
3823	  check_null (ebl, shdr, cnt);
3824	  break;
3825
3826	case SHT_GROUP:
3827	  check_group (ebl, ehdr, shdr, cnt);
3828	  break;
3829
3830	case SHT_NOTE:
3831	  check_note_section (ebl, ehdr, shdr, cnt);
3832	  break;
3833
3834	case SHT_GNU_versym:
3835	  /* We cannot process this section now since we have no guarantee
3836	     that the verneed and verdef sections have already been read.
3837	     Just remember the section index.  */
3838	  if (versym_scnndx != 0)
3839	    ERROR (gettext ("more than one version symbol table present\n"));
3840	  versym_scnndx = cnt;
3841	  break;
3842
3843	case SHT_GNU_verneed:
3844	  check_verneed (ebl, shdr, cnt);
3845	  break;
3846
3847	case SHT_GNU_verdef:
3848	  check_verdef (ebl, shdr, cnt);
3849	  break;
3850
3851	case SHT_GNU_ATTRIBUTES:
3852	  check_attributes (ebl, ehdr, shdr, cnt);
3853	  break;
3854
3855	default:
3856	  /* Nothing.  */
3857	  break;
3858	}
3859    }
3860
3861  if (has_interp_segment && !dot_interp_section)
3862    ERROR (gettext ("INTERP program header entry but no .interp section\n"));
3863
3864  if (!is_debuginfo)
3865    for (unsigned int pcnt = 0; pcnt < phnum; ++pcnt)
3866      {
3867	GElf_Phdr phdr_mem;
3868	GElf_Phdr *phdr = gelf_getphdr (ebl->elf, pcnt, &phdr_mem);
3869	if (phdr != NULL && (phdr->p_type == PT_LOAD || phdr->p_type == PT_TLS))
3870	  {
3871	    if ((phdr->p_flags & PF_X) != 0
3872		&& (segment_flags[pcnt] & PF_X) == 0)
3873	      ERROR (gettext ("\
3874loadable segment [%u] is executable but contains no executable sections\n"),
3875		     pcnt);
3876
3877	    if ((phdr->p_flags & PF_W) != 0
3878		&& (segment_flags[pcnt] & PF_W) == 0)
3879	      ERROR (gettext ("\
3880loadable segment [%u] is writable but contains no writable sections\n"),
3881		     pcnt);
3882	  }
3883      }
3884
3885  free (segment_flags);
3886
3887  if (version_namelist != NULL)
3888    {
3889      if (versym_scnndx == 0)
3890    ERROR (gettext ("\
3891no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section exist\n"));
3892      else
3893	check_versym (ebl, versym_scnndx);
3894
3895      /* Check for duplicate index numbers.  */
3896      do
3897	{
3898	  struct version_namelist *runp = version_namelist->next;
3899	  while (runp != NULL)
3900	    {
3901	      if (version_namelist->ndx == runp->ndx)
3902		{
3903		  ERROR (gettext ("duplicate version index %d\n"),
3904			 (int) version_namelist->ndx);
3905		  break;
3906		}
3907	      runp = runp->next;
3908	    }
3909
3910	  struct version_namelist *old = version_namelist;
3911	  version_namelist = version_namelist->next;
3912	  free (old);
3913	}
3914      while (version_namelist != NULL);
3915    }
3916  else if (versym_scnndx != 0)
3917    ERROR (gettext ("\
3918.gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"));
3919
3920  if (hash_idx != 0 && gnu_hash_idx != 0)
3921    compare_hash_gnu_hash (ebl, ehdr, hash_idx, gnu_hash_idx);
3922
3923  free (scnref);
3924}
3925
3926
3927static GElf_Off
3928check_note_data (Ebl *ebl, const GElf_Ehdr *ehdr,
3929		 Elf_Data *data, int shndx, int phndx, GElf_Off start)
3930{
3931  size_t offset = 0;
3932  size_t last_offset = 0;
3933  GElf_Nhdr nhdr;
3934  size_t name_offset;
3935  size_t desc_offset;
3936  while (offset < data->d_size
3937	 && (offset = gelf_getnote (data, offset,
3938				    &nhdr, &name_offset, &desc_offset)) > 0)
3939    {
3940      last_offset = offset;
3941
3942      /* Make sure it is one of the note types we know about.  */
3943      if (ehdr->e_type == ET_CORE)
3944	switch (nhdr.n_type)
3945	  {
3946	  case NT_PRSTATUS:
3947	  case NT_FPREGSET:
3948	  case NT_PRPSINFO:
3949	  case NT_TASKSTRUCT:		/* NT_PRXREG on Solaris.  */
3950	  case NT_PLATFORM:
3951	  case NT_AUXV:
3952	  case NT_GWINDOWS:
3953	  case NT_ASRS:
3954	  case NT_PSTATUS:
3955	  case NT_PSINFO:
3956	  case NT_PRCRED:
3957	  case NT_UTSNAME:
3958	  case NT_LWPSTATUS:
3959	  case NT_LWPSINFO:
3960	  case NT_PRFPXREG:
3961	    /* Known type.  */
3962	    break;
3963
3964	  default:
3965	    if (shndx == 0)
3966	      ERROR (gettext ("\
3967phdr[%d]: unknown core file note type %" PRIu32 " at offset %" PRIu64 "\n"),
3968		     phndx, (uint32_t) nhdr.n_type, start + offset);
3969	    else
3970	      ERROR (gettext ("\
3971section [%2d] '%s': unknown core file note type %" PRIu32
3972			      " at offset %Zu\n"),
3973		     shndx, section_name (ebl, shndx),
3974		     (uint32_t) nhdr.n_type, offset);
3975	  }
3976      else
3977	switch (nhdr.n_type)
3978	  {
3979	  case NT_GNU_ABI_TAG:
3980	  case NT_GNU_HWCAP:
3981	  case NT_GNU_BUILD_ID:
3982	  case NT_GNU_GOLD_VERSION:
3983	    break;
3984
3985	  case 0:
3986	    /* Linux vDSOs use a type 0 note for the kernel version word.  */
3987	    if (nhdr.n_namesz == sizeof "Linux"
3988		&& !memcmp (data->d_buf + name_offset, "Linux", sizeof "Linux"))
3989	      break;
3990
3991	  default:
3992	    if (shndx == 0)
3993	      ERROR (gettext ("\
3994phdr[%d]: unknown object file note type %" PRIu32 " at offset %Zu\n"),
3995		     phndx, (uint32_t) nhdr.n_type, offset);
3996	    else
3997	      ERROR (gettext ("\
3998section [%2d] '%s': unknown object file note type %" PRIu32
3999			      " at offset %Zu\n"),
4000		     shndx, section_name (ebl, shndx),
4001		     (uint32_t) nhdr.n_type, offset);
4002	  }
4003    }
4004
4005  return last_offset;
4006}
4007
4008
4009static void
4010check_note (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Phdr *phdr, int cnt)
4011{
4012  if (ehdr->e_type != ET_CORE && ehdr->e_type != ET_REL
4013      && ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN)
4014    ERROR (gettext ("\
4015phdr[%d]: no note entries defined for the type of file\n"),
4016	   cnt);
4017
4018  if (is_debuginfo)
4019    /* The p_offset values in a separate debug file are bogus.  */
4020    return;
4021
4022  if (phdr->p_filesz == 0)
4023    return;
4024
4025  GElf_Off notes_size = 0;
4026  Elf_Data *data = elf_getdata_rawchunk (ebl->elf,
4027					 phdr->p_offset, phdr->p_filesz,
4028					 ELF_T_NHDR);
4029  if (data != NULL)
4030    notes_size = check_note_data (ebl, ehdr, data, 0, cnt, phdr->p_offset);
4031
4032  if (notes_size == 0)
4033    ERROR (gettext ("phdr[%d]: cannot get content of note section: %s\n"),
4034	   cnt, elf_errmsg (-1));
4035  else if (notes_size != phdr->p_filesz)
4036    ERROR (gettext ("phdr[%d]: extra %" PRIu64 " bytes after last note\n"),
4037	   cnt, phdr->p_filesz - notes_size);
4038}
4039
4040
4041static void
4042check_note_section (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
4043{
4044  if (shdr->sh_size == 0)
4045    return;
4046
4047  Elf_Data *data = elf_getdata (elf_getscn (ebl->elf, idx), NULL);
4048  if (data == NULL)
4049    {
4050      ERROR (gettext ("section [%2d] '%s': cannot get section data\n"),
4051	     idx, section_name (ebl, idx));
4052      return;
4053    }
4054
4055  if (ehdr->e_type != ET_CORE && ehdr->e_type != ET_REL
4056      && ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN)
4057    ERROR (gettext ("\
4058section [%2d] '%s': no note entries defined for the type of file\n"),
4059	     idx, section_name (ebl, idx));
4060
4061  GElf_Off notes_size = check_note_data (ebl, ehdr, data, idx, 0, 0);
4062
4063  if (notes_size == 0)
4064    ERROR (gettext ("section [%2d] '%s': cannot get content of note section\n"),
4065	   idx, section_name (ebl, idx));
4066  else if (notes_size != shdr->sh_size)
4067    ERROR (gettext ("section [%2d] '%s': extra %" PRIu64
4068		    " bytes after last note\n"),
4069	   idx, section_name (ebl, idx), shdr->sh_size - notes_size);
4070}
4071
4072
4073/* Index of the PT_GNU_EH_FRAME program eader entry.  */
4074static int pt_gnu_eh_frame_pndx;
4075
4076
4077static void
4078check_program_header (Ebl *ebl, GElf_Ehdr *ehdr)
4079{
4080  if (ehdr->e_phoff == 0)
4081    return;
4082
4083  if (ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN
4084      && ehdr->e_type != ET_CORE)
4085    ERROR (gettext ("\
4086only executables, shared objects, and core files can have program headers\n"));
4087
4088  int num_pt_interp = 0;
4089  int num_pt_tls = 0;
4090  int num_pt_relro = 0;
4091
4092  for (unsigned int cnt = 0; cnt < phnum; ++cnt)
4093    {
4094      GElf_Phdr phdr_mem;
4095      GElf_Phdr *phdr;
4096
4097      phdr = gelf_getphdr (ebl->elf, cnt, &phdr_mem);
4098      if (phdr == NULL)
4099	{
4100	  ERROR (gettext ("cannot get program header entry %d: %s\n"),
4101		 cnt, elf_errmsg (-1));
4102	  continue;
4103	}
4104
4105      if (phdr->p_type >= PT_NUM && phdr->p_type != PT_GNU_EH_FRAME
4106	  && phdr->p_type != PT_GNU_STACK && phdr->p_type != PT_GNU_RELRO
4107	  /* Check for a known machine-specific type.  */
4108	  && ebl_segment_type_name (ebl, phdr->p_type, NULL, 0) == NULL)
4109	ERROR (gettext ("\
4110program header entry %d: unknown program header entry type %#" PRIx64 "\n"),
4111	       cnt, (uint64_t) phdr->p_type);
4112
4113      if (phdr->p_type == PT_LOAD)
4114	has_loadable_segment = true;
4115      else if (phdr->p_type == PT_INTERP)
4116	{
4117	  if (++num_pt_interp != 1)
4118	    {
4119	      if (num_pt_interp == 2)
4120		ERROR (gettext ("\
4121more than one INTERP entry in program header\n"));
4122	    }
4123	  has_interp_segment = true;
4124	}
4125      else if (phdr->p_type == PT_TLS)
4126	{
4127	  if (++num_pt_tls == 2)
4128	    ERROR (gettext ("more than one TLS entry in program header\n"));
4129	}
4130      else if (phdr->p_type == PT_NOTE)
4131	check_note (ebl, ehdr, phdr, cnt);
4132      else if (phdr->p_type == PT_DYNAMIC)
4133	{
4134	  if (ehdr->e_type == ET_EXEC && ! has_interp_segment)
4135	    ERROR (gettext ("\
4136static executable cannot have dynamic sections\n"));
4137	  else
4138	    {
4139	      /* Check that the .dynamic section, if it exists, has
4140		 the same address.  */
4141	      Elf_Scn *scn = NULL;
4142	      while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
4143		{
4144		  GElf_Shdr shdr_mem;
4145		  GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
4146		  if (shdr != NULL && shdr->sh_type == SHT_DYNAMIC)
4147		    {
4148		      if (phdr->p_offset != shdr->sh_offset)
4149			ERROR (gettext ("\
4150dynamic section reference in program header has wrong offset\n"));
4151		      if (phdr->p_memsz != shdr->sh_size)
4152			ERROR (gettext ("\
4153dynamic section size mismatch in program and section header\n"));
4154		      break;
4155		    }
4156		}
4157	    }
4158	}
4159      else if (phdr->p_type == PT_GNU_RELRO)
4160	{
4161	  if (++num_pt_relro == 2)
4162	    ERROR (gettext ("\
4163more than one GNU_RELRO entry in program header\n"));
4164	  else
4165	    {
4166	      /* Check that the region is in a writable segment.  */
4167	      unsigned int inner;
4168	      for (inner = 0; inner < phnum; ++inner)
4169		{
4170		  GElf_Phdr phdr2_mem;
4171		  GElf_Phdr *phdr2;
4172
4173		  phdr2 = gelf_getphdr (ebl->elf, inner, &phdr2_mem);
4174		  if (phdr2 == NULL)
4175		    continue;
4176
4177		  if (phdr2->p_type == PT_LOAD
4178		      && phdr->p_vaddr >= phdr2->p_vaddr
4179		      && (phdr->p_vaddr + phdr->p_memsz
4180			  <= phdr2->p_vaddr + phdr2->p_memsz))
4181		    {
4182		      if ((phdr2->p_flags & PF_W) == 0)
4183			ERROR (gettext ("\
4184loadable segment GNU_RELRO applies to is not writable\n"));
4185		      if ((phdr2->p_flags & ~PF_W) != (phdr->p_flags & ~PF_W))
4186			ERROR (gettext ("\
4187loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"),
4188			       cnt, inner);
4189		      break;
4190		    }
4191		}
4192
4193	      if (inner >= phnum)
4194		ERROR (gettext ("\
4195%s segment not contained in a loaded segment\n"), "GNU_RELRO");
4196	    }
4197	}
4198      else if (phdr->p_type == PT_PHDR)
4199	{
4200	  /* Check that the region is in a writable segment.  */
4201	  unsigned int inner;
4202	  for (inner = 0; inner < phnum; ++inner)
4203	    {
4204	      GElf_Phdr phdr2_mem;
4205	      GElf_Phdr *phdr2;
4206
4207	      phdr2 = gelf_getphdr (ebl->elf, inner, &phdr2_mem);
4208	      if (phdr2 != NULL
4209		  && phdr2->p_type == PT_LOAD
4210		  && phdr->p_vaddr >= phdr2->p_vaddr
4211		  && (phdr->p_vaddr + phdr->p_memsz
4212		      <= phdr2->p_vaddr + phdr2->p_memsz))
4213		break;
4214	    }
4215
4216	  if (inner >= phnum)
4217	    ERROR (gettext ("\
4218%s segment not contained in a loaded segment\n"), "PHDR");
4219
4220	  /* Check that offset in segment corresponds to offset in ELF
4221	     header.  */
4222	  if (phdr->p_offset != ehdr->e_phoff)
4223	    ERROR (gettext ("\
4224program header offset in ELF header and PHDR entry do not match"));
4225	}
4226      else if (phdr->p_type == PT_GNU_EH_FRAME)
4227	{
4228	  /* If there is an .eh_frame_hdr section it must be
4229	     referenced by this program header entry.  */
4230	  Elf_Scn *scn = NULL;
4231	  GElf_Shdr shdr_mem;
4232	  GElf_Shdr *shdr = NULL;
4233	  bool any = false;
4234	  while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
4235	    {
4236	      any = true;
4237	      shdr = gelf_getshdr (scn, &shdr_mem);
4238	      if (shdr != NULL
4239		  && shdr->sh_type == (is_debuginfo
4240				       ? SHT_NOBITS : SHT_PROGBITS)
4241		  && ! strcmp (".eh_frame_hdr",
4242			       elf_strptr (ebl->elf, shstrndx, shdr->sh_name)))
4243		{
4244		  if (! is_debuginfo)
4245		    {
4246		      if (phdr->p_offset != shdr->sh_offset)
4247			ERROR (gettext ("\
4248call frame search table reference in program header has wrong offset\n"));
4249		      if (phdr->p_memsz != shdr->sh_size)
4250			ERROR (gettext ("\
4251call frame search table size mismatch in program and section header\n"));
4252		    }
4253		  break;
4254		}
4255	    }
4256
4257	  if (scn == NULL)
4258	    {
4259	      /* If there is no section header table we don't
4260		 complain.  But if there is one there should be an
4261		 entry for .eh_frame_hdr.  */
4262	      if (any)
4263		ERROR (gettext ("\
4264PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"));
4265	    }
4266	  else
4267	    {
4268	      /* The section must be allocated and not be writable and
4269		 executable.  */
4270	      if ((phdr->p_flags & PF_R) == 0)
4271		ERROR (gettext ("\
4272call frame search table must be allocated\n"));
4273	      else if (shdr != NULL && (shdr->sh_flags & SHF_ALLOC) == 0)
4274		ERROR (gettext ("\
4275section [%2zu] '%s' must be allocated\n"), elf_ndxscn (scn), ".eh_frame_hdr");
4276
4277	      if ((phdr->p_flags & PF_W) != 0)
4278		ERROR (gettext ("\
4279call frame search table must not be writable\n"));
4280	      else if (shdr != NULL && (shdr->sh_flags & SHF_WRITE) != 0)
4281		ERROR (gettext ("\
4282section [%2zu] '%s' must not be writable\n"),
4283		       elf_ndxscn (scn), ".eh_frame_hdr");
4284
4285	      if ((phdr->p_flags & PF_X) != 0)
4286		ERROR (gettext ("\
4287call frame search table must not be executable\n"));
4288	      else if (shdr != NULL && (shdr->sh_flags & SHF_EXECINSTR) != 0)
4289		ERROR (gettext ("\
4290section [%2zu] '%s' must not be executable\n"),
4291		       elf_ndxscn (scn), ".eh_frame_hdr");
4292	    }
4293
4294	  /* Remember which entry this is.  */
4295	  pt_gnu_eh_frame_pndx = cnt;
4296	}
4297
4298      if (phdr->p_filesz > phdr->p_memsz
4299	  && (phdr->p_memsz != 0 || phdr->p_type != PT_NOTE))
4300	ERROR (gettext ("\
4301program header entry %d: file size greater than memory size\n"),
4302	       cnt);
4303
4304      if (phdr->p_align > 1)
4305	{
4306	  if (!powerof2 (phdr->p_align))
4307	    ERROR (gettext ("\
4308program header entry %d: alignment not a power of 2\n"), cnt);
4309	  else if ((phdr->p_vaddr - phdr->p_offset) % phdr->p_align != 0)
4310	    ERROR (gettext ("\
4311program header entry %d: file offset and virtual address not module of alignment\n"), cnt);
4312	}
4313    }
4314}
4315
4316
4317static void
4318check_exception_data (Ebl *ebl __attribute__ ((unused)),
4319		      GElf_Ehdr *ehdr __attribute__ ((unused)))
4320{
4321  if ((ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN)
4322      && pt_gnu_eh_frame_pndx == 0 && eh_frame_hdr_scnndx != 0)
4323    ERROR (gettext ("executable/DSO with .eh_frame_hdr section does not have "
4324		    "a PT_GNU_EH_FRAME program header entry"));
4325}
4326
4327
4328/* Process one file.  */
4329static void
4330process_elf_file (Elf *elf, const char *prefix, const char *suffix,
4331		  const char *fname, size_t size, bool only_one)
4332{
4333  /* Reset variables.  */
4334  ndynamic = 0;
4335  nverneed = 0;
4336  nverdef = 0;
4337  textrel = false;
4338  needed_textrel = false;
4339  has_loadable_segment = false;
4340  has_interp_segment = false;
4341
4342  GElf_Ehdr ehdr_mem;
4343  GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem);
4344  Ebl *ebl;
4345
4346  /* Print the file name.  */
4347  if (!only_one)
4348    {
4349      if (prefix != NULL)
4350	printf ("\n%s(%s)%s:\n", prefix, fname, suffix);
4351      else
4352	printf ("\n%s:\n", fname);
4353    }
4354
4355  if (ehdr == NULL)
4356    {
4357      ERROR (gettext ("cannot read ELF header: %s\n"), elf_errmsg (-1));
4358      return;
4359    }
4360
4361  ebl = ebl_openbackend (elf);
4362  /* If there is no appropriate backend library we cannot test
4363     architecture and OS specific features.  Any encountered extension
4364     is an error.  */
4365
4366  /* Go straight by the gABI, check all the parts in turn.  */
4367  check_elf_header (ebl, ehdr, size);
4368
4369  /* Check the program header.  */
4370  check_program_header (ebl, ehdr);
4371
4372  /* Next the section headers.  It is OK if there are no section
4373     headers at all.  */
4374  check_sections (ebl, ehdr);
4375
4376  /* Check the exception handling data, if it exists.  */
4377  if (pt_gnu_eh_frame_pndx != 0 || eh_frame_hdr_scnndx != 0
4378      || eh_frame_scnndx != 0 || gcc_except_table_scnndx != 0)
4379    check_exception_data (ebl, ehdr);
4380
4381  /* Report if no relocation section needed the text relocation flag.  */
4382  if (textrel && !needed_textrel)
4383    ERROR (gettext ("text relocation flag set but not needed\n"));
4384
4385  /* Free the resources.  */
4386  ebl_closebackend (ebl);
4387}
4388
4389
4390#include "debugpred.h"
4391