diff options
-rw-r--r-- | bsd-user/elfload.c | 11 | ||||
-rw-r--r-- | hw/elf_ops.h | 12 | ||||
-rw-r--r-- | linux-user/elfload.c | 11 |
3 files changed, 13 insertions, 21 deletions
diff --git a/bsd-user/elfload.c b/bsd-user/elfload.c index 12888840a4..55b213609e 100644 --- a/bsd-user/elfload.c +++ b/bsd-user/elfload.c @@ -993,12 +993,12 @@ static abi_ulong load_elf_interp(struct elfhdr * interp_elf_ex, static int symfind(const void *s0, const void *s1) { - struct elf_sym *key = (struct elf_sym *)s0; + target_ulong addr = *(target_ulong *)s0; struct elf_sym *sym = (struct elf_sym *)s1; int result = 0; - if (key->st_value < sym->st_value) { + if (addr < sym->st_value) { result = -1; - } else if (key->st_value > sym->st_value + sym->st_size) { + } else if (addr >= sym->st_value + sym->st_size) { result = 1; } return result; @@ -1013,12 +1013,9 @@ static const char *lookup_symbolxx(struct syminfo *s, target_ulong orig_addr) #endif // binary search - struct elf_sym key; struct elf_sym *sym; - key.st_value = orig_addr; - - sym = bsearch(&key, syms, s->disas_num_syms, sizeof(*syms), symfind); + sym = bsearch(&orig_addr, syms, s->disas_num_syms, sizeof(*syms), symfind); if (sym != NULL) { return s->disas_strtab + sym->st_name; } diff --git a/hw/elf_ops.h b/hw/elf_ops.h index 6af357fc13..fa65ce2f93 100644 --- a/hw/elf_ops.h +++ b/hw/elf_ops.h @@ -62,12 +62,12 @@ static struct elf_shdr *glue(find_section, SZ)(struct elf_shdr *shdr_table, static int glue(symfind, SZ)(const void *s0, const void *s1) { - struct elf_sym *key = (struct elf_sym *)s0; + target_phys_addr_t addr = *(target_phys_addr_t *)s0; struct elf_sym *sym = (struct elf_sym *)s1; int result = 0; - if (key->st_value < sym->st_value) { + if (addr < sym->st_value) { result = -1; - } else if (key->st_value >= sym->st_value + sym->st_size) { + } else if (addr >= sym->st_value + sym->st_size) { result = 1; } return result; @@ -77,12 +77,10 @@ static const char *glue(lookup_symbol, SZ)(struct syminfo *s, target_phys_addr_t orig_addr) { struct elf_sym *syms = glue(s->disas_symtab.elf, SZ); - struct elf_sym key; struct elf_sym *sym; - key.st_value = orig_addr; - - sym = bsearch(&key, syms, s->disas_num_syms, sizeof(*syms), glue(symfind, SZ)); + sym = bsearch(&orig_addr, syms, s->disas_num_syms, sizeof(*syms), + glue(symfind, SZ)); if (sym != NULL) { return s->disas_strtab + sym->st_name; } diff --git a/linux-user/elfload.c b/linux-user/elfload.c index ea61d0d169..845be8be3b 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -1683,12 +1683,12 @@ static void load_elf_interp(const char *filename, struct image_info *info, static int symfind(const void *s0, const void *s1) { - struct elf_sym *key = (struct elf_sym *)s0; + target_ulong addr = *(target_ulong *)s0; struct elf_sym *sym = (struct elf_sym *)s1; int result = 0; - if (key->st_value < sym->st_value) { + if (addr < sym->st_value) { result = -1; - } else if (key->st_value >= sym->st_value + sym->st_size) { + } else if (addr >= sym->st_value + sym->st_size) { result = 1; } return result; @@ -1703,12 +1703,9 @@ static const char *lookup_symbolxx(struct syminfo *s, target_ulong orig_addr) #endif // binary search - struct elf_sym key; struct elf_sym *sym; - key.st_value = orig_addr; - - sym = bsearch(&key, syms, s->disas_num_syms, sizeof(*syms), symfind); + sym = bsearch(&orig_addr, syms, s->disas_num_syms, sizeof(*syms), symfind); if (sym != NULL) { return s->disas_strtab + sym->st_name; } |