From c7c530cd3e23219a9be10323ba7876f68d54c107 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Thu, 5 Jan 2012 15:39:39 +0100 Subject: 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 ec822001a2f26eef8701194714f6482b6d852de2 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 Signed-off-by: Andrzej Zaborowski --- bsd-user/elfload.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'bsd-user') 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; } -- cgit v1.2.1