Fix __gnu_Unwind_Find_exidx for static executables.
__exidx_start and __exidx_end are not actual values to be read, just
symbols placed before and after .ARM.exidx.
The default linker script for ARM static executables includes these
lines:
__exidx_start = .;
.ARM.exidx : { *(.ARM.exidx*) }
__exidx_end = .;
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0474c/BABEHEDA.html
Test: used __gnu_Unwind_Find_exidx in a static executable and showed
non-bogus values
Test: verified that this fixes #593 in the NDK
Bug: https://github.com/android-ndk/ndk/issues/593
Change-Id: Ib35a4b6c82920666ae8a45aa0a2d43e458699b51
diff --git a/libc/arch-arm/bionic/exidx_static.c b/libc/arch-arm/bionic/exidx_static.c
index 72c0a5b..1686d6a 100644
--- a/libc/arch-arm/bionic/exidx_static.c
+++ b/libc/arch-arm/bionic/exidx_static.c
@@ -30,7 +30,7 @@
/* Find the .ARM.exidx section (which in the case of a static executable
* can be identified through its start and end symbols), and return its
- * beginning and numbe of entries to the caller. Note that for static
+ * beginning and number of entries to the caller. Note that for static
* executables we do not need to use the value of the PC to find the
* EXIDX section.
*/
@@ -38,9 +38,7 @@
extern unsigned __exidx_end;
extern unsigned __exidx_start;
-_Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr pc __attribute__((unused)),
- int *pcount)
-{
- *pcount = (__exidx_end-__exidx_start)/8;
- return (_Unwind_Ptr)__exidx_start;
+_Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr pc __attribute__((unused)), int* pcount) {
+ *pcount = (&__exidx_end - &__exidx_start) / 8;
+ return (_Unwind_Ptr)&__exidx_start;
}