aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIliyan Malchev <malchev@google.com>2009-09-28 18:21:30 -0700
committerIliyan Malchev <malchev@google.com>2009-09-29 14:33:46 -0700
commit9ea64da6c511e8f9f4edae4c10c20879957631ab (patch)
tree11adf7525e859f87f980f7836936c30570213446
parent6ed80c8814db9eed1fb687be22322e38dc46a2fb (diff)
downloadandroid_bionic-9ea64da6c511e8f9f4edae4c10c20879957631ab.tar.gz
android_bionic-9ea64da6c511e8f9f4edae4c10c20879957631ab.tar.bz2
android_bionic-9ea64da6c511e8f9f4edae4c10c20879957631ab.zip
bionic/linker: change lookup() to return soinfo, not base
-rw-r--r--linker/dlfcn.c12
-rw-r--r--linker/linker.c4
-rw-r--r--linker/linker.h2
3 files changed, 9 insertions, 9 deletions
diff --git a/linker/dlfcn.c b/linker/dlfcn.c
index b54674f2f..053713cef 100644
--- a/linker/dlfcn.c
+++ b/linker/dlfcn.c
@@ -74,7 +74,7 @@ const char *dlerror(void)
void *dlsym(void *handle, const char *symbol)
{
- unsigned base;
+ soinfo *found;
Elf32_Sym *sym;
unsigned bind;
@@ -90,19 +90,19 @@ void *dlsym(void *handle, const char *symbol)
}
if(handle == RTLD_DEFAULT) {
- sym = lookup(symbol, &base);
+ sym = lookup(symbol, &found);
} else if(handle == RTLD_NEXT) {
- sym = lookup(symbol, &base);
+ sym = lookup(symbol, &found);
} else {
- sym = lookup_in_library((soinfo*) handle, symbol);
- base = ((soinfo*) handle)->base;
+ found = (soinfo*)handle;
+ sym = lookup_in_library(found, symbol);
}
if(likely(sym != 0)) {
bind = ELF32_ST_BIND(sym->st_info);
if(likely((bind == STB_GLOBAL) && (sym->st_shndx != 0))) {
- unsigned ret = sym->st_value + base;
+ unsigned ret = sym->st_value + found->base;
pthread_mutex_unlock(&dl_lock);
return (void*)ret;
}
diff --git a/linker/linker.c b/linker/linker.c
index 6f0983783..b260749d0 100644
--- a/linker/linker.c
+++ b/linker/linker.c
@@ -482,7 +482,7 @@ Elf32_Sym *lookup_in_library(soinfo *si, const char *name)
/* This is used by dl_sym(). It performs a global symbol lookup.
*/
-Elf32_Sym *lookup(const char *name, unsigned *base)
+Elf32_Sym *lookup(const char *name, soinfo **found)
{
unsigned elf_hash = 0;
Elf32_Sym *s = NULL;
@@ -494,7 +494,7 @@ Elf32_Sym *lookup(const char *name, unsigned *base)
continue;
s = _do_lookup_in_so(si, name, &elf_hash);
if (s != NULL) {
- *base = si->base;
+ *found = si;
break;
}
}
diff --git a/linker/linker.h b/linker/linker.h
index 69042c05f..d289c81a8 100644
--- a/linker/linker.h
+++ b/linker/linker.h
@@ -203,7 +203,7 @@ extern soinfo libdl_info;
soinfo *find_library(const char *name);
unsigned unload_library(soinfo *si);
Elf32_Sym *lookup_in_library(soinfo *si, const char *name);
-Elf32_Sym *lookup(const char *name, unsigned *base);
+Elf32_Sym *lookup(const char *name, soinfo **found);
const char *linker_get_error(void);
#ifdef ANDROID_ARM_LINKER