Blame libelf/elf_error.c

Packit 032894
/* Error handling in libelf.
Packit 032894
   Copyright (C) 1998-2010, 2015 Red Hat, Inc.
Packit 032894
   This file is part of elfutils.
Packit 032894
   Written by Ulrich Drepper <drepper@redhat.com>, 1998.
Packit 032894
Packit 032894
   This file is free software; you can redistribute it and/or modify
Packit 032894
   it under the terms of either
Packit 032894
Packit 032894
     * the GNU Lesser General Public License as published by the Free
Packit 032894
       Software Foundation; either version 3 of the License, or (at
Packit 032894
       your option) any later version
Packit 032894
Packit 032894
   or
Packit 032894
Packit 032894
     * the GNU General Public License as published by the Free
Packit 032894
       Software Foundation; either version 2 of the License, or (at
Packit 032894
       your option) any later version
Packit 032894
Packit 032894
   or both in parallel, as here.
Packit 032894
Packit 032894
   elfutils is distributed in the hope that it will be useful, but
Packit 032894
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 032894
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 032894
   General Public License for more details.
Packit 032894
Packit 032894
   You should have received copies of the GNU General Public License and
Packit 032894
   the GNU Lesser General Public License along with this program.  If
Packit 032894
   not, see <http://www.gnu.org/licenses/>.  */
