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);  | 
