[uclibc-ng-devel] [PATCH v2 2/2] ARC: ldso: don't use _DYNAMIC at gotpc construct #2

Vineet Gupta Vineet.Gupta1 at synopsys.com
Fri Jan 13 21:24:53 CET 2017

This removes _DYNAMIC at 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 at 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 at gotpc]			\n"
+	"ld  %1, [pcl, _GLOBAL_OFFSET_TABLE_ at pcl]	\n"

However the runtime address of .dynamic can only be generated with

        "add %0, pcl, _DYNAMIC at 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 at synopsys.com>
 ldso/ldso/arc/dl-startup.h | 2 +-
 ldso/ldso/arc/dl-sysdep.h  | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/ldso/ldso/arc/dl-startup.h b/ldso/ldso/arc/dl-startup.h
index 232ecb975b29..dbce2f0c9a2b 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);						\
diff --git a/ldso/ldso/arc/dl-sysdep.h b/ldso/ldso/arc/dl-sysdep.h
index 2b43efde594b..ed8b37205cc4 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 at gotpc] ;build addr of _DYNAMIC"   "\n"
-        "add %0, pcl, _DYNAMIC at pcl     ;runtime addr of _DYNAMIC" "\n"
+        "ld  %1, [pcl, _dl_start at gotpc] ;build addr of _DYNAMIC"   "\n"
+        "add %0, pcl, _dl_start at pcl     ;runtime addr of _DYNAMIC" "\n"
         "sub %0, %0, %1                ;delta"                    "\n"
         : "=&r" (addr), "=r"(tmp)

More information about the devel mailing list