Packit 032894
Packit 032894
#ifdef HAVE_CONFIG_H
Packit 032894
# include <config.h>
Packit 032894
#endif
Packit 032894
Packit 032894
#include <assert.h>
Packit 032894
#include <libintl.h>
Packit 032894
#include <stdbool.h>
Packit 032894
#include <stdint.h>
Packit 032894
#include <stdlib.h>
Packit 032894
Packit 032894
#include "libelfP.h"
Packit 032894
Packit 032894
Packit 032894
/* The error number.  */
Packit 032894
static __thread int global_error;
Packit 032894
Packit 032894
Packit 032894
int
Packit 032894
elf_errno (void)
Packit 032894
{
Packit 032894
  int result = global_error;
Packit 032894
  global_error = ELF_E_NOERROR;
Packit 032894
  return result;
Packit 032894
}
Packit 032894
Packit 032894
Packit 032894
/* Return the appropriate message for the error.  */
Packit 032894
static const char msgstr[] =
Packit 032894
{
Packit 032894
#define ELF_E_NOERROR_IDX 0
Packit 032894
  N_("no error")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_UNKNOWN_ERROR_IDX (ELF_E_NOERROR_IDX + sizeof "no error")
Packit 032894
  N_("unknown error")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_UNKNOWN_VERSION_IDX \
Packit 032894
  (ELF_E_UNKNOWN_ERROR_IDX + sizeof "unknown error")
Packit 032894
  N_("unknown version")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_UNKNOWN_TYPE_IDX \
Packit 032894
  (ELF_E_UNKNOWN_VERSION_IDX + sizeof "unknown version")
Packit 032894
  N_("unknown type")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_HANDLE_IDX \
Packit 032894
  (ELF_E_UNKNOWN_TYPE_IDX + sizeof "unknown type")
Packit 032894
  N_("invalid `Elf' handle")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_SOURCE_SIZE_IDX \
Packit 032894
  (ELF_E_INVALID_HANDLE_IDX + sizeof "invalid `Elf' handle")
Packit 032894
  N_("invalid size of source operand")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_DEST_SIZE_IDX \
Packit 032894
  (ELF_E_SOURCE_SIZE_IDX + sizeof "invalid size of source operand")
Packit 032894
  N_("invalid size of destination operand")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_ENCODING_IDX \
Packit 032894
  (ELF_E_DEST_SIZE_IDX + sizeof "invalid size of destination operand")
Packit 032894
  N_("invalid encoding")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_NOMEM_IDX \
Packit 032894
  (ELF_E_INVALID_ENCODING_IDX + sizeof "invalid encoding")
Packit 032894
  N_("out of memory")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_FILE_IDX \
Packit 032894
  (ELF_E_NOMEM_IDX + sizeof "out of memory")
Packit 032894
  N_("invalid file descriptor")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_ELF_IDX \
Packit 032894
  (ELF_E_INVALID_FILE_IDX + sizeof "invalid file descriptor")
Packit 032894
  N_("invalid ELF file data")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_OP_IDX \
Packit 032894
  (ELF_E_INVALID_ELF_IDX + sizeof "invalid ELF file data")
Packit 032894
  N_("invalid operation")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_NO_VERSION_IDX \
Packit 032894
  (ELF_E_INVALID_OP_IDX + sizeof "invalid operation")
Packit 032894
  N_("ELF version not set")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_CMD_IDX \
Packit 032894
  (ELF_E_NO_VERSION_IDX + sizeof "ELF version not set")
Packit 032894
  N_("invalid command")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_RANGE_IDX \
Packit 032894
  (ELF_E_INVALID_CMD_IDX + sizeof "invalid command")
Packit 032894
  N_("offset out of range")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_ARCHIVE_FMAG_IDX \
Packit 032894
  (ELF_E_RANGE_IDX + sizeof "offset out of range")
Packit 032894
  N_("invalid fmag field in archive header")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_ARCHIVE_IDX \
Packit 032894
  (ELF_E_ARCHIVE_FMAG_IDX + sizeof "invalid fmag field in archive header")
Packit 032894
  N_("invalid archive file")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_NO_ARCHIVE_IDX \
Packit 032894
  (ELF_E_INVALID_ARCHIVE_IDX + sizeof "invalid archive file")
Packit 032894
  N_("descriptor is not for an archive")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_NO_INDEX_IDX \
Packit 032894
  (ELF_E_NO_ARCHIVE_IDX + sizeof "descriptor is not for an archive")
Packit 032894
  N_("no index available")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_READ_ERROR_IDX \
Packit 032894
  (ELF_E_NO_INDEX_IDX + sizeof "no index available")
Packit 032894
  N_("cannot read data from file")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_WRITE_ERROR_IDX \
Packit 032894
  (ELF_E_READ_ERROR_IDX + sizeof "cannot read data from file")
Packit 032894
  N_("cannot write data to file")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_CLASS_IDX \
Packit 032894
  (ELF_E_WRITE_ERROR_IDX + sizeof "cannot write data to file")
Packit 032894
  N_("invalid binary class")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_INDEX_IDX \
Packit 032894
  (ELF_E_INVALID_CLASS_IDX + sizeof "invalid binary class")
Packit 032894
  N_("invalid section index")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_OPERAND_IDX \
Packit 032894
  (ELF_E_INVALID_INDEX_IDX + sizeof "invalid section index")
Packit 032894
  N_("invalid operand")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_SECTION_IDX \
Packit 032894
  (ELF_E_INVALID_OPERAND_IDX + sizeof "invalid operand")
Packit 032894
  N_("invalid section")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_COMMAND_IDX \
Packit 032894
  (ELF_E_INVALID_SECTION_IDX + sizeof "invalid section")
Packit 032894
  N_("invalid command")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_WRONG_ORDER_EHDR_IDX \
Packit 032894
  (ELF_E_INVALID_COMMAND_IDX + sizeof "invalid command")
Packit 032894
  N_("executable header not created first")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_FD_DISABLED_IDX \
Packit 032894
  (ELF_E_WRONG_ORDER_EHDR_IDX + sizeof "executable header not created first")
Packit 032894
  N_("file descriptor disabled")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_FD_MISMATCH_IDX \
Packit 032894
  (ELF_E_FD_DISABLED_IDX + sizeof "file descriptor disabled")
Packit 032894
  N_("archive/member file descriptor mismatch")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_OFFSET_RANGE_IDX \
Packit 032894
  (ELF_E_FD_MISMATCH_IDX + sizeof "archive/member file descriptor mismatch")
Packit 032894
  N_("offset out of range")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_NOT_NUL_SECTION_IDX \
Packit 032894
  (ELF_E_OFFSET_RANGE_IDX + sizeof "offset out of range")
Packit 032894
  N_("cannot manipulate null section")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_DATA_MISMATCH_IDX \
Packit 032894
  (ELF_E_NOT_NUL_SECTION_IDX + sizeof "cannot manipulate null section")
Packit 032894
  N_("data/scn mismatch")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_SECTION_HEADER_IDX \
Packit 032894
  (ELF_E_DATA_MISMATCH_IDX + sizeof "data/scn mismatch")
Packit 032894
  N_("invalid section header")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_DATA_IDX \
Packit 032894
  (ELF_E_INVALID_SECTION_HEADER_IDX + sizeof "invalid section header")
Packit 032894
  N_("invalid data")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_DATA_ENCODING_IDX \
Packit 032894
  (ELF_E_INVALID_DATA_IDX + sizeof "invalid data")
Packit 032894
  N_("unknown data encoding")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_SECTION_TOO_SMALL_IDX \
Packit 032894
  (ELF_E_DATA_ENCODING_IDX + sizeof "unknown data encoding")
Packit 032894
  N_("section `sh_size' too small for data")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_ALIGN_IDX \
Packit 032894
  (ELF_E_SECTION_TOO_SMALL_IDX + sizeof "section `sh_size' too small for data")
Packit 032894
  N_("invalid section alignment")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_SHENTSIZE_IDX \
Packit 032894
  (ELF_E_INVALID_ALIGN_IDX + sizeof "invalid section alignment")
Packit 032894
  N_("invalid section entry size")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_UPDATE_RO_IDX \
Packit 032894
  (ELF_E_INVALID_SHENTSIZE_IDX + sizeof "invalid section entry size")
Packit 032894
  N_("update() for write on read-only file")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_NOFILE_IDX \
Packit 032894
  (ELF_E_UPDATE_RO_IDX + sizeof "update() for write on read-only file")
Packit 032894
  N_("no such file")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_GROUP_NOT_REL_IDX \
Packit 032894
  (ELF_E_NOFILE_IDX + sizeof "no such file")
Packit 032894
  N_("only relocatable files can contain section groups")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_PHDR_IDX \
Packit 032894
  (ELF_E_GROUP_NOT_REL_IDX \
Packit 032894
   + sizeof "only relocatable files can contain section groups")
Packit 032894
  N_("program header only allowed in executables, shared objects, and \
Packit 032894
core files")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_NO_PHDR_IDX \
Packit 032894
  (ELF_E_INVALID_PHDR_IDX \
Packit 032894
   + sizeof "program header only allowed in executables, shared objects, and \
Packit 032894
core files")
Packit 032894
  N_("file has no program header")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_OFFSET_IDX \
Packit 032894
  (ELF_E_NO_PHDR_IDX \
Packit 032894
   + sizeof "file has no program header")
Packit 032894
  N_("invalid offset")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_SECTION_TYPE_IDX \
Packit 032894
  (ELF_E_INVALID_OFFSET_IDX \
Packit 032894
   + sizeof "invalid offset")
Packit 032894
  N_("invalid section type")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_INVALID_SECTION_FLAGS_IDX \
Packit 032894
  (ELF_E_INVALID_SECTION_TYPE_IDX \
Packit 032894
   + sizeof "invalid section type")
Packit 032894
  N_("invalid section flags")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_NOT_COMPRESSED_IDX		\
Packit 032894
  (ELF_E_INVALID_SECTION_FLAGS_IDX			\
Packit 032894
   + sizeof "invalid section flags")
Packit 032894
  N_("section does not contain compressed data")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_ALREADY_COMPRESSED_IDX \
Packit 032894
  (ELF_E_NOT_COMPRESSED_IDX \
Packit 032894
   + sizeof "section does not contain compressed data")
Packit 032894
  N_("section contains compressed data")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_UNKNOWN_COMPRESSION_TYPE_IDX \
Packit 032894
  (ELF_E_ALREADY_COMPRESSED_IDX \
Packit 032894
   + sizeof "section contains compressed data")
Packit 032894
  N_("unknown compression type")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_COMPRESS_ERROR_IDX \
Packit 032894
  (ELF_E_UNKNOWN_COMPRESSION_TYPE_IDX \
Packit 032894
   + sizeof "unknown compression type")
Packit 032894
  N_("cannot compress data")
Packit 032894
  "\0"
Packit 032894
#define ELF_E_DECOMPRESS_ERROR_IDX \
Packit 032894
  (ELF_E_COMPRESS_ERROR_IDX \
Packit 032894
   + sizeof "cannot compress data")
Packit 032894
  N_("cannot decompress data")
Packit 032894
};
Packit 032894
Packit 032894
Packit 032894
static const uint_fast16_t msgidx[ELF_E_NUM] =
Packit 032894
{
Packit 032894
  [ELF_E_NOERROR] = ELF_E_NOERROR_IDX,
Packit 032894
  [ELF_E_UNKNOWN_ERROR] = ELF_E_UNKNOWN_ERROR_IDX,
Packit 032894
  [ELF_E_UNKNOWN_VERSION] = ELF_E_UNKNOWN_VERSION_IDX,
Packit 032894
  [ELF_E_UNKNOWN_TYPE] = ELF_E_UNKNOWN_TYPE_IDX,
Packit 032894
  [ELF_E_INVALID_HANDLE] = ELF_E_INVALID_HANDLE_IDX,
Packit 032894
  [ELF_E_SOURCE_SIZE] = ELF_E_SOURCE_SIZE_IDX,
Packit 032894
  [ELF_E_DEST_SIZE] = ELF_E_DEST_SIZE_IDX,
Packit 032894
  [ELF_E_INVALID_ENCODING] = ELF_E_INVALID_ENCODING_IDX,
Packit 032894
  [ELF_E_NOMEM] = ELF_E_NOMEM_IDX,
Packit 032894
  [ELF_E_INVALID_FILE] = ELF_E_INVALID_FILE_IDX,
Packit 032894
  [ELF_E_INVALID_ELF] = ELF_E_INVALID_ELF_IDX,
Packit 032894
  [ELF_E_INVALID_OP] = ELF_E_INVALID_OP_IDX,
Packit 032894
  [ELF_E_NO_VERSION] = ELF_E_NO_VERSION_IDX,
Packit 032894
  [ELF_E_INVALID_CMD] = ELF_E_INVALID_CMD_IDX,
Packit 032894
  [ELF_E_RANGE] = ELF_E_RANGE_IDX,
Packit 032894
  [ELF_E_ARCHIVE_FMAG] = ELF_E_ARCHIVE_FMAG_IDX,
Packit 032894
  [ELF_E_INVALID_ARCHIVE] = ELF_E_INVALID_ARCHIVE_IDX,
Packit 032894
  [ELF_E_NO_ARCHIVE] = ELF_E_NO_ARCHIVE_IDX,
Packit 032894
  [ELF_E_NO_INDEX] = ELF_E_NO_INDEX_IDX,
Packit 032894
  [ELF_E_READ_ERROR] = ELF_E_READ_ERROR_IDX,
Packit 032894
  [ELF_E_WRITE_ERROR] = ELF_E_WRITE_ERROR_IDX,
Packit 032894
  [ELF_E_INVALID_CLASS] = ELF_E_INVALID_CLASS_IDX,
Packit 032894
  [ELF_E_INVALID_INDEX] = ELF_E_INVALID_INDEX_IDX,
Packit 032894
  [ELF_E_INVALID_OPERAND] = ELF_E_INVALID_OPERAND_IDX,
Packit 032894
  [ELF_E_INVALID_SECTION] = ELF_E_INVALID_SECTION_IDX,
Packit 032894
  [ELF_E_INVALID_COMMAND] = ELF_E_INVALID_COMMAND_IDX,
Packit 032894
  [ELF_E_WRONG_ORDER_EHDR] = ELF_E_WRONG_ORDER_EHDR_IDX,
Packit 032894
  [ELF_E_FD_DISABLED] = ELF_E_FD_DISABLED_IDX,
Packit 032894
  [ELF_E_FD_MISMATCH] = ELF_E_FD_MISMATCH_IDX,
Packit 032894
  [ELF_E_OFFSET_RANGE] = ELF_E_OFFSET_RANGE_IDX,
Packit 032894
  [ELF_E_NOT_NUL_SECTION] = ELF_E_NOT_NUL_SECTION_IDX,
Packit 032894
  [ELF_E_DATA_MISMATCH] = ELF_E_DATA_MISMATCH_IDX,
Packit 032894
  [ELF_E_INVALID_SECTION_HEADER] = ELF_E_INVALID_SECTION_HEADER_IDX,
Packit 032894
  [ELF_E_INVALID_DATA] = ELF_E_INVALID_DATA_IDX,
Packit 032894
  [ELF_E_DATA_ENCODING] = ELF_E_DATA_ENCODING_IDX,
Packit 032894
  [ELF_E_SECTION_TOO_SMALL] = ELF_E_SECTION_TOO_SMALL_IDX,
Packit 032894
  [ELF_E_INVALID_ALIGN] = ELF_E_INVALID_ALIGN_IDX,
Packit 032894
  [ELF_E_INVALID_SHENTSIZE] = ELF_E_INVALID_SHENTSIZE_IDX,
Packit 032894
  [ELF_E_UPDATE_RO] = ELF_E_UPDATE_RO_IDX,
Packit 032894
  [ELF_E_NOFILE] = ELF_E_NOFILE_IDX,
Packit 032894
  [ELF_E_GROUP_NOT_REL] = ELF_E_GROUP_NOT_REL_IDX,
Packit 032894
  [ELF_E_INVALID_PHDR] = ELF_E_INVALID_PHDR_IDX,
Packit 032894
  [ELF_E_NO_PHDR] = ELF_E_NO_PHDR_IDX,
Packit 032894
  [ELF_E_INVALID_OFFSET] = ELF_E_INVALID_OFFSET_IDX,
Packit 032894
  [ELF_E_INVALID_SECTION_TYPE] = ELF_E_INVALID_SECTION_TYPE_IDX,
Packit 032894
  [ELF_E_INVALID_SECTION_FLAGS] = ELF_E_INVALID_SECTION_FLAGS_IDX,
Packit 032894
  [ELF_E_NOT_COMPRESSED] = ELF_E_NOT_COMPRESSED_IDX,
Packit 032894
  [ELF_E_ALREADY_COMPRESSED] = ELF_E_ALREADY_COMPRESSED_IDX,
Packit 032894
  [ELF_E_UNKNOWN_COMPRESSION_TYPE] = ELF_E_UNKNOWN_COMPRESSION_TYPE_IDX,
Packit 032894
  [ELF_E_COMPRESS_ERROR] = ELF_E_COMPRESS_ERROR_IDX,
Packit 032894
  [ELF_E_DECOMPRESS_ERROR] = ELF_E_DECOMPRESS_ERROR_IDX
Packit 032894
};
Packit 032894
#define nmsgidx ((int) (sizeof (msgidx) / sizeof (msgidx[0])))
Packit 032894
Packit 032894
Packit 032894
void
Packit 032894
internal_function
Packit 032894
__libelf_seterrno (int value)
Packit 032894
{
Packit 032894
  global_error = value >= 0 && value < nmsgidx ? value : ELF_E_UNKNOWN_ERROR;
Packit 032894
}
Packit 032894
Packit 032894
Packit 032894
const char *
Packit 032894
elf_errmsg (int error)
Packit 032894
{
Packit 032894
  int last_error = global_error;
Packit 032894
Packit 032894
  if (error == 0)
Packit 032894
    {
Packit 032894
      assert (msgidx[last_error] < sizeof (msgstr));
Packit 032894
      return last_error != 0 ? _(msgstr + msgidx[last_error]) : NULL;
Packit 032894
    }
Packit 032894
  else if (error < -1 || error >= nmsgidx)
Packit 032894
    return _(msgstr + ELF_E_UNKNOWN_ERROR_IDX);
Packit 032894
Packit 032894
  assert (msgidx[error == -1 ? last_error : error] < sizeof (msgstr));
Packit 032894
  return _(msgstr + msgidx[error == -1 ? last_error : error]);
Packit 032894
}