summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/reloc.h1
-rw-r--r--arch/powerpc64/reloc.h1
-rw-r--r--ldso/dynlink.c3
-rw-r--r--src/internal/dynlink.h1
4 files changed, 6 insertions, 0 deletions
diff --git a/arch/powerpc/reloc.h b/arch/powerpc/reloc.h
index 1b4cab36..527b6b7c 100644
--- a/arch/powerpc/reloc.h
+++ b/arch/powerpc/reloc.h
@@ -9,6 +9,7 @@
#define TPOFF_K (-0x7000)
#define REL_SYMBOLIC R_PPC_ADDR32
+#define REL_USYMBOLIC R_PPC_UADDR32
#define REL_GOT R_PPC_GLOB_DAT
#define REL_PLT R_PPC_JMP_SLOT
#define REL_RELATIVE R_PPC_RELATIVE
diff --git a/arch/powerpc64/reloc.h b/arch/powerpc64/reloc.h
index faf70acd..5bdaeede 100644
--- a/arch/powerpc64/reloc.h
+++ b/arch/powerpc64/reloc.h
@@ -11,6 +11,7 @@
#define TPOFF_K (-0x7000)
#define REL_SYMBOLIC R_PPC64_ADDR64
+#define REL_USYMBOLIC R_PPC64_UADDR64
#define REL_GOT R_PPC64_GLOB_DAT
#define REL_PLT R_PPC64_JMP_SLOT
#define REL_RELATIVE R_PPC64_RELATIVE
diff --git a/ldso/dynlink.c b/ldso/dynlink.c
index 531811cc..edd91acd 100644
--- a/ldso/dynlink.c
+++ b/ldso/dynlink.c
@@ -407,6 +407,9 @@ static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stri
case REL_PLT:
*reloc_addr = sym_val + addend;
break;
+ case REL_USYMBOLIC:
+ memcpy(reloc_addr, &(size_t){sym_val + addend}, sizeof(size_t));
+ break;
case REL_RELATIVE:
*reloc_addr = (size_t)base + addend;
break;
diff --git a/src/internal/dynlink.h b/src/internal/dynlink.h
index 165bbedb..ffd06b04 100644
--- a/src/internal/dynlink.h
+++ b/src/internal/dynlink.h
@@ -28,6 +28,7 @@ typedef Elf64_Sym Sym;
enum {
REL_NONE = 0,
REL_SYMBOLIC = -100,
+ REL_USYMBOLIC,
REL_GOT,
REL_PLT,
REL_RELATIVE,