summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux
diff options
context:
space:
mode:
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2008-11-25 12:26:42 +0000
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2008-11-25 12:26:42 +0000
commite737aa03ea2db5e29fab981737a93e2ba65b5766 (patch)
tree527e000db30f8be43a4681cf5c59f9658fe97eb9 /libc/sysdeps/linux
parent97807b8291e7e5f35a12ab0307d8e56377eb24f4 (diff)
- Fix thumb2 PIE (Joseph S. Myers)
This patch fixes position-independent executables (PIEs) for Thumb-2. In Thumb assembly, instructions reading pc give a value 4 greater than the address of the instruction, rather than 8 greater as in ARM mode, so the offset to the GOT needs to have the right offset. (The Thumb-1 code already gets this right; it's the code shared by ARM and Thumb-2 that needs fixing.)
Diffstat (limited to 'libc/sysdeps/linux')
-rw-r--r--libc/sysdeps/linux/arm/crt1.S4
1 files changed, 4 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/arm/crt1.S b/libc/sysdeps/linux/arm/crt1.S
index 082348e39..18e3686fa 100644
--- a/libc/sysdeps/linux/arm/crt1.S
+++ b/libc/sysdeps/linux/arm/crt1.S
@@ -238,7 +238,11 @@ _start:
#ifdef __PIC__
.L_GOT:
+#ifdef __thumb__
+ .word _GLOBAL_OFFSET_TABLE_-(.L_GOT_OFF+4)
+#else /* __thumb2__ */
.word _GLOBAL_OFFSET_TABLE_-(.L_GOT_OFF+8)
+#endif
.word _fini(GOT)
.word _init(GOT)
.word main(GOT)