1260684Skaiw/*- 2260684Skaiw * Copyright (c) 2006,2008,2011 Joseph Koshy 3260684Skaiw * All rights reserved. 4260684Skaiw * 5260684Skaiw * Redistribution and use in source and binary forms, with or without 6260684Skaiw * modification, are permitted provided that the following conditions 7260684Skaiw * are met: 8260684Skaiw * 1. Redistributions of source code must retain the above copyright 9260684Skaiw * notice, this list of conditions and the following disclaimer. 10260684Skaiw * 2. Redistributions in binary form must reproduce the above copyright 11260684Skaiw * notice, this list of conditions and the following disclaimer in the 12260684Skaiw * documentation and/or other materials provided with the distribution. 13260684Skaiw * 14260684Skaiw * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15260684Skaiw * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16260684Skaiw * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17260684Skaiw * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18260684Skaiw * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19260684Skaiw * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20260684Skaiw * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21260684Skaiw * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22260684Skaiw * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23260684Skaiw * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24260684Skaiw * SUCH DAMAGE. 25260684Skaiw */ 26260684Skaiw 27260684Skaiw#include <libelf.h> 28260684Skaiw#include <stdio.h> 29260684Skaiw#include <string.h> 30260684Skaiw 31260684Skaiw#include "_libelf.h" 32260684Skaiw 33280932SemasteELFTC_VCSID("$Id: elf_errmsg.c 3174 2015-03-27 17:13:41Z emaste $"); 34260684Skaiw 35260684Skaiw/* 36260684Skaiw * Retrieve a human readable translation for an error message. 37260684Skaiw */ 38260684Skaiw 39260848Skaiwstatic const char *_libelf_errors[] = { 40260684Skaiw#define DEFINE_ERROR(N,S) [ELF_E_##N] = S 41260684Skaiw DEFINE_ERROR(NONE, "No Error"), 42260684Skaiw DEFINE_ERROR(ARCHIVE, "Malformed ar(1) archive"), 43260684Skaiw DEFINE_ERROR(ARGUMENT, "Invalid argument"), 44260684Skaiw DEFINE_ERROR(CLASS, "ELF class mismatch"), 45260684Skaiw DEFINE_ERROR(DATA, "Invalid data buffer descriptor"), 46260684Skaiw DEFINE_ERROR(HEADER, "Missing or malformed ELF header"), 47260684Skaiw DEFINE_ERROR(IO, "I/O error"), 48260684Skaiw DEFINE_ERROR(LAYOUT, "Layout constraint violation"), 49260684Skaiw DEFINE_ERROR(MODE, "Incorrect ELF descriptor mode"), 50260684Skaiw DEFINE_ERROR(RANGE, "Value out of range of target"), 51260684Skaiw DEFINE_ERROR(RESOURCE, "Resource exhaustion"), 52260684Skaiw DEFINE_ERROR(SECTION, "Invalid section descriptor"), 53260684Skaiw DEFINE_ERROR(SEQUENCE, "API calls out of sequence"), 54260684Skaiw DEFINE_ERROR(UNIMPL, "Unimplemented feature"), 55260684Skaiw DEFINE_ERROR(VERSION, "Unknown ELF API version"), 56260684Skaiw DEFINE_ERROR(NUM, "Unknown error") 57260684Skaiw#undef DEFINE_ERROR 58260684Skaiw}; 59260684Skaiw 60260684Skaiwconst char * 61260684Skaiwelf_errmsg(int error) 62260684Skaiw{ 63260684Skaiw int oserr; 64260684Skaiw 65260684Skaiw if (error == ELF_E_NONE && 66260684Skaiw (error = LIBELF_PRIVATE(error)) == 0) 67260684Skaiw return NULL; 68260684Skaiw else if (error == -1) 69260684Skaiw error = LIBELF_PRIVATE(error); 70260684Skaiw 71260684Skaiw oserr = error >> LIBELF_OS_ERROR_SHIFT; 72260684Skaiw error &= LIBELF_ELF_ERROR_MASK; 73260684Skaiw 74260684Skaiw if (error < ELF_E_NONE || error >= ELF_E_NUM) 75260684Skaiw return _libelf_errors[ELF_E_NUM]; 76260684Skaiw if (oserr) { 77276371Semaste (void) snprintf((char *) LIBELF_PRIVATE(msg), 78260684Skaiw sizeof(LIBELF_PRIVATE(msg)), "%s: %s", 79260684Skaiw _libelf_errors[error], strerror(oserr)); 80260684Skaiw return (const char *)&LIBELF_PRIVATE(msg); 81260684Skaiw } 82260684Skaiw return _libelf_errors[error]; 83260684Skaiw} 84