summaryrefslogtreecommitdiffstats
path: root/linker/linker.c
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2010-03-22 15:55:09 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2010-03-22 15:55:09 -0700
commit377d4c979dee3dcb5929e8f7a68a53c2407259ab (patch)
tree1783fe0272f1437faabfe8365e615696eb8d374c /linker/linker.c
parent709a898de82128c065381e258e8e71f0a55df976 (diff)
parent1825fb5d5f214849e39d95660795a0d3633f8eeb (diff)
downloadbionic-377d4c979dee3dcb5929e8f7a68a53c2407259ab.zip
bionic-377d4c979dee3dcb5929e8f7a68a53c2407259ab.tar.gz
bionic-377d4c979dee3dcb5929e8f7a68a53c2407259ab.tar.bz2
merge from open-source master
Change-Id: I70266ee8c520b216773f267e46c8273d2334c31d
Diffstat (limited to 'linker/linker.c')
-rw-r--r--linker/linker.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/linker/linker.c b/linker/linker.c
index 7eb1ef9..5cc05e2 100644
--- a/linker/linker.c
+++ b/linker/linker.c
@@ -535,6 +535,40 @@ Elf32_Sym *lookup(const char *name, soinfo **found)
return NULL;
}
+soinfo *find_containing_library(void *addr)
+{
+ soinfo *si;
+
+ for(si = solist; si != NULL; si = si->next)
+ {
+ if((unsigned)addr >= si->base && (unsigned)addr - si->base < si->size) {
+ return si;
+ }
+ }
+
+ return NULL;
+}
+
+Elf32_Sym *find_containing_symbol(void *addr, soinfo *si)
+{
+ unsigned int i;
+ unsigned soaddr = (unsigned)addr - si->base;
+
+ /* Search the library's symbol table for any defined symbol which
+ * contains this address */
+ for(i=0; i<si->nchain; i++) {
+ Elf32_Sym *sym = &si->symtab[i];
+
+ if(sym->st_shndx != SHN_UNDEF &&
+ soaddr >= sym->st_value &&
+ soaddr < sym->st_value + sym->st_size) {
+ return sym;
+ }
+ }
+
+ return NULL;
+}
+
#if 0
static void dump(soinfo *si)
{