diff options
author | Alexey Kardashevskiy <aik@ozlabs.ru> | 2019-12-31 13:03:44 +1100 |
---|---|---|
committer | Alexey Kardashevskiy <aik@ozlabs.ru> | 2020-02-21 14:03:07 +1100 |
commit | 8dcfb9a87ba18313c02773021c150dc08084710b (patch) | |
tree | a555e25cda6fb69ecf339bc02d5aede2b5fb3f29 /lib | |
parent | efb21312a4a8290f45acd04460f862a88cc9a75a (diff) | |
download | SLOF-8dcfb9a87ba18313c02773021c150dc08084710b.zip SLOF-8dcfb9a87ba18313c02773021c150dc08084710b.tar.gz SLOF-8dcfb9a87ba18313c02773021c150dc08084710b.tar.bz2 |
elf64: Add LE64 ABIv1/2 support for loading images to given address
c2358afb40d4 ("Add support for 64bit LE ABI v1 and v2 support") added
little endian ELF support for one of two ELF loading helpers, this fixes
oversight. With this changes, 'boot disk:2,boot\zImage' is able to handle
little-endian zimages.
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libelf/elf.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/libelf/elf.c b/lib/libelf/elf.c index db2d2ab..5204bc3 100644 --- a/lib/libelf/elf.c +++ b/lib/libelf/elf.c @@ -140,6 +140,7 @@ elf_load_file_to_addr(void *file_addr, void *addr, unsigned long *entry, { int type; long offset; + struct ehdr *ehdr = (struct ehdr *) file_addr; type = elf_check_file(file_addr); @@ -157,6 +158,13 @@ elf_load_file_to_addr(void *file_addr, void *addr, unsigned long *entry, *entry = elf_load_segments64(file_addr, offset, pre_load, post_load) + offset; elf_relocate64(file_addr, offset); + if (ehdr->ei_data != ELFDATA2MSB) { + uint32_t flags = elf_get_eflags_64(file_addr); + if ((flags & 0x3) == 2) + type = 4; /* LE64 ABIv2 */ + else + type = 3; /* LE64 ABIv1 */ + } break; } |