[patch] Arm debug builds
Paul Brook
paul at codesourcery.com
Fri Aug 4 18:47:13 PDT 2006
When building a debug build of ld.so on Arm I'm getting assembly errors
because of out of range offsets in elf_machine_load_address.
The patch below fixes this by using a constant pool instead of and adr
instruction in unoptimized builds. Contrary to what the old comment says I'm
fairly sure this implementation is also safe in Thumb mode, so we can use it
there as well.
Paul
Index: ldso/ldso/arm/dl-sysdep.h
===================================================================
--- ldso/ldso/arm/dl-sysdep.h (revision 15784)
+++ ldso/ldso/arm/dl-sysdep.h (working copy)
@@ -86,24 +86,20 @@ elf_machine_load_address (void)
extern void __dl_start asm ("_dl_start");
Elf32_Addr got_addr = (Elf32_Addr) &__dl_start;
Elf32_Addr pcrel_addr;
-#if !defined __thumb__
+#if defined __OPTIMIZE__ && !defined __thumb__
asm ("adr %0, _dl_start" : "=r" (pcrel_addr));
#else
+ /* A simple adr does not work in Thumb mode because the offset is
+ negative, and for debug builds may be too large. */
int tmp;
- /* The above adr will not work on thumb because it
- * is negative. The only safe way is to temporarily
- * swap to arm.
- */
- asm( ".align 2\n"
- " bx pc\n"
- " nop \n"
- " .arm \n"
- " adr %0, _dl_start\n"
- " .align 2\n"
- " orr %1, pc, #1\n"
- " bx %1\n"
- " .force_thumb\n"
- : "=r" (pcrel_addr), "=&r" (tmp));
+ asm ("adr %1, 1f\n\t"
+ "ldr %0, [%1]\n\t"
+ "add %0, %0, %1\n\t"
+ "b 2f\n\t"
+ ".align 2\n\t"
+ "1: .word _dl_start - 1b\n\t"
+ "2:"
+ : "=r" (pcrel_addr), "=r" (tmp));
#endif
return pcrel_addr - got_addr;
}
More information about the uClibc
mailing list