ldconfig-native: fix a endian-ness bug

Some header fields of ELF were read with wrong size on 64bit
big-endian machine, fix it by reading the fields with read64
instead of read32.

(From OE-Core rev: adbf0b1fdf897076e5e3dec2443c8927f315c2e6)

Signed-off-by: Par Olsson <Par.Olsson@windriver.com>
Signed-off-by: Shan Hai <shan.hai@windriver.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Shan Hai
2014-10-24 14:05:36 +08:00
committed by Richard Purdie
parent a60af9ac74
commit 160b53b701
2 changed files with 48 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
Upstream-Status: Inappropriate [embedded specific]
Fix problem during parsing of ELF headers for 64bit on big-endian.
Some header fields were read with wrong size.
2014/10/24
Par Olsson <Par.Olsson@windriver.com>
Shan Hai <shan.hai@windriver.com>
diff --git a/readelflib.c b/readelflib.c
index 3f5b25b..0bf0de3 100644
--- a/readelflib.c
+++ b/readelflib.c
@@ -261,8 +261,8 @@ process_elf_file64 (const char *file_name, const char *lib, int *flag,
int i;
unsigned int j;
Elf64_Addr loadaddr;
- unsigned int dynamic_addr;
- size_t dynamic_size;
+ Elf64_Addr dynamic_addr;
+ Elf64_Xword dynamic_size;
char *program_interpreter;
Elf64_Ehdr *elf_header;
@@ -311,7 +311,7 @@ process_elf_file64 (const char *file_name, const char *lib, int *flag,
error (0, 0, _("more than one dynamic segment\n"));
dynamic_addr = read64(segment->p_offset, be);
- dynamic_size = read32(segment->p_filesz, be);
+ dynamic_size = read64(segment->p_filesz, be);
break;
case PT_INTERP:
@@ -329,11 +329,11 @@ process_elf_file64 (const char *file_name, const char *lib, int *flag,
break;
case PT_NOTE:
- if (!*osversion && read32(segment->p_filesz, be) >= 32 && read32(segment->p_align, be) >= 4)
+ if (!*osversion && read64(segment->p_filesz, be) >= 32 && read64(segment->p_align, be) >= 4)
{
Elf64_Word *abi_note = (Elf64_Word *) (file_contents
+ read64(segment->p_offset, be));
- Elf64_Addr size = read32(segment->p_filesz, be);
+ Elf64_Xword size = read64(segment->p_filesz, be);
while (read32(abi_note [0], be) != 4 || read32(abi_note [1], be) != 16
|| read32(abi_note [2], be) != 1

View File

@@ -12,6 +12,7 @@ SRC_URI = "file://ldconfig-native-2.12.1.tar.bz2 \
file://flag_fix.patch \
file://endianess-header.patch \
file://ldconfig-default-to-all-multilib-dirs.patch \
file://endian-ness_handling_fix.patch \
"
PR = "r2"