diff options
Diffstat (limited to 'libdwelf')
| -rw-r--r-- | libdwelf/ChangeLog | 12 | ||||
| -rw-r--r-- | libdwelf/Makefile.am | 3 | ||||
| -rw-r--r-- | libdwelf/dwelf_elf_begin.c | 12 | ||||
| -rw-r--r-- | libdwelf/dwelf_elf_e_machine_string.c | 406 | ||||
| -rw-r--r-- | libdwelf/libdwelf.h | 13 |
5 files changed, 437 insertions, 9 deletions
diff --git a/libdwelf/ChangeLog b/libdwelf/ChangeLog index 88be3421..5b48ed8f 100644 --- a/libdwelf/ChangeLog +++ b/libdwelf/ChangeLog @@ -1,3 +1,15 @@ +2019-08-12 Mark Wielaard <[email protected]> + + * libdwelf.h (dwelf_elf_begin): Update documentation. + * dwelf_elf_begin.c (dwelf_elf_begin): Don't suppress ELF_K_NONE. + Mark old and new version. + +2019-06-28 Mark Wielaard <[email protected]> + + * Makefile.am (libdwelf_a_SOURCES): Add dwelf_elf_e_machine_string.c. + * libdwelf.h (dwelf_elf_e_machine_string): Define new function. + * dwelf_elf_e_machine_string.c: New file. + 2018-10-21 Mark Wielaard <[email protected]> * libdwelf.h (dwelf_elf_begin): Add function declaration. diff --git a/libdwelf/Makefile.am b/libdwelf/Makefile.am index da418e6e..dd7adf07 100644 --- a/libdwelf/Makefile.am +++ b/libdwelf/Makefile.am @@ -42,7 +42,8 @@ noinst_HEADERS = libdwelfP.h libdwelf_a_CFLAGS = -fPIC -fvisibility=hidden $(AM_CFLAGS) libdwelf_a_SOURCES = dwelf_elf_gnu_debuglink.c dwelf_dwarf_gnu_debugaltlink.c \ dwelf_elf_gnu_build_id.c dwelf_scn_gnu_compressed_size.c \ - dwelf_strtab.c dwelf_elf_begin.c + dwelf_strtab.c dwelf_elf_begin.c \ + dwelf_elf_e_machine_string.c libdwelf = $(libdw) diff --git a/libdwelf/dwelf_elf_begin.c b/libdwelf/dwelf_elf_begin.c index 79825338..c7d63a1c 100644 --- a/libdwelf/dwelf_elf_begin.c +++ b/libdwelf/dwelf_elf_begin.c @@ -41,13 +41,13 @@ dwelf_elf_begin (int fd) { Elf *elf = NULL; Dwfl_Error e = __libdw_open_elf (fd, &elf); - if (elf != NULL && elf_kind (elf) != ELF_K_NONE) + if (e == DWFL_E_NOERROR) return elf; - /* Elf wasn't usable. Make sure there is a proper elf error message. */ - - if (elf != NULL) - elf_end (elf); + /* Elf wasn't usable. Make sure there is a proper elf error + message. This is probably not the real error, because there is + no good way to propagate errnos or decompression errors, but + better than nothing. */ if (e != DWFL_E_LIBELF) { @@ -60,3 +60,5 @@ dwelf_elf_begin (int fd) return NULL; } +OLD_VERSION (dwelf_elf_begin, ELFUTILS_0.175) +NEW_VERSION (dwelf_elf_begin, ELFUTILS_0.177) diff --git a/libdwelf/dwelf_elf_e_machine_string.c b/libdwelf/dwelf_elf_e_machine_string.c new file mode 100644 index 00000000..de07b01e --- /dev/null +++ b/libdwelf/dwelf_elf_e_machine_string.c @@ -0,0 +1,406 @@ +/* Returns a human readable description of an ELF header e_machine value. + Copyright (C) 2019 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see <http://www.gnu.org/licenses/>. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "libdwelf.h" + + +const char * +dwelf_elf_e_machine_string (int machine) +{ + switch (machine) + { + case EM_NONE: + return "None"; + case EM_M32: + return "WE32100"; + case EM_SPARC: + return "SPARC"; + case EM_386: + return "Intel 80386"; + case EM_68K: + return "M68K"; + case EM_88K: + return "M88K"; + case EM_IAMCU: + return "Intel MCU"; + case EM_860: + return "Intel 80860"; + case EM_MIPS: + return "MIPS R3000"; + case EM_S370: + return "IBM System/370"; + case EM_MIPS_RS3_LE: + return "MIPS R3000"; + case EM_PARISC: + return "HPPA"; + case EM_VPP500: + return "Fujitsu VPP500"; + case EM_SPARC32PLUS: + return "SPARC v8+"; + case EM_960: + return "Intel 80960"; + case EM_PPC: + return "PowerPC"; + case EM_PPC64: + return "PowerPC64"; + case EM_S390: + return "IBM S/390"; + case EM_SPU: + return "IBM SPU/SPC"; + case EM_V800: + return "NEC V800"; + case EM_FR20: + return "Fujitsu FR20"; + case EM_RH32: + return "TRW RH-32"; + case EM_RCE: + return "Motorola RCE"; + case EM_ARM: + return "ARM"; + case EM_FAKE_ALPHA: + return "Digital Alpha"; + case EM_SH: + return "SH"; + case EM_SPARCV9: + return "SPARC v9"; + case EM_TRICORE: + return "Siemens Tricore"; + case EM_ARC: + return "ARC"; + case EM_H8_300: + return "H8/300"; + case EM_H8_300H: + return "H8/300H"; + case EM_H8S: + return "H8S"; + case EM_H8_500: + return "H8/500"; + case EM_IA_64: + return "Intel IA-64"; + case EM_MIPS_X: + return "Stanford MIPS-X"; + case EM_COLDFIRE: + return "Motorola Coldfire"; + case EM_68HC12: + return "Motorola M68HC12"; + case EM_MMA: + return "Fujitsu MMA Multimedia Accelerator"; + case EM_PCP: + return "Siemens PCP"; + case EM_NCPU: + return "Sony nCPU embeded RISC"; + case EM_NDR1: + return "Denso NDR1 microprocessor"; + case EM_STARCORE: + return "Motorola Star*Core processor"; + case EM_ME16: + return "Toyota ME16 processor"; + case EM_ST100: + return "STMicroelectronic ST100"; + case EM_TINYJ: + return "Advanced Logic Corporation Tinyj"; + case EM_X86_64: + return "AMD x86-64"; + case EM_PDSP: + return "Sony DSP Processor"; + case EM_PDP10: + return "Digital PDP-10"; + case EM_PDP11: + return "Digital PDP-11"; + case EM_FX66: + return "Siemens FX66 microcontroller"; + case EM_ST9PLUS: + return "STMicroelectronics ST9+"; + case EM_ST7: + return "STMicroelectronics ST7"; + case EM_68HC16: + return "Motorola MC68HC16 microcontroller"; + case EM_68HC11: + return "Motorola MC68HC11 microcontroller"; + case EM_68HC08: + return "Motorola MC68HC08 microcontroller"; + case EM_68HC05: + return "Motorola MC68HC05 microcontroller"; + case EM_SVX: + return "Silicon Graphics SVx"; + case EM_ST19: + return "STMicroelectronics ST19"; + case EM_VAX: + return "Digital VAX"; + case EM_CRIS: + return "Axis Communications 32-bit embedded processor"; + case EM_JAVELIN: + return "Infineon Technologies 32-bit embedded processor"; + case EM_FIREPATH: + return "Element 14 64-bit DSP Processor"; + case EM_ZSP: + return "LSI Logic 16-bit DSP Processor"; + case EM_MMIX: + return "Donald Knuth's educational 64-bit processor"; + case EM_HUANY: + return "Harvard University machine-independent object"; + case EM_PRISM: + return "SiTera Prism"; + case EM_AVR: + return "Atmel AVR 8-bit microcontroller"; + case EM_FR30: + return "Fujitsu FR30"; + case EM_D10V: + return "Mitsubishi D10V"; + case EM_D30V: + return "Mitsubishi D30V"; + case EM_V850: + return "NEC v850"; + case EM_M32R: + return "Mitsubishi M32R"; + case EM_MN10300: + return "Matsushita MN10300"; + case EM_MN10200: + return "Matsushita MN10200"; + case EM_PJ: + return "picoJava"; + case EM_OPENRISC: + return "OpenRISC"; + case EM_ARC_COMPACT: + return "ARC International ARCompact"; + case EM_XTENSA: + return "Tensilica Xtensa Architecture"; + case EM_VIDEOCORE: + return "Alphamosaic VideoCore"; + case EM_TMM_GPP: + return "Thompson Multimedia General Purpose Processor"; + case EM_NS32K: + return "National Semiconductor 32000"; + case EM_TPC: + return "Tenor Network TPC"; + case EM_SNP1K: + return "Trebia SNP 1000"; + case EM_ST200: + return "STMicroelectronics ST200"; + case EM_IP2K: + return "Ubicom IP2xxx"; + case EM_MAX: + return "MAX processor"; + case EM_CR: + return "National Semiconductor CompactRISC"; + case EM_F2MC16: + return "Fujitsu F2MC16"; + case EM_MSP430: + return "Texas Instruments msp430"; + case EM_BLACKFIN: + return "Analog Devices Blackfin DSP"; + case EM_SE_C33: + return "Seiko Epson S1C33"; + case EM_SEP: + return "Sharp embedded microprocessor"; + case EM_ARCA: + return "Arca RISC"; + case EM_UNICORE: + return "Unicore"; + case EM_EXCESS: + return "eXcess configurable CPU"; + case EM_DXP: + return "Icera Semiconductor Deep Execution Processor"; + case EM_ALTERA_NIOS2: + return "Altera Nios II"; + case EM_CRX: + return "National Semiconductor CompactRISC CRX"; + case EM_XGATE: + return "Motorola XGATE"; + case EM_C166: + return "Infineon C16x/XC16x"; + case EM_M16C: + return "Renesas M16C"; + case EM_DSPIC30F: + return "Microchip Technology dsPIC30F"; + case EM_CE: + return "Freescale Communication Engine RISC"; + case EM_M32C: + return "Renesas M32C"; + case EM_TSK3000: + return "Altium TSK3000"; + case EM_RS08: + return "Freescale RS08"; + case EM_SHARC: + return "Analog Devices SHARC"; + case EM_ECOG2: + return "Cyan Technology eCOG2"; + case EM_SCORE7: + return "Sunplus S+core7 RISC"; + case EM_DSP24: + return "New Japan Radio (NJR) 24-bit DSP"; + case EM_VIDEOCORE3: + return "Broadcom VideoCore III"; + case EM_LATTICEMICO32: + return "RISC for Lattice FPGA"; + case EM_SE_C17: + return "Seiko Epson C17"; + case EM_TI_C6000: + return "Texas Instruments TMS320C6000 DSP"; + case EM_TI_C2000: + return "Texas Instruments TMS320C2000 DSP"; + case EM_TI_C5500: + return "Texas Instruments TMS320C55x DSP"; + case EM_TI_ARP32: + return "Texas Instruments Application Specific RISC"; + case EM_TI_PRU: + return "Texas Instruments Programmable Realtime Unit"; + case EM_MMDSP_PLUS: + return "STMicroelectronics 64bit VLIW DSP"; + case EM_CYPRESS_M8C: + return "Cypress M8C"; + case EM_R32C: + return "Renesas R32C"; + case EM_TRIMEDIA: + return "NXP Semiconductors TriMedia"; + case EM_QDSP6: + return "QUALCOMM DSP6"; + case EM_8051: + return "Intel 8051 and variants"; + case EM_STXP7X: + return "STMicroelectronics STxP7x"; + case EM_NDS32: + return "Andes Technology compact code size embeded RISC"; + case EM_ECOG1X: + return "Cyan Technology eCOG1X"; + case EM_MAXQ30: + return "Dallas Semicondutor MAXQ30"; + case EM_XIMO16: + return "New Japan Radio (NJR) 16-bit DSP"; + case EM_MANIK: + return "M2000 Reconfigurable RISC"; + case EM_CRAYNV2: + return "Cray NV2 vector architecture"; + case EM_RX: + return "Renesas RX"; + case EM_METAG: + return "Imagination Technologies META"; + case EM_MCST_ELBRUS: + return "MCST Elbrus"; + case EM_ECOG16: + return "Cyan Technology eCOG16"; + case EM_CR16: + return "National Semiconductor CompactRISC"; + case EM_ETPU: + return "Freescale Extended Time Processing Unit"; + case EM_SLE9X: + return "Infineon Technologies SLE9X"; + case EM_L10M: + return "Intel L10M"; + case EM_K10M: + return "Intel K10M"; + case EM_AARCH64: + return "AARCH64"; + case EM_AVR32: + return "Amtel AVR32"; + case EM_STM8: + return "STMicroelectronics STM8"; + case EM_TILE64: + return "Tilera TILE64"; + case EM_TILEPRO: + return "Tilera TILEPro"; + case EM_MICROBLAZE: + return "Xilinx MicroBlaze"; + case EM_CUDA: + return "NVIDIA CUDA"; + case EM_TILEGX: + return "Tilera TILE-Gx"; + case EM_CLOUDSHIELD: + return "CloudShield"; + case EM_COREA_1ST: + return "KIPO-KAIST Core-A 1st gen"; + case EM_COREA_2ND: + return "KIPO-KAIST Core-A 2nd gen"; + case EM_ARC_COMPACT2: + return "Synopsys ARCompact V2"; + case EM_OPEN8: + return "Open8 RISC"; + case EM_RL78: + return "Renesas RL78"; + case EM_VIDEOCORE5: + return "Broadcom VideoCore V"; + case EM_78KOR: + return "Renesas 78KOR"; + case EM_56800EX: + return "Freescale 56800EX DSC"; + case EM_BA1: + return "Beyond BA1"; + case EM_BA2: + return "Beyond BA2"; + case EM_XCORE: + return "XMOS xCORE"; + case EM_MCHP_PIC: + return "Microchip 8-bit PIC"; + case EM_KM32: + return "KM211 KM32"; + case EM_KMX32: + return "KM211 KMX32"; + case EM_EMX16: + return "KM211 KMX16"; + case EM_EMX8: + return "KM211 KMX8"; + case EM_KVARC: + return "KM211 KVARC"; + case EM_CDP: + return "Paneve CDP"; + case EM_COGE: + return "Cognitive Smart Memory Processor"; + case EM_COOL: + return "Bluechip CoolEngine"; + case EM_NORC: + return "Nanoradio Optimized RISC"; + case EM_CSR_KALIMBA: + return "CSR Kalimba"; + case EM_Z80: + return "Zilog Z80"; + case EM_VISIUM: + return "CDS VISIUMcore"; + case EM_FT32: + return "FTDI Chip FT32"; + case EM_MOXIE: + return "Moxie"; + case EM_AMDGPU: + return "AMD GPU"; + case EM_RISCV: + return "RISC-V"; + case EM_BPF: + return "BPF"; + case EM_CSKY: + return "C-SKY"; + + case EM_ALPHA: + return "Alpha"; + + default: + return NULL; + } +} diff --git a/libdwelf/libdwelf.h b/libdwelf/libdwelf.h index 6d491847..dbb8f08c 100644 --- a/libdwelf/libdwelf.h +++ b/libdwelf/libdwelf.h @@ -128,11 +128,18 @@ extern void dwelf_strtab_free (Dwelf_Strtab *st) /* Creates a read-only Elf handle from the given file handle. The file may be compressed and/or contain a linux kernel image header, in which case it is eagerly decompressed in full and the Elf handle - is created as if created with elf_memory (). On error NULL is - returned. The Elf handle should be closed with elf_end (). The - file handle will not be closed. Does not return ELF_K_NONE handles. */ + is created as if created with elf_memory (). On decompression or + file errors NULL is returned (and elf_errno will be set). If there + was no error, but the file is not an ELF file, then an ELF_K_NONE + Elf handle is returned (just like with elf_begin). The Elf handle + should be closed with elf_end (). The file handle will not be + closed. */ extern Elf *dwelf_elf_begin (int fd); +/* Returns a human readable string for the given ELF header e_machine + value, or NULL if the given number isn't currently known. */ +extern const char *dwelf_elf_e_machine_string (int machine); + #ifdef __cplusplus } #endif |
