about summary refs log tree commit diff
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);