summaryrefslogtreecommitdiffstats
path: root/libexec/rtld-elf/arm
diff options
context:
space:
mode:
authorcognet <cognet@FreeBSD.org>2004-09-23 23:04:52 +0000
committercognet <cognet@FreeBSD.org>2004-09-23 23:04:52 +0000
commitf73db50f5608c2299cd1de41c11ee897c5830b4a (patch)
tree76e4790565e577f0df56eda8305cf45aaa459d5b /libexec/rtld-elf/arm
parentcb15a39d90a43a058228168dfdec8b01c0e46543 (diff)
downloadFreeBSD-src-f73db50f5608c2299cd1de41c11ee897c5830b4a.zip
FreeBSD-src-f73db50f5608c2299cd1de41c11ee897c5830b4a.tar.gz
Add stubs for TLS.
Arbitraly choose the 2nd variant until I figure out which one I should use.
Diffstat (limited to 'libexec/rtld-elf/arm')
-rw-r--r--libexec/rtld-elf/arm/reloc.c13
-rw-r--r--libexec/rtld-elf/arm/rtld_machdep.h23
-rw-r--r--libexec/rtld-elf/arm/rtld_start.S9
3 files changed, 30 insertions, 15 deletions
diff --git a/libexec/rtld-elf/arm/reloc.c b/libexec/rtld-elf/arm/reloc.c
index e4157b6..6dd8ad0 100644
--- a/libexec/rtld-elf/arm/reloc.c
+++ b/libexec/rtld-elf/arm/reloc.c
@@ -90,13 +90,11 @@ _rtld_relocate_nonplt_self(Elf_Dyn *dynp, Elf_Addr relocbase)
}
rellim = (const Elf_Rel *)((caddr_t)rel + relsz);
size = (rellim - 1)->r_offset - rel->r_offset;
- mprotect((void*)relocbase, size, PROT_READ|PROT_WRITE|PROT_EXEC);
for (; rel < rellim; rel++) {
where = (Elf_Addr *)(relocbase + rel->r_offset);
*where += (Elf_Addr)relocbase;
}
- mprotect((void*)relocbase, size, PROT_READ|PROT_EXEC);
}
/*
* It is possible for the compiler to emit relocations for unaligned data.
@@ -339,3 +337,14 @@ reloc_jmpslot(Elf_Addr *where, Elf_Addr target, const Obj_Entry *defobj,
return target;
}
+void
+allocate_initial_tls(Obj_Entry *objs)
+{
+
+}
+
+void *
+__tls_get_addr(tls_index* ti)
+{
+ return (NULL);
+}
diff --git a/libexec/rtld-elf/arm/rtld_machdep.h b/libexec/rtld-elf/arm/rtld_machdep.h
index 02849a9..8e841e0 100644
--- a/libexec/rtld-elf/arm/rtld_machdep.h
+++ b/libexec/rtld-elf/arm/rtld_machdep.h
@@ -37,14 +37,8 @@
struct Struct_Obj_Entry;
/* Return the address of the .dynamic section in the dynamic linker. */
-#if 0
-#define rtld_dynamic(obj) \
- ((const Elf_Dyn *)((obj)->relocbase + (Elf_Addr)&_DYNAMIC))
-#endif
-#if 0
#define rtld_dynamic(obj) (&_DYNAMIC)
-#endif
-#define rtld_dynamic(obj) (const Elf_Dyn *)((obj)->relocbase)
+
Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
const struct Struct_Obj_Entry *defobj,
const struct Struct_Obj_Entry *obj,
@@ -55,10 +49,25 @@ Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
#define call_initfini_pointer(obj, target) \
(((InitFunc)(target))())
+
+typedef struct {
+ unsigned long ti_module;
+ unsigned long ti_offset;
+} tls_index;
+#define round(size, align) \
+ (((size) + (align) - 1) & ~((align) - 1))
+#define calculate_first_tls_offset(size, align) \
+ round(size, align)
+#define calculate_tls_offset(prev_offset, prev_size, size, align) \
+ round(prev_offset + prev_size, align)
+#define calculate_tls_end(off, size) ((off) + (size))
+
+
/*
* Lazy binding entry point, called via PLT.
*/
void _rtld_bind_start(void);
+extern void *__tls_get_addr(tls_index *ti);
#endif
diff --git a/libexec/rtld-elf/arm/rtld_start.S b/libexec/rtld-elf/arm/rtld_start.S
index 5b0619b..1789791 100644
--- a/libexec/rtld-elf/arm/rtld_start.S
+++ b/libexec/rtld-elf/arm/rtld_start.S
@@ -60,17 +60,14 @@ __FBSDID("$FreeBSD$");
bl _rtld_relocate_nonplt_self
mov r1, sp
add r2, sp, #4
- mov r0, r6 /* sp */
+ mov r0, r6 /* sp */
bl _rtld /* call the shared loader */
mov r3, r0 /* save entry point */
- ldr r1, [sp, #0] /* r2 = cleanup */
- ldr r0, [sp, #4] /* r1 = obj_main */
+ ldr r2, [sp, #0] /* r2 = cleanup */
+ ldr r1, [sp, #4] /* r1 = obj_main */
add sp, sp, #8 /* restore stack */
- #if 0
mov r0, r4 /* restore ps_strings */
- #endif
- mov r2, #0
mov pc, r3 /* jump to the entry point */
.L2:
.word _GLOBAL_OFFSET_TABLE_ - (.L1+8)
OpenPOWER on IntegriCloud