elf_errmsg.c revision 260848
117443Sphk/*- 217443Sphk * Copyright (c) 2006,2008,2011 Joseph Koshy 317443Sphk * All rights reserved. 450477Speter * 517443Sphk * Redistribution and use in source and binary forms, with or without 617443Sphk * modification, are permitted provided that the following conditions 717443Sphk * are met: 817455Sphk * 1. Redistributions of source code must retain the above copyright 917455Sphk * notice, this list of conditions and the following disclaimer. 1017455Sphk * 2. Redistributions in binary form must reproduce the above copyright 1117455Sphk * notice, this list of conditions and the following disclaimer in the 12179036Sscf * documentation and/or other materials provided with the distribution. 1317455Sphk * 14106929Ssam * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15106929Ssam * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16106929Ssam * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17106929Ssam * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18106929Ssam * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19106929Ssam * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20106929Ssam * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2117455Sphk * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22106929Ssam * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2317455Sphk * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24106929Ssam * SUCH DAMAGE. 25106929Ssam */ 26106929Ssam 27106929Ssam#include <sys/cdefs.h> 2817455Sphk 29106929Ssam#include <libelf.h> 3017455Sphk#include <stdio.h> 3117455Sphk#include <string.h> 32106929Ssam 33106929Ssam#include "_libelf.h" 3417455Sphk 35106929SsamELFTC_VCSID("$Id: elf_errmsg.c 2225 2011-11-26 18:55:54Z jkoshy $"); 36106929Ssam 37106929Ssam/* 38106929Ssam * Retrieve a human readable translation for an error message. 3917455Sphk */ 4017455Sphk 41106929Ssamstatic const char *_libelf_errors[] = { 4217455Sphk#define DEFINE_ERROR(N,S) [ELF_E_##N] = S 43106929Ssam DEFINE_ERROR(NONE, "No Error"), 4417455Sphk DEFINE_ERROR(ARCHIVE, "Malformed ar(1) archive"), 4517455Sphk DEFINE_ERROR(ARGUMENT, "Invalid argument"), 46106929Ssam DEFINE_ERROR(CLASS, "ELF class mismatch"), 4717455Sphk DEFINE_ERROR(DATA, "Invalid data buffer descriptor"), 48106929Ssam DEFINE_ERROR(HEADER, "Missing or malformed ELF header"), 49106929Ssam DEFINE_ERROR(IO, "I/O error"), 5017455Sphk DEFINE_ERROR(LAYOUT, "Layout constraint violation"), 5117455Sphk DEFINE_ERROR(MODE, "Incorrect ELF descriptor mode"), 5217455Sphk DEFINE_ERROR(RANGE, "Value out of range of target"), 5317455Sphk DEFINE_ERROR(RESOURCE, "Resource exhaustion"), 5417455Sphk DEFINE_ERROR(SECTION, "Invalid section descriptor"), 5517455Sphk DEFINE_ERROR(SEQUENCE, "API calls out of sequence"), 5617455Sphk DEFINE_ERROR(UNIMPL, "Unimplemented feature"), 5717455Sphk DEFINE_ERROR(VERSION, "Unknown ELF API version"), 5817455Sphk DEFINE_ERROR(NUM, "Unknown error") 5917455Sphk#undef DEFINE_ERROR 60165724Scsjp}; 6117455Sphk 6217455Sphkconst char * 6317455Sphkelf_errmsg(int error) 64164381Ssam{ 6517455Sphk int oserr; 6617455Sphk 6717455Sphk if (error == ELF_E_NONE && 6817455Sphk (error = LIBELF_PRIVATE(error)) == 0) 69165724Scsjp return NULL; 7017455Sphk else if (error == -1) 71164785Simp error = LIBELF_PRIVATE(error); 7217455Sphk 73106929Ssam oserr = error >> LIBELF_OS_ERROR_SHIFT; 74106929Ssam error &= LIBELF_ELF_ERROR_MASK; 75103024Ssobomax 76103024Ssobomax if (error < ELF_E_NONE || error >= ELF_E_NUM) 77103024Ssobomax return _libelf_errors[ELF_E_NUM]; 78103024Ssobomax if (oserr) { 79103024Ssobomax (void) snprintf(LIBELF_PRIVATE(msg), 80103024Ssobomax sizeof(LIBELF_PRIVATE(msg)), "%s: %s", 81103024Ssobomax _libelf_errors[error], strerror(oserr)); 82103024Ssobomax return (const char *)&LIBELF_PRIVATE(msg); 83103024Ssobomax } 84103024Ssobomax return _libelf_errors[error]; 85103024Ssobomax} 86103024Ssobomax