1cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Copyright (C) 2002, 2005, 2006 Red Hat, Inc.
2cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   This file is part of Red Hat elfutils.
3441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   Written by Ulrich Drepper <drepper@redhat.com>, 2002.
4441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
5cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is free software; you can redistribute it and/or modify
6cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   it under the terms of the GNU General Public License as published by the
7cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Free Software Foundation; version 2 of the License.
8441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
9cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is distributed in the hope that it will be useful, but
10cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
11cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   General Public License for more details.
13cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
14cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   You should have received a copy of the GNU General Public License along
15cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   with Red Hat elfutils; if not, write to the Free Software Foundation,
16cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
17cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
18cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is an included package of the Open Invention Network.
19cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   An included package of the Open Invention Network is a package for which
20cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Open Invention Network licensees cross-license their patents.  No patent
21cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   license is granted, either expressly or impliedly, by designation as an
22cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   included package.  Should you wish to participate in the Open Invention
23cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Network licensing program, please visit www.openinventionnetwork.com
24cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   <http://www.openinventionnetwork.com>.  */
25441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
26441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <config.h>
27441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
28441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdio.h>
29441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdlib.h>
30441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <string.h>
31441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
32441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <libelfP.h>
33441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
34441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct
35441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
36441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int id;
37441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  const char *expected;
38441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project} libelf_msgs[ELF_E_NUM] =
39441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  {
40441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_NOERROR, "no error" },
41441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_UNKNOWN_ERROR, "unknown error" },
42441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_UNKNOWN_VERSION, "unknown version" },
43441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_UNKNOWN_TYPE, "unknown type" },
44441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_INVALID_HANDLE, "invalid `Elf' handle" },
45441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_SOURCE_SIZE, "invalid size of source operand" },
46441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_DEST_SIZE, "invalid size of destination operand" },
47441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_INVALID_ENCODING, "invalid encoding" },
48441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_NOMEM, "out of memory" },
49441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_INVALID_FILE, "invalid file descriptor" },
50441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_INVALID_OP, "invalid operation" },
51441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_NO_VERSION, "ELF version not set" },
52441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_INVALID_CMD, "invalid command" },
53441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_RANGE, "offset out of range" },
54441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_ARCHIVE_FMAG, "invalid fmag field in archive header" },
55441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_INVALID_ARCHIVE, "invalid archive file" },
56441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_NO_ARCHIVE, "descriptor is not for an archive" },
57441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_NO_INDEX, "no index available" },
58441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_READ_ERROR, "cannot read data from file" },
59441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_WRITE_ERROR, "cannot write data to file" },
60441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_INVALID_CLASS, "invalid binary class" },
61441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_INVALID_INDEX, "invalid section index" },
62441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_INVALID_OPERAND, "invalid operand" },
63441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_INVALID_SECTION, "invalid section" },
64441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_INVALID_COMMAND, "invalid command" },
65441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_WRONG_ORDER_EHDR, "executable header not created first" },
66441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_FD_DISABLED, "file descriptor disabled" },
67441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_FD_MISMATCH, "archive/member fildes mismatch" },
68441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_OFFSET_RANGE, "offset out of range" },
69441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_NOT_NUL_SECTION, "cannot manipulate null section" },
70441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_DATA_MISMATCH, "data/scn mismatch" },
71441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_INVALID_SECTION_HEADER, "invalid section header" },
72441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_INVALID_DATA, "invalid data" },
73441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_DATA_ENCODING, "unknown data encoding" },
74441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_SECTION_TOO_SMALL, "section `sh_size' too small for data" },
75441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_INVALID_ALIGN, "invalid section alignment" },
76441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_INVALID_SHENTSIZE, "invalid section entry size" },
77441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_UPDATE_RO, "update() for write on read-only file" },
78441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_NOFILE, "no such file" },
79441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_GROUP_NOT_REL,
80441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      "only relocatable files can contain section groups" },
81441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    { ELF_E_INVALID_PHDR,
82cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      "program header only allowed in executables, shared objects, \
83cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengand core files" },
84cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    { ELF_E_NO_PHDR, "file has no program header" },
85cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    { ELF_E_INVALID_OFFSET, "invalid offset" }
86441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  };
87441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
88441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
89441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectint
90441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectmain (void)
91441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
92441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t cnt;
93441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int result = EXIT_SUCCESS;
94441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
95441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Clear the error state.  */
96441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  (void) elf_errno ();
97441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
98441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Check all the messages of libelf.  */
99441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  for (cnt = 1; cnt < ELF_E_NUM; ++cnt)
100441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
101441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      const char *str = elf_errmsg (libelf_msgs[cnt].id);
102441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
103441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (strcmp (str, libelf_msgs[cnt].expected) != 0)
104441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
105441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  printf ("libelf msg %zu: expected \"%s\", got \"%s\"\n",
106441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  cnt, libelf_msgs[cnt].expected, str);
107441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  result = EXIT_FAILURE;
108441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
109441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
110441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
111441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return result;
112441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
113