diff --git a/tccelf.c b/tccelf.c index f58ae83..946d081 100644 --- a/tccelf.c +++ b/tccelf.c @@ -1323,19 +1323,25 @@ ST_FUNC void tcc_add_linker_symbols(TCCState *s1) } /* name of ELF interpreter */ +#ifdef CONFIG_TCC_MULTIARCH_TRIPLET +#define MULTIARCH_TRIPLET CONFIG_TCC_MULTIARCH_TRIPLET +#else +#define MULTIARCH_TRIPLET "" +#endif #if defined __FreeBSD__ -static const char elf_interp[] = "/libexec/ld-elf.so.1"; +static char elf_interp[] = "/libexec/"MULTIARCH_TRIPLET"/ld-elf.so.1"; #elif defined __FreeBSD_kernel__ -static char elf_interp[] = CONFIG_TCC_LDDIR"/ld.so.1"; +static char elf_interp[] = CONFIG_TCC_LDDIR"/"MULTIARCH_TRIPLET"/ld.so.1"; #elif defined TCC_ARM_EABI -static const char elf_interp[] = CONFIG_TCC_LDDIR"/ld-linux.so.3"; +static char elf_interp[] = CONFIG_TCC_LDDIR"/"MULTIARCH_TRIPLET"/ld-linux.so.3"; #elif defined(TCC_TARGET_X86_64) -static const char elf_interp[] = CONFIG_TCC_LDDIR"/ld-linux-x86-64.so.2"; +static char elf_interp[] = CONFIG_TCC_LDDIR"/"MULTIARCH_TRIPLET"/ld-linux-x86-64.so.2"; #elif defined(TCC_UCLIBC) -static const char elf_interp[] = CONFIG_TCC_LDDIR"/ld-uClibc.so.0"; +static char elf_interp[] = CONFIG_TCC_LDDIR"/"MULTIARCH_TRIPLET"/ld-uClibc.so.0"; #else -static const char elf_interp[] = CONFIG_TCC_LDDIR"/ld-linux.so.2"; +static char elf_interp[] = CONFIG_TCC_LDDIR"/"MULTIARCH_TRIPLET"/ld-linux.so.2"; #endif +#undef MULTIARCH_TRIPLET static void tcc_output_binary(TCCState *s1, FILE *f, const int *section_order) @@ -1478,8 +1484,25 @@ static int elf_output_file(TCCState *s1, const char *filename) char *ptr; /* allow override the dynamic loader */ const char *elfint = getenv("LD_SO"); - if (elfint == NULL) + if (elfint == NULL) { +#ifdef CONFIG_TCC_MULTIARCH_SUBDIR + int ret; + + ret = tcc_open(s1, elf_interp); + if(ret >= 0) + tcc_close(); + else { + char *base, *p; + + base = tcc_basename(elf_interp); + p = base - 1; + while (!IS_DIRSEP(p[-1])) + --p; + pstrcpy(p, strlen(elf_interp), base); + } +#endif elfint = elf_interp; + } /* add interpreter section only if executable */ interp = new_section(s1, ".interp", SHT_PROGBITS, SHF_ALLOC); interp->sh_addralign = 1;