fix cross-compiling for 64bit hosts
authorMike Frysinger <vapier@gentoo.org>
Sat, 25 Feb 2006 06:48:26 +0000 (06:48 -0000)
committerMike Frysinger <vapier@gentoo.org>
Sat, 25 Feb 2006 06:48:26 +0000 (06:48 -0000)
package/file/file-4.16-fix-array-64bit.patch [new file with mode: 0644]

diff --git a/package/file/file-4.16-fix-array-64bit.patch b/package/file/file-4.16-fix-array-64bit.patch
new file mode 100644 (file)
index 0000000..8b30862
--- /dev/null
@@ -0,0 +1,65 @@
+--- 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;