diff options
author | Ian Campbell <ian.campbell@xensource.com> | 2006-08-25 10:39:24 +0100 |
---|---|---|
committer | Ian Campbell <ian.campbell@xensource.com> | 2006-08-25 10:39:24 +0100 |
commit | e76cb15dcecf1b78ecb1365ea0f955a97c5d2dd1 (patch) | |
tree | bc04df8b24083ce9832cbf356d73ce1a38b60fb1 /tools/xcutils | |
parent | 3d026bfcca1667e82ab93527ebebaebae937cec5 (diff) | |
download | xen-e76cb15dcecf1b78ecb1365ea0f955a97c5d2dd1.tar.gz xen-e76cb15dcecf1b78ecb1365ea0f955a97c5d2dd1.tar.bz2 xen-e76cb15dcecf1b78ecb1365ea0f955a97c5d2dd1.zip |
[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>
Diffstat (limited to 'tools/xcutils')
-rw-r--r-- | tools/xcutils/readnotes.c | 53 |
1 files changed, 36 insertions, 17 deletions
diff --git a/tools/xcutils/readnotes.c b/tools/xcutils/readnotes.c index fedfa0af27..af4162a558 100644 --- a/tools/xcutils/readnotes.c +++ b/tools/xcutils/readnotes.c @@ -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; |