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