diff options
Diffstat (limited to 'trunk/gelf')
-rw-r--r-- | trunk/gelf/Makefile.am | 13 | ||||
-rw-r--r-- | trunk/gelf/gelf.c | 573 | ||||
-rw-r--r-- | trunk/gelf/gelf.h | 72 |
3 files changed, 0 insertions, 658 deletions
diff --git a/trunk/gelf/Makefile.am b/trunk/gelf/Makefile.am deleted file mode 100644 index f6320fa..0000000 --- a/trunk/gelf/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -## Process this file with automake to create Makefile.in - -AUTOMAKE_OPTIONS = 1.4 gnu - -DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -Wall -AM_CFLAGS = -Wall -INCLUDES = @GELFINCLUDE@ - -noinst_LTLIBRARIES = libgelf.la - -libgelf_la_SOURCES = gelf.c - -noinst_HEADERS = gelf.h diff --git a/trunk/gelf/gelf.c b/trunk/gelf/gelf.c deleted file mode 100644 index 915cf5b..0000000 --- a/trunk/gelf/gelf.c +++ /dev/null @@ -1,573 +0,0 @@ -/* Generic ELF wrapper for libelf which does not support gelf_ API. - Copyright (C) 2001, 2002, 2004 Red Hat, Inc. - Written by Jakub Jelinek <jakub@redhat.com>, 2001. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program 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 a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include <config.h> -#include <elf.h> -#include <libelf.h> -#include <stdlib.h> -#include <string.h> -#include <sys/types.h> -#include "gelf.h" - -inline int -gelf_getclass (Elf *elf) -{ - size_t size; - char *e_ident = elf_getident (elf, &size); - - if (e_ident == NULL) - return ELFCLASSNONE; - switch (e_ident [EI_CLASS]) - { - case ELFCLASS32: - case ELFCLASS64: - return e_ident [EI_CLASS]; - default: - return ELFCLASSNONE; - } -} - -size_t -gelf_fsize (Elf *elf, Elf_Type type, size_t count, unsigned int ver) -{ - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - return elf32_fsize (type, count, ver); - case ELFCLASS64: - return elf64_fsize (type, count, ver); - default: - return 0; - } -} - -GElf_Ehdr * -gelf_getehdr (Elf *elf, GElf_Ehdr *dst) -{ - Elf32_Ehdr *ehdr32; - Elf64_Ehdr *ehdr64; - - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - ehdr32 = elf32_getehdr (elf); - if (ehdr32 != NULL) - { - memcpy (dst->e_ident, ehdr32->e_ident, EI_NIDENT); - dst->e_type = ehdr32->e_type; - dst->e_machine = ehdr32->e_machine; - dst->e_version = ehdr32->e_version; - dst->e_entry = ehdr32->e_entry; - dst->e_phoff = ehdr32->e_phoff; - dst->e_shoff = ehdr32->e_shoff; - dst->e_flags = ehdr32->e_flags; - dst->e_ehsize = ehdr32->e_ehsize; - dst->e_phentsize = ehdr32->e_phentsize; - dst->e_phnum = ehdr32->e_phnum; - dst->e_shentsize = ehdr32->e_shentsize; - dst->e_shnum = ehdr32->e_shnum; - dst->e_shstrndx = ehdr32->e_shstrndx; - return dst; - } - break; - case ELFCLASS64: - ehdr64 = elf64_getehdr (elf); - if (ehdr64 != NULL) - { - memcpy (dst, ehdr64, sizeof (Elf64_Ehdr)); - return dst; - } - } - return NULL; -} - -int -gelf_update_ehdr (Elf *elf, GElf_Ehdr *src) -{ - Elf32_Ehdr *ehdr32; - Elf64_Ehdr *ehdr64; - - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - ehdr32 = elf32_getehdr (elf); - if (ehdr32 == NULL) - return 0; - memcpy (ehdr32->e_ident, src->e_ident, EI_NIDENT); - ehdr32->e_type = src->e_type; - ehdr32->e_machine = src->e_machine; - ehdr32->e_version = src->e_version; - ehdr32->e_entry = src->e_entry; - ehdr32->e_phoff = src->e_phoff; - ehdr32->e_shoff = src->e_shoff; - ehdr32->e_flags = src->e_flags; - ehdr32->e_ehsize = src->e_ehsize; - ehdr32->e_phentsize = src->e_phentsize; - ehdr32->e_phnum = src->e_phnum; - ehdr32->e_shentsize = src->e_shentsize; - ehdr32->e_shnum = src->e_shnum; - ehdr32->e_shstrndx = src->e_shstrndx; - return 1; - case ELFCLASS64: - ehdr64 = elf64_getehdr (elf); - if (ehdr64 != NULL) - { - memcpy (ehdr64, src, sizeof (Elf64_Ehdr)); - return 1; - } - default: - break; - } - return 0; -} - -unsigned long -gelf_newehdr (Elf *elf, int class) -{ - switch (class) - { - case ELFCLASS32: - return (unsigned long) elf32_newehdr (elf); - case ELFCLASS64: - return (unsigned long) elf64_newehdr (elf); - default: - return 0; - } -} - -GElf_Phdr * -gelf_getphdr (Elf *elf, int ndx, GElf_Phdr *dst) -{ - Elf32_Ehdr *ehdr32; - Elf64_Ehdr *ehdr64; - Elf32_Phdr *phdr32; - Elf64_Phdr *phdr64; - - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - phdr32 = elf32_getphdr (elf); - if (phdr32 == NULL) - return NULL; - ehdr32 = elf32_getehdr (elf); - if (ehdr32 == NULL) - return NULL; - if (ndx >= ehdr32->e_phnum) - return NULL; - phdr32 += ndx; - dst->p_type = phdr32->p_type; - dst->p_offset = phdr32->p_offset; - dst->p_vaddr = phdr32->p_vaddr; - dst->p_paddr = phdr32->p_paddr; - dst->p_filesz = phdr32->p_filesz; - dst->p_memsz = phdr32->p_memsz; - dst->p_flags = phdr32->p_flags; - dst->p_align = phdr32->p_align; - return dst; - case ELFCLASS64: - phdr64 = elf64_getphdr (elf); - if (phdr64 == NULL) - return NULL; - ehdr64 = elf64_getehdr (elf); - if (ehdr64 == NULL) - return NULL; - if (ndx >= ehdr64->e_phnum) - return NULL; - memcpy (dst, phdr64 + ndx, sizeof (Elf64_Phdr)); - return dst; - default: - return NULL; - } -} - -int -gelf_update_phdr (Elf *elf, int ndx, GElf_Phdr *src) -{ - Elf32_Ehdr *ehdr32; - Elf64_Ehdr *ehdr64; - Elf32_Phdr *phdr32; - Elf64_Phdr *phdr64; - - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - phdr32 = elf32_getphdr (elf); - if (phdr32 == NULL) - return 0; - ehdr32 = elf32_getehdr (elf); - if (ehdr32 == NULL) - return 0; - if (ndx >= ehdr32->e_phnum) - return 0; - phdr32 += ndx; - phdr32->p_type = src->p_type; - phdr32->p_offset = src->p_offset; - phdr32->p_vaddr = src->p_vaddr; - phdr32->p_paddr = src->p_paddr; - phdr32->p_filesz = src->p_filesz; - phdr32->p_memsz = src->p_memsz; - phdr32->p_flags = src->p_flags; - phdr32->p_align = src->p_align; - return 1; - case ELFCLASS64: - phdr64 = elf64_getphdr (elf); - if (phdr64 == NULL) - return 0; - ehdr64 = elf64_getehdr (elf); - if (ehdr64 == NULL) - return 0; - if (ndx >= ehdr64->e_phnum) - return 0; - memcpy (phdr64 + ndx, src, sizeof (Elf64_Phdr)); - return 1; - default: - return 0; - } -} - -unsigned long -gelf_newphdr (Elf *elf, size_t phnum) -{ - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - return (unsigned long) elf32_newphdr (elf, phnum); - case ELFCLASS64: - return (unsigned long) elf64_newphdr (elf, phnum); - default: - return 0; - } -} - -GElf_Shdr * -gelfx_getshdr (Elf *elf, Elf_Scn *scn, GElf_Shdr *dst) -{ - Elf32_Shdr *shdr32; - Elf64_Shdr *shdr64; - - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - shdr32 = elf32_getshdr (scn); - if (shdr32 == NULL) - return NULL; - dst->sh_name = shdr32->sh_name; - dst->sh_type = shdr32->sh_type; - dst->sh_flags = shdr32->sh_flags; - dst->sh_addr = shdr32->sh_addr; - dst->sh_offset = shdr32->sh_offset; - dst->sh_size = shdr32->sh_size; - dst->sh_link = shdr32->sh_link; - dst->sh_info = shdr32->sh_info; - dst->sh_addralign = shdr32->sh_addralign; - dst->sh_entsize = shdr32->sh_entsize; - return dst; - case ELFCLASS64: - shdr64 = elf64_getshdr (scn); - if (shdr64 == NULL) - return NULL; - memcpy (dst, shdr64, sizeof (Elf64_Shdr)); - return dst; - default: - return NULL; - } -} - -int -gelfx_update_shdr (Elf *elf, Elf_Scn *scn, GElf_Shdr *src) -{ - Elf32_Shdr *shdr32; - Elf64_Shdr *shdr64; - - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - shdr32 = elf32_getshdr (scn); - if (shdr32 == NULL) - return 0; - shdr32->sh_name = src->sh_name; - shdr32->sh_type = src->sh_type; - shdr32->sh_flags = src->sh_flags; - shdr32->sh_addr = src->sh_addr; - shdr32->sh_offset = src->sh_offset; - shdr32->sh_size = src->sh_size; - shdr32->sh_link = src->sh_link; - shdr32->sh_info = src->sh_info; - shdr32->sh_addralign = src->sh_addralign; - shdr32->sh_entsize = src->sh_entsize; - return 1; - case ELFCLASS64: - shdr64 = elf64_getshdr (scn); - if (shdr64 == NULL) - return 0; - memcpy (shdr64, src, sizeof (Elf64_Shdr)); - return 1; - default: - return 0; - } -} - -Elf_Data * -gelf_xlatetom (Elf *elf, Elf_Data *dst, const Elf_Data *src, unsigned encode) -{ - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - return elf32_xlatetom (dst, src, encode); - case ELFCLASS64: - return elf64_xlatetom (dst, src, encode); - default: - return NULL; - } -} - -Elf_Data * -gelf_xlatetof (Elf *elf, Elf_Data *dst, const Elf_Data *src, unsigned encode) -{ - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - return elf32_xlatetof (dst, src, encode); - case ELFCLASS64: - return elf64_xlatetof (dst, src, encode); - default: - return NULL; - } -} - -GElf_Sym *gelfx_getsym (Elf *elf, Elf_Data *data, int ndx, GElf_Sym *dst) -{ - Elf32_Sym *sym32; - - if (data->d_type != ELF_T_SYM) - return NULL; - - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - if ((ndx + 1) * sizeof (Elf32_Sym) > data->d_size) - return NULL; - sym32 = &((Elf32_Sym *) data->d_buf)[ndx]; - dst->st_name = sym32->st_name; - dst->st_info = sym32->st_info; - dst->st_other = sym32->st_other; - dst->st_shndx = sym32->st_shndx; - dst->st_value = sym32->st_value; - dst->st_size = sym32->st_size; - return dst; - case ELFCLASS64: - if ((ndx + 1) * sizeof (Elf64_Sym) > data->d_size) - return NULL; - *dst = ((GElf_Sym *) data->d_buf)[ndx]; - return dst; - default: - return NULL; - } -} - -int gelfx_update_sym (Elf *elf, Elf_Data *data, int ndx, GElf_Sym *src) -{ - Elf32_Sym *sym32; - - if (data->d_type != ELF_T_SYM) - return 0; - - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - if ((ndx + 1) * sizeof (Elf32_Sym) > data->d_size) - return 0; - sym32 = &((Elf32_Sym *) data->d_buf)[ndx]; - sym32->st_name = src->st_name; - sym32->st_info = src->st_info; - sym32->st_other = src->st_other; - sym32->st_shndx = src->st_shndx; - sym32->st_value = src->st_value; - sym32->st_size = src->st_size; - return 1; - case ELFCLASS64: - if ((ndx + 1) * sizeof (Elf64_Sym) > data->d_size) - return 0; - ((GElf_Sym *) data->d_buf)[ndx] = *src; - return 1; - default: - return 0; - } -} - -GElf_Dyn *gelfx_getdyn (Elf *elf, Elf_Data *data, int ndx, GElf_Dyn *dst) -{ - Elf32_Dyn *dyn32; - - if (data->d_type != ELF_T_DYN) - return NULL; - - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - if ((ndx + 1) * sizeof (Elf32_Dyn) > data->d_size) - return NULL; - dyn32 = &((Elf32_Dyn *) data->d_buf)[ndx]; - dst->d_tag = dyn32->d_tag; - dst->d_un.d_val = dyn32->d_un.d_val; - return dst; - case ELFCLASS64: - if ((ndx + 1) * sizeof (Elf64_Dyn) > data->d_size) - return NULL; - *dst = ((GElf_Dyn *) data->d_buf)[ndx]; - return dst; - default: - return NULL; - } -} - -int gelfx_update_dyn (Elf *elf, Elf_Data *data, int ndx, GElf_Dyn *src) -{ - Elf32_Dyn *dyn32; - - if (data->d_type != ELF_T_DYN) - return 0; - - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - if ((ndx + 1) * sizeof (Elf32_Dyn) > data->d_size) - return 0; - dyn32 = &((Elf32_Dyn *) data->d_buf)[ndx]; - dyn32->d_tag = src->d_tag; - dyn32->d_un.d_val = src->d_un.d_val; - return 1; - case ELFCLASS64: - if ((ndx + 1) * sizeof (Elf64_Dyn) > data->d_size) - return 0; - ((GElf_Dyn *) data->d_buf)[ndx] = *src; - return 1; - default: - return 0; - } -} - -GElf_Rel *gelfx_getrel (Elf *elf, Elf_Data *data, int ndx, GElf_Rel *dst) -{ - Elf32_Rel *rel32; - - if (data->d_type != ELF_T_REL) - return NULL; - - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - if ((ndx + 1) * sizeof (Elf32_Rel) > data->d_size) - return NULL; - rel32 = &((Elf32_Rel *) data->d_buf)[ndx]; - dst->r_offset = rel32->r_offset; - dst->r_info = GELF_R_INFO (ELF32_R_SYM (rel32->r_info), - ELF32_R_TYPE (rel32->r_info)); - return dst; - case ELFCLASS64: - if ((ndx + 1) * sizeof (Elf64_Rel) > data->d_size) - return NULL; - *dst = ((GElf_Rel *) data->d_buf)[ndx]; - return dst; - default: - return NULL; - } -} - -int gelfx_update_rel (Elf *elf, Elf_Data *data, int ndx, GElf_Rel *src) -{ - Elf32_Rel *rel32; - - if (data->d_type != ELF_T_REL) - return 0; - - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - if ((ndx + 1) * sizeof (Elf32_Rel) > data->d_size) - return 0; - rel32 = &((Elf32_Rel *) data->d_buf)[ndx]; - rel32->r_offset = src->r_offset; - rel32->r_info = ELF32_R_INFO (GELF_R_SYM (src->r_info), - GELF_R_TYPE (src->r_info)); - return 1; - case ELFCLASS64: - if ((ndx + 1) * sizeof (Elf64_Rel) > data->d_size) - return 0; - ((GElf_Rel *) data->d_buf)[ndx] = *src; - return 1; - default: - return 0; - } -} - -GElf_Rela *gelfx_getrela (Elf *elf, Elf_Data *data, int ndx, GElf_Rela *dst) -{ - Elf32_Rela *rela32; - - if (data->d_type != ELF_T_RELA) - return NULL; - - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - if ((ndx + 1) * sizeof (Elf32_Rela) > data->d_size) - return NULL; - rela32 = &((Elf32_Rela *) data->d_buf)[ndx]; - dst->r_offset = rela32->r_offset; - dst->r_info = GELF_R_INFO (ELF32_R_SYM (rela32->r_info), - ELF32_R_TYPE (rela32->r_info)); - dst->r_addend = rela32->r_addend; - return dst; - case ELFCLASS64: - if ((ndx + 1) * sizeof (Elf64_Rela) > data->d_size) - return NULL; - *dst = ((GElf_Rela *) data->d_buf)[ndx]; - return dst; - default: - return NULL; - } -} - -int gelfx_update_rela (Elf *elf, Elf_Data *data, int ndx, GElf_Rela *src) -{ - Elf32_Rela *rela32; - - if (data->d_type != ELF_T_RELA) - return 0; - - switch (gelf_getclass (elf)) - { - case ELFCLASS32: - if ((ndx + 1) * sizeof (Elf32_Rela) > data->d_size) - return 0; - rela32 = &((Elf32_Rela *) data->d_buf)[ndx]; - rela32->r_offset = src->r_offset; - rela32->r_info = ELF32_R_INFO (GELF_R_SYM (src->r_info), - GELF_R_TYPE (src->r_info)); - rela32->r_addend = src->r_addend; - return 1; - case ELFCLASS64: - if ((ndx + 1) * sizeof (Elf64_Rela) > data->d_size) - return 0; - ((GElf_Rela *) data->d_buf)[ndx] = *src; - return 1; - default: - return 0; - } -} diff --git a/trunk/gelf/gelf.h b/trunk/gelf/gelf.h deleted file mode 100644 index 6b76a15..0000000 --- a/trunk/gelf/gelf.h +++ /dev/null @@ -1,72 +0,0 @@ -/* Generic ELF wrapper for libelf which does not support gelf_ API. - Copyright (C) 2001 Red Hat, Inc. - Written by Jakub Jelinek <jakub@redhat.com>, 2001. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program 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 a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef GELF_H -#define GELF_H - -typedef Elf64_Half GElf_Half; -typedef Elf64_Word GElf_Word; -typedef Elf64_Sword GElf_Sword; -typedef Elf64_Xword GElf_Xword; -typedef Elf64_Sxword GElf_Sxword; -typedef Elf64_Addr GElf_Addr; -typedef Elf64_Off GElf_Off; -typedef Elf64_Ehdr GElf_Ehdr; -typedef Elf64_Shdr GElf_Shdr; -typedef Elf64_Section GElf_Section; -typedef Elf64_Sym GElf_Sym; -typedef Elf64_Rel GElf_Rel; -typedef Elf64_Rela GElf_Rela; -typedef Elf64_Phdr GElf_Phdr; -typedef Elf64_Dyn GElf_Dyn; -#define GELF_ST_BIND ELF64_ST_BIND -#define GELF_ST_TYPE ELF64_ST_TYPE -#define GELF_ST_INFO ELF64_ST_INFO -#define GELF_ST_VISIBILITY ELF64_ST_VISIBILITY -#define GELF_R_SYM ELF64_R_SYM -#define GELF_R_TYPE ELF64_R_TYPE -#define GELF_R_INFO ELF64_R_INFO - -extern int gelf_getclass (Elf *); -extern size_t gelf_fsize (Elf *, Elf_Type, size_t, unsigned); -extern GElf_Ehdr *gelf_getehdr (Elf *, GElf_Ehdr *); -extern int gelf_update_ehdr (Elf *, GElf_Ehdr *); -extern unsigned long gelf_newehdr (Elf *, int); -extern GElf_Phdr *gelf_getphdr (Elf *, int, GElf_Phdr *); -extern int gelf_update_phdr (Elf *, int, GElf_Phdr *); -extern unsigned long gelf_newphdr (Elf *, size_t); -extern Elf_Data *gelf_xlatetom (Elf *, Elf_Data *, const Elf_Data *, unsigned); -extern Elf_Data *gelf_xlatetof (Elf *, Elf_Data *, const Elf_Data *, unsigned); -/* The gelf_ equivalents of these functions only provide Elf_Scn resp. - Elf_Data pointers, without changing the underlying libelf implementation - it is either impossible to get Elf * pointer from that or it requires - internal knowledge about the libelf implementation. */ -extern GElf_Shdr *gelfx_getshdr (Elf *, Elf_Scn *, GElf_Shdr *); -extern int gelfx_update_shdr (Elf *, Elf_Scn *, GElf_Shdr *); -extern GElf_Sym *gelfx_getsym (Elf *, Elf_Data *, int, GElf_Sym *); -extern int gelfx_update_sym (Elf *, Elf_Data *, int, GElf_Sym *); -extern GElf_Dyn *gelfx_getdyn (Elf *, Elf_Data *, int, GElf_Dyn *); -extern int gelfx_update_dyn (Elf *, Elf_Data *, int, GElf_Dyn *); -extern GElf_Rel *gelfx_getrel (Elf *, Elf_Data *, int, GElf_Rel *); -extern GElf_Rela *gelfx_getrela (Elf *, Elf_Data *, int, GElf_Rela *); -extern int gelfx_update_rel (Elf *, Elf_Data *, int, GElf_Rel *); -extern int gelfx_update_rela (Elf *, Elf_Data *, int, GElf_Rela *); - -#define HAVE_GELFX_GETSHDR 1 - -#endif /* GELF_H */ |