--- file/src/readelf.h +++ file/src/readelf.h @@ -50,6 +50,7 @@ typedef uint32_t Elf64_Off[2]; typedef uint32_t Elf64_Xword[2]; #else +#undef USE_ARRAY_FOR_64BIT_TYPES typedef uint64_t Elf64_Addr; typedef uint64_t Elf64_Off; typedef uint64_t Elf64_Xword; --- file/src/readelf.c +++ file/src/readelf.c @@ -121,6 +121,14 @@ return value; } +#ifdef USE_ARRAY_FOR_64BIT_TYPES +# define elf_getu64(swap, array) \ + ((swap ? ((uint64_t)getu32(swap, array[0])) << 32 : getu32(swap, array[0])) + \ + (swap ? getu32(swap, array[1]) : ((uint64_t)getu32(swap, array[1]) << 32))) +#else +# define elf_getu64(swap, value) getu64(swap, value) +#endif + #define xsh_addr (class == ELFCLASS32 \ ? (void *) &sh32 \ : (void *) &sh64) @@ -913,11 +921,7 @@ if (getu16(swap, elfhdr.e_type) == ET_CORE) { #ifdef ELFCORE if (dophn_core(ms, class, swap, fd, -#ifdef USE_ARRAY_FOR_64BIT_TYPES - (off_t)getu32(swap, elfhdr.e_phoff[1]), -#else - (off_t)getu64(swap, elfhdr.e_phoff), -#endif + (off_t)elf_getu64(swap, elfhdr.e_phoff), getu16(swap, elfhdr.e_phnum), (size_t)getu16(swap, elfhdr.e_phentsize)) == -1) return -1; @@ -927,22 +931,14 @@ } else { if (getu16(swap, elfhdr.e_type) == ET_EXEC) { if (dophn_exec(ms, class, swap, fd, -#ifdef USE_ARRAY_FOR_64BIT_TYPES - (off_t)getu32(swap, elfhdr.e_phoff[1]), -#else - (off_t)getu64(swap, elfhdr.e_phoff), -#endif + (off_t)elf_getu64(swap, elfhdr.e_phoff), getu16(swap, elfhdr.e_phnum), (size_t)getu16(swap, elfhdr.e_phentsize)) == -1) return -1; } if (doshn(ms, class, swap, fd, -#ifdef USE_ARRAY_FOR_64BIT_TYPES - (off_t)getu32(swap, elfhdr.e_shoff[1]), -#else - (off_t)getu64(swap, elfhdr.e_shoff), -#endif + (off_t)elf_getu64(swap, elfhdr.e_shoff), getu16(swap, elfhdr.e_shnum), (size_t)getu16(swap, elfhdr.e_shentsize)) == -1) return -1;