diff options
-rw-r--r-- | arch/arm/reloc.h | 15 | ||||
-rw-r--r-- | arch/i386/reloc.h | 2 | ||||
-rw-r--r-- | arch/microblaze/reloc.h | 9 | ||||
-rw-r--r-- | arch/mips/reloc.h | 9 | ||||
-rw-r--r-- | arch/powerpc/reloc.h | 2 | ||||
-rw-r--r-- | arch/x86_64/reloc.h | 2 | ||||
-rw-r--r-- | src/ldso/dynlink.c | 21 |
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); |