summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@google.com>2009-10-13 16:55:18 -0700
committerDavid 'Digit' Turner <digit@google.com>2009-10-13 16:55:18 -0700
commit3c99876116356cae09231189f09e5a679fd0d2fd (patch)
treed02eb77976ec9143a153546f78b0dcac93f036ae
parent9a96aaa8efcde245ac4ba23228b8a8d61e008d91 (diff)
downloadbionic-3c99876116356cae09231189f09e5a679fd0d2fd.zip
bionic-3c99876116356cae09231189f09e5a679fd0d2fd.tar.gz
bionic-3c99876116356cae09231189f09e5a679fd0d2fd.tar.bz2
Allow the dynamic linker to relocate references to thumb symbols in NDK libraries.
The lowest bit of the symbol's value should be ignored when looking at UNDEF symbols for correctness. It is used as an ARM/Thumb flag by the linker.
-rw-r--r--linker/linker.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/linker/linker.c b/linker/linker.c
index 26cd0a8..a6ecd1a 100644
--- a/linker/linker.c
+++ b/linker/linker.c
@@ -1240,9 +1240,13 @@ static int reloc_library(soinfo *si, Elf32_Rel *rel, unsigned count)
return -1;
}
#endif
- if ((s->st_shndx == SHN_UNDEF) && (s->st_value != 0)) {
- DL_ERR("%5d In '%s', shndx=%d && value=0x%08x. We do not "
- "handle this yet", pid, si->name, s->st_shndx,
+ // st_shndx==SHN_UNDEF means an undefined symbol.
+ // st_value should be 0 then, except that the low bit of st_value is
+ // used to indicate whether the symbol points to an ARM or thumb function,
+ // and should be ignored in the following check.
+ if ((s->st_shndx == SHN_UNDEF) && ((s->st_value & ~1) != 0)) {
+ DL_ERR("%5d In '%s', symbol=%s shndx=%d && value=0x%08x. We do not "
+ "handle this yet", pid, si->name, sym_name, s->st_shndx,
s->st_value);
return -1;
}