mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 07:13:54 -06:00
elf: Improve symbol lookup (optimize, fix for bsd-user)
Coverity complained about local variable key which was only partially
initiated. Only key.st_value was set. As this was also the only part
of key which was used in function symfind, the code could be optimized
by directly passing a pointer to orig_addr.
In bsd-user/elfload.c, fix ec822001a2
was missing. This was a simple replacement of > by >= in symfind, so
I fixed it here without creating an additional patch.
Signed-off-by: Stefan Weil <sw@weilnetz.de>
Signed-off-by: Andrzej Zaborowski <andrew.zaborowski@intel.com>
This commit is contained in:
parent
563c2bf35c
commit
c7c530cd3e
3 changed files with 13 additions and 21 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue