[TOOLS] Use ELFSIZE to pick the ELF structures to use in readnotes.c

We can remove Elf_Ehdr since it is only used for e_ident which is an
unsigned char array.

Signed-off-by: Ian Campbell <ian.campbell@xensource.com>
This commit is contained in:
Ian Campbell committed 2006-08-25 10:39:24 +01:00
1 parent 3d026bfcca
commit e76cb15dce
1 file changed
+36 -17
+36 -17
View File
@@ -17,18 +17,25 @@
#define ELFNOTE_DESC(_n_) (ELFNOTE_NAME(_n_) + (((_n_)->n_namesz+3)&~3))
#define ELFNOTE_NEXT(_n_) (ELFNOTE_DESC(_n_) + (((_n_)->n_descsz+3)&~3))
#if defined(__i386__)
typedef Elf32_Ehdr Elf_Ehdr;
#ifndef ELFSIZE
#include <limits.h>
#if UINT_MAX == ULONG_MAX
#define ELFSIZE 32
#else
#define ELFSIZE 64
#endif
#endif
#if (ELFSIZE == 32)
typedef Elf32_Nhdr Elf_Nhdr;
typedef Elf32_Half Elf_Half;
typedef Elf32_Word Elf_Word;
#elif defined(__x86_64__)
typedef Elf64_Ehdr Elf_Ehdr;
#elif (ELFSIZE == 64)
typedef Elf64_Nhdr Elf_Nhdr;
typedef Elf64_Half Elf_Half;
typedef Elf64_Word Elf_Word;
#else
#error "Unknown architecture"
#error "Unknown ELFSIZE"
#endif
static void print_string_note(const char *prefix, Elf_Nhdr *note)
@@ -54,18 +61,35 @@ static void print_numeric_note(const char *prefix,Elf_Nhdr *note)
}
}
static inline int is_elf(void *image)
{
/*
* Since we are only accessing the e_ident field we can
* acccess the bytes directly without needing to figure out
* which version of Elf*_Ehdr structure to use.
*/
const unsigned char *hdr = image;
return ( hdr[EI_MAG0] == ELFMAG0 &&
hdr[EI_MAG1] == ELFMAG1 &&
hdr[EI_MAG2] == ELFMAG2 &&
hdr[EI_MAG3] == ELFMAG3 );
}
static inline unsigned char ehdr_class(void *image)
{
Elf_Ehdr *ehdr = image;
switch (ehdr->e_ident[EI_CLASS])
/*
* Since we are only accessing the e_ident field we can
* acccess the bytes directly without needing to figure out
* which version of Elf*_Ehdr structure to use.
*/
const unsigned char *hdr = image;
switch (hdr[EI_CLASS])
{
case ELFCLASS32:
case ELFCLASS64:
return ehdr->e_ident[EI_CLASS];
break;
return hdr[EI_CLASS];
default:
fprintf(stderr, "Unknown ELF class %d\n",
ehdr->e_ident[EI_CLASS]);
fprintf(stderr, "Unknown ELF class %d\n", hdr[EI_CLASS]);
exit(1);
}
}
@@ -198,7 +222,6 @@ int main(int argc, char **argv)
int fd,h;
void *image;
struct stat st;
Elf_Ehdr *ehdr;
Elf_Nhdr *note;
if (argc != 2)
@@ -228,11 +251,7 @@ int main(int argc, char **argv)
return 1;
}
ehdr = image;
if (ehdr->e_ident[EI_MAG0] != ELFMAG0 ||
ehdr->e_ident[EI_MAG1] != ELFMAG1 ||
ehdr->e_ident[EI_MAG2] != ELFMAG2 ||
ehdr->e_ident[EI_MAG3] != ELFMAG3)
if ( !is_elf(image) )
{
fprintf(stderr, "File %s is not an ELF image\n", f);
return 1;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.