asm-tst9.c revision 441f72d43a9b550baa779fc82f70816da5f74f0e
1441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Copyright (C) 2002 Red Hat, Inc.
2441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   Written by Ulrich Drepper <drepper@redhat.com>, 2002.
3441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
4441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   This program is Open Source software; you can redistribute it and/or
5441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   modify it under the terms of the Open Software License version 1.0 as
6441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   published by the Open Source Initiative.
7441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
8441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   You should have received a copy of the Open Software License along
9441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   with this program; if not, you may obtain a copy of the Open Software
10441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   License version 1.0 from http://www.opensource.org/licenses/osl.php or
11441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
12441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   3001 King Ranch Road, Ukiah, CA 95482.   */
13441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
14441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <fcntl.h>
15441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <inttypes.h>
16441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <libasm.h>
17441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <libelf.h>
18441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdio.h>
19441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <string.h>
20441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <unistd.h>
21441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
22441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
23441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic const char fname[] = "asm-tst9-out.o";
24441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
25441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
26441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic int32_t input[] =
27441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
28441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    0, 1, 129, 510, 2000, 33000, 0x7ffffff, 0x7fffffff
29441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  };
30441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ninput (sizeof (input) / sizeof (input[0]))
31441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
32441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
33441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic const GElf_Ehdr expected_ehdr =
34441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
35441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    .e_ident = { [EI_MAG0] = ELFMAG0,
36441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		 [EI_MAG1] = ELFMAG1,
37441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		 [EI_MAG2] = ELFMAG2,
38441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		 [EI_MAG3] = ELFMAG3,
39441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		 [EI_CLASS] = ELFCLASS32,
40441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		 [EI_DATA] = ELFDATA2LSB,
41441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		 [EI_VERSION] = EV_CURRENT },
42441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    .e_type = ET_REL,
43441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    .e_machine = EM_386,
44441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    .e_version = EV_CURRENT,
45441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    .e_shoff = 180,
46441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    .e_ehsize = sizeof (Elf32_Ehdr),
47441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    .e_shentsize = sizeof (Elf32_Shdr),
48441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    .e_shnum = 3,
49441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    .e_shstrndx = 2
50441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  };
51441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
52441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
53441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic const char *scnnames[3] =
54441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
55441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    [0] = "",
56441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    [1] = ".data",
57441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    [2] = ".shstrtab"
58441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  };
59441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
60441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
61441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic const char expecteddata[] =
62441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
63441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x7f,
64441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    0x81, 0x01, 0x81, 0x01, 0xff, 0xfe, 0xff, 0xff, 0x0f, 0xff, 0x7e, 0xfe,
65441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    0x03, 0xfe, 0x03, 0x82, 0xfc, 0xff, 0xff, 0x0f, 0x82, 0x7c, 0xd0, 0x0f,
66441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    0xd0, 0x0f, 0xb0, 0xf0, 0xff, 0xff, 0x0f, 0xb0, 0x70, 0xe8, 0x81, 0x02,
67441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    0xe8, 0x81, 0x02, 0x98, 0xfe, 0xfd, 0xff, 0x0f, 0x98, 0xfe, 0x7d, 0xff,
68441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0x81, 0x80, 0x80, 0xc0, 0x0f,
69441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    0x81, 0x80, 0x80, 0x40, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff,
70441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    0xff, 0x07, 0x81, 0x80, 0x80, 0x80, 0x08, 0x81, 0x80, 0x80, 0x80, 0x78
71441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  };
72441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
73441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
74441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectint
75441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectmain (void)
76441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
77441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  AsmCtx_t *ctx;
78441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  AsmScn_t *scn;
79441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int result = 0;
80441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int fd;
81441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  Elf *elf;
82441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  GElf_Ehdr ehdr_mem;
83441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  GElf_Ehdr *ehdr;
84441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t cnt;
85441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
86441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  elf_version (EV_CURRENT);
87441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
88441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ctx = asm_begin (fname, false, EM_386, ELFCLASS32, ELFDATA2LSB);
89441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (ctx == NULL)
90441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
91441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      printf ("cannot create assembler context: %s\n", asm_errmsg (-1));
92441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      return 1;
93441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
94441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
95441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Create two sections.  */
96441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  scn = asm_newscn (ctx, ".data", SHT_PROGBITS, SHF_ALLOC | SHF_WRITE);
97441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (scn == NULL)
98441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
99441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      printf ("cannot create section in output file: %s\n", asm_errmsg (-1));
100441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      asm_abort (ctx);
101441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      return 1;
102441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
103441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
104441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Special alignment for the .text section.  */
105441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (asm_align (scn, 16) != 0)
106441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
107441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      printf ("cannot align .text section: %s\n", asm_errmsg (-1));
108441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      result = 1;
109441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
110441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
111441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Add a few ULEB128 and SLEB128 numbers.  */
112441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  for (cnt = 0; cnt < ninput; ++cnt)
113441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
114441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (asm_adduleb128 (scn, input[cnt]) != 0)
115441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
116441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("cannot insert uleb %" PRIu32 ": %s\n",
117441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  (uint32_t) input[cnt], asm_errmsg (-1));
118441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = 1;
119441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
120441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
121441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (asm_addsleb128 (scn, input[cnt]) != 0)
122441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
123441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("cannot insert sleb %" PRId32 ": %s\n",
124441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  input[cnt], asm_errmsg (-1));
125441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = 1;
126441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
127441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
128441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (asm_adduleb128 (scn, -input[cnt]) != 0)
129441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
130441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("cannot insert uleb %" PRIu32 ": %s\n",
131441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  (uint32_t) -input[cnt], asm_errmsg (-1));
132441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = 1;
133441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
134441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
135441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (asm_addsleb128 (scn, -input[cnt]) != 0)
136441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
137441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("cannot insert sleb %" PRId32 ": %s\n",
138441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  -input[cnt], asm_errmsg (-1));
139441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = 1;
140441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
141441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
142441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
143441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Create the output file.  */
144441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (asm_end (ctx) != 0)
145441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
146441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      printf ("cannot create output file: %s\n", asm_errmsg (-1));
147441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      asm_abort (ctx);
148441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      return 1;
149441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
150441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
151441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Check the file.  */
152441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  fd = open (fname, O_RDONLY);
153441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (fd == -1)
154441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
155441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      printf ("cannot open generated file: %m\n");
156441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      result = 1;
157441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      goto out;
158441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
159441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
160441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  elf = elf_begin (fd, ELF_C_READ, NULL);
161441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (elf == NULL)
162441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
163441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      printf ("cannot create ELF descriptor: %s\n", elf_errmsg (-1));
164441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      result = 1;
165441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      goto out_close;
166441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
167441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (elf_kind (elf) != ELF_K_ELF)
168441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
169441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      puts ("not a valid ELF file");
170441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      result = 1;
171441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      goto out_close2;
172441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
173441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
174441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  ehdr = gelf_getehdr (elf, &ehdr_mem);
175441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (ehdr == NULL)
176441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
177441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      printf ("cannot get ELF header: %s\n", elf_errmsg (-1));
178441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      result = 1;
179441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      goto out_close2;
180441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
181441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
182441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (memcmp (ehdr, &expected_ehdr, sizeof (GElf_Ehdr)) != 0)
183441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
184441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      puts ("ELF header does not match");
185441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      result = 1;
186441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      goto out_close2;
187441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
188441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
189441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  for (cnt = 1; cnt < 3; ++cnt)
190441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
191441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      Elf_Scn *scn;
192441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      GElf_Shdr shdr_mem;
193441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      GElf_Shdr *shdr;
194441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
195441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      scn = elf_getscn (elf, cnt);
196441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (scn == NULL)
197441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
198441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("cannot get section %Zd: %s\n", cnt, elf_errmsg (-1));
199441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = 1;
200441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  continue;
201441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
202441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
203441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      shdr = gelf_getshdr (scn, &shdr_mem);
204441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (shdr == NULL)
205441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
206441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("cannot get section header for section %Zd: %s\n",
207441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  cnt, elf_errmsg (-1));
208441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = 1;
209441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  continue;
210441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
211441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
212441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (strcmp (elf_strptr (elf, ehdr->e_shstrndx, shdr->sh_name),
213441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  scnnames[cnt]) != 0)
214441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
215441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("section %Zd's name differs: %s vs %s\n", cnt,
216441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  elf_strptr (elf, ehdr->e_shstrndx, shdr->sh_name),
217441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  scnnames[cnt]);
218441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = 1;
219441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
220441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
221441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (shdr->sh_type != (cnt == 2 ? SHT_STRTAB : SHT_PROGBITS))
222441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
223441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("section %Zd's type differs\n", cnt);
224441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = 1;
225441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
226441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
227441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if ((cnt == 1 && shdr->sh_flags != (SHF_ALLOC | SHF_WRITE))
228441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || (cnt == 2 && shdr->sh_flags != 0))
229441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
230441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("section %Zd's flags differs\n", cnt);
231441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = 1;
232441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
233441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
234441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (shdr->sh_addr != 0)
235441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
236441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("section %Zd's address differs\n", cnt);
237441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = 1;
238441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
239441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
240441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if ((cnt == 1 && shdr->sh_offset != ((sizeof (Elf32_Ehdr) + 15) & ~15))
241441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || (cnt == 2
242441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	      && shdr->sh_offset != (((sizeof (Elf32_Ehdr) + 15) & ~15)
243441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				     + sizeof (expecteddata))))
244441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
245441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("section %Zd's offset differs\n", cnt);
246441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = 1;
247441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
248441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
249441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if ((cnt == 1 && shdr->sh_size != sizeof (expecteddata))
250441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || (cnt == 2 && shdr->sh_size != 17))
251441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
252441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("section %Zd's size differs\n", cnt);
253441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = 1;
254441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
255441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
256441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (shdr->sh_link != 0)
257441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
258441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("section %Zd's link differs\n", cnt);
259441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = 1;
260441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
261441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
262441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (shdr->sh_info != 0)
263441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
264441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("section %Zd's info differs\n", cnt);
265441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = 1;
266441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
267441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
268441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if ((cnt == 1 && shdr->sh_addralign != 16)
269441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || (cnt != 1 && shdr->sh_addralign != 1))
270441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
271441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("section %Zd's addralign differs\n", cnt);
272441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = 1;
273441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
274441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
275441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (shdr->sh_entsize != 0)
276441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
277441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("section %Zd's entsize differs\n", cnt);
278441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = 1;
279441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
280441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
281441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (cnt == 1)
282441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
283441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  Elf_Data *data = elf_getdata (scn, NULL);
284441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
285441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  if (data == NULL)
286441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    {
287441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	      printf ("cannot get data of section %Zd\n", cnt);
288441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	      result = 1;
289441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    }
290441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  else
291441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    {
292441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	      if (data->d_size != sizeof (expecteddata))
293441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		{
294441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  printf ("data block size of section %Zd wrong: got %Zd, "
295441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			  "expected 96\n", cnt, data->d_size);
296441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  result = 1;
297441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		}
298441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
299441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	      if (memcmp (data->d_buf, expecteddata, sizeof (expecteddata))
300441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  != 0)
301441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		{
302441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  printf ("data block content of section %Zd wrong\n", cnt);
303441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  result = 1;
304441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		}
305441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    }
306441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
307441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
308441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
309441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project out_close2:
310441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  elf_end (elf);
311441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project out_close:
312441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  close (fd);
313441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project out:
314441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* We don't need the file anymore.  */
315441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  unlink (fname);
316441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
317441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return result;
318441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
319