summaryrefslogtreecommitdiff
path: root/ldso/ldso
diff options
context:
space:
mode:
authorVineet Gupta <Vineet.Gupta1@synopsys.com>2017-01-13 12:24:53 -0800
committerWaldemar Brodkorb <wbx@uclibc-ng.org>2017-01-15 19:21:24 +0100
commit2db45cff132e9b3c84700a4a2401dd8a06c2cf22 (patch)
treeba773dde5bad2615e80088172ad98d65a6466b9b /ldso/ldso
parentd36553c70fd1e64277fdb8c09efd915b706131af (diff)
ARC: ldso: don't use _DYNAMIC@gotpc construct #2
This removes _DYNAMIC@gotpc from elf_machine_load_address() This is a seperate commit to callout the fact that old code was actually broken but was NOT caught since it never gets called (and will never be) since ld.so only calls it if kernel doesn't pass AT_BASE auxvt, which is not true for Linux. if (!auxvt[AT_BASE].a_un.a_val) auxvt[AT_BASE].a_un.a_val = elf_machine_load_address(); So while the intent was to remove _DYNAMIC@gotpc construct, we need to come up with something which works. The build time address computation of .dynamic which works well is: - "ld %1, [pcl, _DYNAMIC@gotpc] \n" + "ld %1, [pcl, _GLOBAL_OFFSET_TABLE_@pcl] \n" However the runtime address of .dynamic can only be generated with "add %0, pcl, _DYNAMIC@pcl \n" which unfortunately is what is currently broken as it is converted to i_GLOBAL_OFFSET_TABLE_t and thus refers to runtime address of .got and not .dyanmic Thus we resort to using an arbit symbol _dl_start at the expense of an extra GOT entry and a bogus R_ARC_NONE relo in ldso itself which now needs to be ignored. Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Diffstat (limited to 'ldso/ldso')
-rw-r--r--ldso/ldso/arc/dl-startup.h2
-rw-r--r--ldso/ldso/arc/dl-sysdep.h4
2 files changed, 3 insertions, 3 deletions
diff --git a/ldso/ldso/arc/dl-startup.h b/ldso/ldso/arc/dl-startup.h
index 232ecb975..dbce2f0c9 100644
--- a/ldso/ldso/arc/dl-startup.h
+++ b/ldso/ldso/arc/dl-startup.h
@@ -74,7 +74,7 @@ do { \
*REL += (unsigned long) LOAD; \
else if (type == R_ARC_JMP_SLOT) \
*REL = SYMBOL; \
- else \
+ else if (type != R_ARC_NONE) \
_dl_exit(1); \
}while(0)
diff --git a/ldso/ldso/arc/dl-sysdep.h b/ldso/ldso/arc/dl-sysdep.h
index 2b43efde5..ed8b37205 100644
--- a/ldso/ldso/arc/dl-sysdep.h
+++ b/ldso/ldso/arc/dl-sysdep.h
@@ -144,8 +144,8 @@ static __always_inline Elf32_Addr elf_machine_load_address(void)
*/
Elf32_Addr addr, tmp;
__asm__ (
- "ld %1, [pcl, _DYNAMIC@gotpc] ;build addr of _DYNAMIC" "\n"
- "add %0, pcl, _DYNAMIC@pcl ;runtime addr of _DYNAMIC" "\n"
+ "ld %1, [pcl, _dl_start@gotpc] ;build addr of _DYNAMIC" "\n"
+ "add %0, pcl, _dl_start@pcl ;runtime addr of _DYNAMIC" "\n"
"sub %0, %0, %1 ;delta" "\n"
: "=&r" (addr), "=r"(tmp)
);