mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
elf-loader: add more return codes
The existing load_elf() just returns -1 if it fails to load ELF. However it could be smarter than this and tell more about the failure such as wrong endianness or incompatible platform. This adds additional return codes for wrong architecture, wrong endianness and if the image is not ELF at all. This adds a load_elf_strerror() helper to convert return codes into string messages. This fixes handling of what load_elf() returns for s390x, other callers just check the return value for <0 and this remains unchanged. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
6a2331d12e
commit
18674b2678
4 changed files with 46 additions and 13 deletions
|
@ -201,6 +201,7 @@ static int glue(load_elf, SZ)(const char *name, int fd,
|
|||
uint64_t addr, low = (uint64_t)-1, high = 0;
|
||||
uint8_t *data = NULL;
|
||||
char label[128];
|
||||
int ret = ELF_LOAD_FAILED;
|
||||
|
||||
if (read(fd, &ehdr, sizeof(ehdr)) != sizeof(ehdr))
|
||||
goto fail;
|
||||
|
@ -211,22 +212,30 @@ static int glue(load_elf, SZ)(const char *name, int fd,
|
|||
switch (elf_machine) {
|
||||
case EM_PPC64:
|
||||
if (EM_PPC64 != ehdr.e_machine)
|
||||
if (EM_PPC != ehdr.e_machine)
|
||||
if (EM_PPC != ehdr.e_machine) {
|
||||
ret = ELF_LOAD_WRONG_ARCH;
|
||||
goto fail;
|
||||
}
|
||||
break;
|
||||
case EM_X86_64:
|
||||
if (EM_X86_64 != ehdr.e_machine)
|
||||
if (EM_386 != ehdr.e_machine)
|
||||
if (EM_386 != ehdr.e_machine) {
|
||||
ret = ELF_LOAD_WRONG_ARCH;
|
||||
goto fail;
|
||||
}
|
||||
break;
|
||||
case EM_MICROBLAZE:
|
||||
if (EM_MICROBLAZE != ehdr.e_machine)
|
||||
if (EM_MICROBLAZE_OLD != ehdr.e_machine)
|
||||
if (EM_MICROBLAZE_OLD != ehdr.e_machine) {
|
||||
ret = ELF_LOAD_WRONG_ARCH;
|
||||
goto fail;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (elf_machine != ehdr.e_machine)
|
||||
if (elf_machine != ehdr.e_machine) {
|
||||
ret = ELF_LOAD_WRONG_ARCH;
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
if (pentry)
|
||||
|
@ -305,5 +314,5 @@ static int glue(load_elf, SZ)(const char *name, int fd,
|
|||
fail:
|
||||
g_free(data);
|
||||
g_free(phdr);
|
||||
return -1;
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue