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
index 0000000000..8b30862b68
--- /dev/null
+++ b/package/file/file-4.16-fix-array-64bit.patch
@@ -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;