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