[PATCH 2/2] ARC: Add new compiler define to indicate @pcl relocation support

Andrew Burgess andrew.burgess at embecosm.com
Thu Jul 28 18:20:13 UTC 2016


Some old versions of binutils did not support @pcl relocations.  This
commit adds a new flag to the uClibc configuration system that detects
if the toolchain supports @pcl relocations or not.

If this relocation is supported then the define ARC_HAS_AT_PCL_RELOC
will be passed to the compiler, which is then used in the arc ldso to
choose between generating old or new style code.

This commit addresses and issue that was worked around in commit
181d410ad00cddd1d6c9f4835e129136b74c5187 (ARC: Conditionalise certain
relocations as provided by TLS tools only).  In this commit the choice
between old or new style relocations was made based on whether uClibc
was configured with native threads or not.  The problem is that a user
of a new toolchain might choose to configure without native threads.
---
 Rules.mak                  | 2 ++
 ldso/ldso/arc/dl-startup.h | 2 +-
 ldso/ldso/arc/dl-sysdep.h  | 4 ++++
 3 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/Rules.mak b/Rules.mak
index 3c80016..04ff02f 100644
--- a/Rules.mak
+++ b/Rules.mak
@@ -507,9 +507,11 @@ ifeq ($(TARGET_ARCH),c6x)
 endif
 
 ifeq ($(TARGET_ARCH),arc)
+	ARC_HAS_AT_PCL_RELOC:=$(shell echo -e "\t.text\n\tadd r0,pcl,_symbol at pcl" | $(CC) -c -x assembler -o /dev/null -  2> /dev/null && echo -n y || echo -n n)
 	CPU_CFLAGS-y += -mlock -mswape
 	CPU_CFLAGS-$(CONFIG_ARC_CPU_700) += -mA7
 	CPU_CFLAGS-$(CONFIG_ARC_CPU_HS) += -mcpu=archs
+	CPU_CFLAGS-$(ARC_HAS_AT_PCL_RELOC) += -DARC_HAS_AT_PCL_RELOC
 	CPU_LDFLAGS-y += $(CPU_CFLAGS) -marclinux
 endif
 
diff --git a/ldso/ldso/arc/dl-startup.h b/ldso/ldso/arc/dl-startup.h
index ef89b53..80ffd79 100644
--- a/ldso/ldso/arc/dl-startup.h
+++ b/ldso/ldso/arc/dl-startup.h
@@ -34,7 +34,7 @@ __asm__(
     "   ; skip the extra args calc by dl_start()                \n"
     "   ld_s    r1, [sp]       ; orig argc from aux-vec Tbl     \n"
 
-#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+#ifdef ARC_HAS_AT_PCL_RELOC
     "   ld      r12, [pcl, _dl_skip_args at pcl]                   \n"
 
     "   add     r2, pcl, _dl_fini at pcl       ; finalizer         \n"
diff --git a/ldso/ldso/arc/dl-sysdep.h b/ldso/ldso/arc/dl-sysdep.h
index caece99..27463f0 100644
--- a/ldso/ldso/arc/dl-sysdep.h
+++ b/ldso/ldso/arc/dl-sysdep.h
@@ -154,7 +154,11 @@ static __always_inline Elf32_Addr elf_machine_load_address(void)
 	Elf32_Addr addr, tmp;
 	__asm__ (
         "ld  %1, [pcl, _dl_start at gotpc] ;build addr of _dl_start   \n"
+#ifdef ARC_HAS_AT_PCL_RELOC
+        "add %0, pcl, _dl_start at pcl     ;runtime addr of _dl_start \n"
+#else
         "add %0, pcl, _dl_start-.+(.&2) ;runtime addr of _dl_start \n"
+#endif /* ARC_HAS_AT_PCL_RELOC */
         "sub %0, %0, %1                 ;delta                     \n"
          : "=&r" (addr), "=r"(tmp)
      );
-- 
2.5.1



More information about the uClibc mailing list