summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm/reloc.h15
-rw-r--r--arch/i386/reloc.h2
-rw-r--r--arch/microblaze/reloc.h9
-rw-r--r--arch/mips/reloc.h9
-rw-r--r--arch/powerpc/reloc.h2
-rw-r--r--arch/x86_64/reloc.h2
-rw-r--r--src/ldso/dynlink.c21
7 files changed, 53 insertions, 7 deletions
diff --git a/arch/arm/reloc.h b/arch/arm/reloc.h
index b41314de..9ca0b48c 100644
--- a/arch/arm/reloc.h
+++ b/arch/arm/reloc.h
@@ -1,7 +1,20 @@
#include <string.h>
#include <elf.h>
+#include <endian.h>
-#define ETC_LDSO_PATH "/etc/ld-musl-arm.path"
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define ENDIAN_SUFFIX "eb"
+#else
+#define ENDIAN_SUFFIX ""
+#endif
+
+#if __SOFTFP__
+#define FP_SUFFIX ""
+#else
+#define FP_SUFFIX "hf"
+#endif
+
+#define LDSO_ARCH "arm" ENDIAN_SUFFIX FP_SUFFIX
#define IS_COPY(x) ((x)==R_ARM_COPY)
#define IS_PLT(x) ((x)==R_ARM_JUMP_SLOT)
diff --git a/arch/i386/reloc.h b/arch/i386/reloc.h
index da0bc05d..3923b54b 100644
--- a/arch/i386/reloc.h
+++ b/arch/i386/reloc.h
@@ -1,7 +1,7 @@
#include <string.h>
#include <elf.h>
-#define ETC_LDSO_PATH "/etc/ld-musl-i386.path"
+#define LDSO_ARCH "i386"
#define IS_COPY(x) ((x)==R_386_COPY)
#define IS_PLT(x) ((x)==R_386_JMP_SLOT)
diff --git a/arch/microblaze/reloc.h b/arch/microblaze/reloc.h
index 81add5e9..60f74225 100644
--- a/arch/microblaze/reloc.h
+++ b/arch/microblaze/reloc.h
@@ -1,7 +1,14 @@
#include <string.h>
#include <elf.h>
+#include <endian.h>
-#define ETC_LDSO_PATH "/etc/ld-musl-microblaze.path"
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define ENDIAN_SUFFIX "el"
+#else
+#define ENDIAN_SUFFIX ""
+#endif
+
+#define LDSO_ARCH "microblaze" ENDIAN_SUFFIX
#define IS_COPY(x) ((x)==R_MICROBLAZE_COPY)
#define IS_PLT(x) ((x)==R_MICROBLAZE_JUMP_SLOT)
diff --git a/arch/mips/reloc.h b/arch/mips/reloc.h
index f5e9c77b..4c035f32 100644
--- a/arch/mips/reloc.h
+++ b/arch/mips/reloc.h
@@ -1,7 +1,14 @@
#include <string.h>
#include <elf.h>
+#include <endian.h>
-#define ETC_LDSO_PATH "/etc/ld-musl-mips.path"
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define ENDIAN_SUFFIX "el"
+#else
+#define ENDIAN_SUFFIX ""
+#endif
+
+#define LDSO_ARCH "mips" ENDIAN_SUFFIX
#define IS_COPY(x) ((x)==R_MIPS_COPY)
#define IS_PLT(x) 1
diff --git a/arch/powerpc/reloc.h b/arch/powerpc/reloc.h
index 113dfa15..80b9ebc9 100644
--- a/arch/powerpc/reloc.h
+++ b/arch/powerpc/reloc.h
@@ -1,7 +1,7 @@
#include <string.h>
#include <elf.h>
-#define ETC_LDSO_PATH "/etc/ld-musl-powerpc.path"
+#define LDSO_ARCH "powerpc" ENDIAN_SUFFIX
#define IS_COPY(x) ((x)==R_PPC_COPY)
#define IS_PLT(x) ((x)==R_PPC_JMP_SLOT)
diff --git a/arch/x86_64/reloc.h b/arch/x86_64/reloc.h
index 38a60735..28cf7cc1 100644
--- a/arch/x86_64/reloc.h
+++ b/arch/x86_64/reloc.h
@@ -2,7 +2,7 @@
#include <string.h>
#include <elf.h>
-#define ETC_LDSO_PATH "/etc/ld-musl-x86_64.path"
+#define LDSO_ARCH "x86_64"
#define IS_COPY(x) ((x)==R_X86_64_COPY)
#define IS_PLT(x) ((x)==R_X86_64_JUMP_SLOT)
diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c
index ff5b738d..1d5e2977 100644
--- a/src/ldso/dynlink.c
+++ b/src/ldso/dynlink.c
@@ -483,7 +483,26 @@ static struct dso *load_library(const char *name)
if (fd < 0 && env_path) fd = path_open(name, env_path, buf, sizeof buf);
if (fd < 0) {
if (!sys_path) {
- FILE *f = fopen(ETC_LDSO_PATH, "rbe");
+ char *prefix = 0;
+ size_t prefix_len;
+ if (ldso->name[0]=='/') {
+ char *s, *t, *z;
+ for (s=t=z=ldso->name; *s; s++)
+ if (*s=='/') z=t, t=s;
+ prefix_len = z-ldso->name;
+ if (prefix_len < PATH_MAX)
+ prefix = ldso->name;
+ }
+ if (!prefix) {
+ prefix = "";
+ prefix_len = 0;
+ }
+ char etc_ldso_path[prefix_len + 1
+ + sizeof "/etc/ld-musl-" LDSO_ARCH ".path"];
+ snprintf(etc_ldso_path, sizeof etc_ldso_path,
+ "%.*s/etc/ld-musl-" LDSO_ARCH ".path",
+ (int)prefix_len, prefix);
+ FILE *f = fopen(etc_ldso_path, "rbe");
if (f) {
if (getdelim(&sys_path, (size_t[1]){0}, 0, f) <= 0) {
free(sys_path);