1a38998e815ccde5d90ff0800c31da255eb3430d3Ulrich Drepper/* Copyright (C) 2002, 2005 Red Hat, Inc.
2de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   This file is part of elfutils.
3b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   Written by Ulrich Drepper <drepper@redhat.com>, 2002.
4b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
5de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   This file is free software; you can redistribute it and/or modify
6de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   it under the terms of the GNU General Public License as published by
7de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   the Free Software Foundation; either version 3 of the License, or
8de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   (at your option) any later version.
9361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper
10de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   elfutils is distributed in the hope that it will be useful, but
11361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper   WITHOUT ANY WARRANTY; without even the implied warranty of
12de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   GNU General Public License for more details.
14de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard
15de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   You should have received a copy of the GNU General Public License
16de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
18d7f8d0caa7a357f9f4765e5dc93255f5057eba2eRoland McGrath#ifdef HAVE_CONFIG_H
19d7f8d0caa7a357f9f4765e5dc93255f5057eba2eRoland McGrath# include <config.h>
20d7f8d0caa7a357f9f4765e5dc93255f5057eba2eRoland McGrath#endif
21d7f8d0caa7a357f9f4765e5dc93255f5057eba2eRoland McGrath
22b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <fcntl.h>
23d7f8d0caa7a357f9f4765e5dc93255f5057eba2eRoland McGrath#include ELFUTILS_HEADER(asm)
24b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <libelf.h>
25b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stdio.h>
26b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <string.h>
27b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <unistd.h>
28b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
29b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
30b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic const char fname[] = "asm-tst2-out.o";
31b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
32b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
33b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic const GElf_Ehdr expected_ehdr =
34b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  {
35b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    .e_ident = { [EI_MAG0] = ELFMAG0,
36b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		 [EI_MAG1] = ELFMAG1,
37b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		 [EI_MAG2] = ELFMAG2,
38b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		 [EI_MAG3] = ELFMAG3,
39b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		 [EI_CLASS] = ELFCLASS32,
40b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		 [EI_DATA] = ELFDATA2LSB,
41b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		 [EI_VERSION] = EV_CURRENT },
42b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    .e_type = ET_REL,
43b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    .e_machine = EM_386,
44b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    .e_version = EV_CURRENT,
45b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    .e_shoff = 96,
46b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    .e_ehsize = sizeof (Elf32_Ehdr),
47b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    .e_shentsize = sizeof (Elf32_Shdr),
48b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    .e_shnum = 3,
49b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    .e_shstrndx = 2
50b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  };
51b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
52b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
53b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperstatic const char *scnnames[3] =
54b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  {
55b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    [0] = "",
56b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    [1] = ".data",
57b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    [2] = ".shstrtab"
58b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  };
59b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
60b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
61b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperint
62b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppermain (void)
63b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
64b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  AsmCtx_t *ctx;
65b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  AsmScn_t *scn1;
66b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  AsmScn_t *scn2;
67b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  int result = 0;
68b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  int fd;
69b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Elf *elf;
70b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  GElf_Ehdr ehdr_mem;
71b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  GElf_Ehdr *ehdr;
72b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t cnt;
73b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
74b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  elf_version (EV_CURRENT);
75b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
76a38998e815ccde5d90ff0800c31da255eb3430d3Ulrich Drepper  Ebl *ebl = ebl_openbackend_machine (EM_386);
77a38998e815ccde5d90ff0800c31da255eb3430d3Ulrich Drepper  if (ebl == NULL)
78a38998e815ccde5d90ff0800c31da255eb3430d3Ulrich Drepper    {
79a38998e815ccde5d90ff0800c31da255eb3430d3Ulrich Drepper      puts ("cannot open backend library");
80a38998e815ccde5d90ff0800c31da255eb3430d3Ulrich Drepper      return 1;
81a38998e815ccde5d90ff0800c31da255eb3430d3Ulrich Drepper    }
82a38998e815ccde5d90ff0800c31da255eb3430d3Ulrich Drepper
83a38998e815ccde5d90ff0800c31da255eb3430d3Ulrich Drepper  ctx = asm_begin (fname, ebl, false);
84b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (ctx == NULL)
85b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
86b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("cannot create assembler context: %s\n", asm_errmsg (-1));
87b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      return 1;
88b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
89b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
90b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Create two sections.  */
91b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  scn1 = asm_newscn (ctx, ".data", SHT_PROGBITS, SHF_ALLOC | SHF_WRITE);
92b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  scn2 = asm_newsubscn (scn1, 1);
93b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (scn1 == NULL || scn2 == NULL)
94b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
95b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("cannot create section in output file: %s\n", asm_errmsg (-1));
96b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      asm_abort (ctx);
97b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      return 1;
98b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
99b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
100b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Special alignment for the .text section.  */
101b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (asm_align (scn1, 16) != 0)
102b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
103b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("cannot align .text section: %s\n", asm_errmsg (-1));
104b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      result = 1;
105b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
106b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
107b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Add a few strings.  */
108b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (asm_addstrz (scn1, "one", 4) != 0)
109b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
110b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("cannot insert first string: %s\n", asm_errmsg (-1));
111b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      result = 1;
112b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
113b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (asm_addstrz (scn2, "three", 0) != 0)
114b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
115b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("cannot insert second string: %s\n", asm_errmsg (-1));
116b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      result = 1;
117b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
118b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (asm_addstrz (scn1, "two", 4) != 0)
119b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
120b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("cannot insert third string: %s\n", asm_errmsg (-1));
121b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      result = 1;
122b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
123b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
124b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Create the output file.  */
125b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (asm_end (ctx) != 0)
126b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
127b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("cannot create output file: %s\n", asm_errmsg (-1));
128b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      asm_abort (ctx);
129b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      return 1;
130b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
131b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
132b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* Check the file.  */
133b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  fd = open (fname, O_RDONLY);
134b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (fd == -1)
135b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
136b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("cannot open generated file: %m\n");
137b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      result = 1;
138b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      goto out;
139b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
140b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
141b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  elf = elf_begin (fd, ELF_C_READ, NULL);
142b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (elf == NULL)
143b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
144b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("cannot create ELF descriptor: %s\n", elf_errmsg (-1));
145b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      result = 1;
146b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      goto out_close;
147b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
148b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (elf_kind (elf) != ELF_K_ELF)
149b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
150b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      puts ("not a valid ELF file");
151b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      result = 1;
152b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      goto out_close2;
153b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
154b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
155b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  ehdr = gelf_getehdr (elf, &ehdr_mem);
156b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (ehdr == NULL)
157b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
158b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("cannot get ELF header: %s\n", elf_errmsg (-1));
159b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      result = 1;
160b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      goto out_close2;
161b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
162b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
163b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (memcmp (ehdr, &expected_ehdr, sizeof (GElf_Ehdr)) != 0)
164b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
165b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      puts ("ELF header does not match");
166b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      result = 1;
167b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      goto out_close2;
168b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
169b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
170b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  for (cnt = 1; cnt < 3; ++cnt)
171b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
172b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Elf_Scn *scn;
173b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      GElf_Shdr shdr_mem;
174b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      GElf_Shdr *shdr;
175b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
176b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      scn = elf_getscn (elf, cnt);
177b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (scn == NULL)
178b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
1792ec957327cdfae6cee592a52958a9c937ea4b13cChih-Hung Hsieh	  printf ("cannot get section %zd: %s\n", cnt, elf_errmsg (-1));
180b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  result = 1;
181b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  continue;
182b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
183b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
184b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      shdr = gelf_getshdr (scn, &shdr_mem);
185b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (shdr == NULL)
186b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
1872ec957327cdfae6cee592a52958a9c937ea4b13cChih-Hung Hsieh	  printf ("cannot get section header for section %zd: %s\n",
188b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		  cnt, elf_errmsg (-1));
189b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  result = 1;
190b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  continue;
191b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
192b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
193b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (strcmp (elf_strptr (elf, ehdr->e_shstrndx, shdr->sh_name),
194b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		  scnnames[cnt]) != 0)
195b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
1962ec957327cdfae6cee592a52958a9c937ea4b13cChih-Hung Hsieh	  printf ("section %zd's name differs: %s vs %s\n", cnt,
197b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		  elf_strptr (elf, ehdr->e_shstrndx, shdr->sh_name),
198b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		  scnnames[cnt]);
199b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  result = 1;
200b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
201b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
202b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (shdr->sh_type != (cnt == 2 ? SHT_STRTAB : SHT_PROGBITS))
203b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
2042ec957327cdfae6cee592a52958a9c937ea4b13cChih-Hung Hsieh	  printf ("section %zd's type differs\n", cnt);
205b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  result = 1;
206b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
207b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
208b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if ((cnt == 1 && shdr->sh_flags != (SHF_ALLOC | SHF_WRITE))
209b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || (cnt == 2 && shdr->sh_flags != 0))
210b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
2112ec957327cdfae6cee592a52958a9c937ea4b13cChih-Hung Hsieh	  printf ("section %zd's flags differs\n", cnt);
212b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  result = 1;
213b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
214b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
215b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (shdr->sh_addr != 0)
216b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
2172ec957327cdfae6cee592a52958a9c937ea4b13cChih-Hung Hsieh	  printf ("section %zd's address differs\n", cnt);
218b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  result = 1;
219b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
220b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
221b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if ((cnt == 1 && shdr->sh_offset != ((sizeof (Elf32_Ehdr) + 15) & ~15))
222b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || (cnt == 2
223b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	      && shdr->sh_offset != (((sizeof (Elf32_Ehdr) + 15) & ~15)
224b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper				     + strlen ("one") + 1
225b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper				     + strlen ("two") + 1
226b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper				     + strlen ("three") + 1)))
227b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
2282ec957327cdfae6cee592a52958a9c937ea4b13cChih-Hung Hsieh	  printf ("section %zd's offset differs\n", cnt);
229b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  result = 1;
230b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
231b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
232b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if ((cnt == 1 && shdr->sh_size != (strlen ("one") + 1
233b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper					 + strlen ("two") + 1
234b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper					 + strlen ("three") + 1))
235b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || (cnt == 2 && shdr->sh_size != 17))
236b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
2372ec957327cdfae6cee592a52958a9c937ea4b13cChih-Hung Hsieh	  printf ("section %zd's size differs\n", cnt);
238b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  result = 1;
239b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
240b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
241b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (shdr->sh_link != 0)
242b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
2432ec957327cdfae6cee592a52958a9c937ea4b13cChih-Hung Hsieh	  printf ("section %zd's link differs\n", cnt);
244b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  result = 1;
245b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
246b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
247b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (shdr->sh_info != 0)
248b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
2492ec957327cdfae6cee592a52958a9c937ea4b13cChih-Hung Hsieh	  printf ("section %zd's info differs\n", cnt);
250b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  result = 1;
251b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
252b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
253b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if ((cnt == 1 && shdr->sh_addralign != 16)
254b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || (cnt != 1 && shdr->sh_addralign != 1))
255b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
2562ec957327cdfae6cee592a52958a9c937ea4b13cChih-Hung Hsieh	  printf ("section %zd's addralign differs\n", cnt);
257b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  result = 1;
258b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
259b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
260b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (shdr->sh_entsize != 0)
261b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
2622ec957327cdfae6cee592a52958a9c937ea4b13cChih-Hung Hsieh	  printf ("section %zd's entsize differs\n", cnt);
263b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  result = 1;
264b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
265b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
266b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
267b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper out_close2:
268b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  elf_end (elf);
269b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper out_close:
270b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  close (fd);
271b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper out:
272b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  /* We don't need the file anymore.  */
273b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  unlink (fname);
274b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
275a38998e815ccde5d90ff0800c31da255eb3430d3Ulrich Drepper  ebl_closebackend (ebl);
276a38998e815ccde5d90ff0800c31da255eb3430d3Ulrich Drepper
277b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  return result;
278b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
279