summaryrefslogtreecommitdiff
path: root/utils/readelf.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/readelf.c')
-rw-r--r--utils/readelf.c33
1 files changed, 15 insertions, 18 deletions
diff --git a/utils/readelf.c b/utils/readelf.c
index 2af4b5ca9..60f14a6bf 100644
--- a/utils/readelf.c
+++ b/utils/readelf.c
@@ -93,36 +93,33 @@ static void * elf_find_dynamic( int64_t const key, ElfW(Dyn) *dynp,
static int check_elf_header(ElfW(Ehdr) *const ehdr)
{
- if (! ehdr || strncmp((void *)ehdr, ELFMAG, SELFMAG) != 0 ||
- (ehdr->e_ident[EI_CLASS] != ELFCLASS32 &&
- ehdr->e_ident[EI_CLASS] != ELFCLASS64) ||
- ehdr->e_ident[EI_VERSION] != EV_CURRENT)
- {
+ if (!ehdr || *(uint32_t*)ehdr != ELFMAG_U32
+ || (ehdr->e_ident[EI_CLASS] != ELFCLASS32
+ && ehdr->e_ident[EI_CLASS] != ELFCLASS64)
+ || ehdr->e_ident[EI_VERSION] != EV_CURRENT
+ ) {
return 1;
}
/* Check if the target endianness matches the host's endianness */
byteswap = 0;
#if __BYTE_ORDER == __LITTLE_ENDIAN
- if (ehdr->e_ident[5] == ELFDATA2MSB) {
- /* Ick -- we will have to byte-swap everything */
+ if (ehdr->e_ident[5] == ELFDATA2MSB)
byteswap = 1;
- }
#elif __BYTE_ORDER == __BIG_ENDIAN
- if (ehdr->e_ident[5] == ELFDATA2LSB) {
+ if (ehdr->e_ident[5] == ELFDATA2LSB)
byteswap = 1;
- }
#else
#error Unknown host byte order!
#endif
- /* Be vary lazy, and only byteswap the stuff we use */
- if (byteswap==1) {
- ehdr->e_type=bswap_16(ehdr->e_type);
- ehdr->e_machine=bswap_16(ehdr->e_machine);
- ehdr->e_phoff=byteswap_to_host(ehdr->e_phoff);
- ehdr->e_shoff=byteswap_to_host(ehdr->e_shoff);
- ehdr->e_phnum=bswap_16(ehdr->e_phnum);
- ehdr->e_shnum=bswap_16(ehdr->e_shnum);
+ /* Be very lazy, and only byteswap the stuff we use */
+ if (byteswap) {
+ ehdr->e_type = bswap_16(ehdr->e_type);
+ ehdr->e_machine = bswap_16(ehdr->e_machine);
+ ehdr->e_phoff = byteswap_to_host(ehdr->e_phoff);
+ ehdr->e_shoff = byteswap_to_host(ehdr->e_shoff);
+ ehdr->e_phnum = bswap_16(ehdr->e_phnum);
+ ehdr->e_shnum = bswap_16(ehdr->e_shnum);
}
return 0;
}