diff --git a/musl_template.gni b/musl_template.gni index f70ff54ad0fb132c03d8a6c3ad396c567633cb89..6d7d76e0697ab0fdf80318989ed3cbb34f310eb8 100755 --- a/musl_template.gni +++ b/musl_template.gni @@ -497,7 +497,12 @@ template("musl_libs") { # _libc_shared_outputs = get_target_outputs(":${abi_prefix}_libc_musl_shared") _libc_shared_so = "${target_out_dir}/${_libs_out_dir}/libc.so" sources = [ _libc_shared_so ] - _muls_linker_so = "${root_out_dir}/common/common/libc/${_libs_path_prefix}/ld-musl-${musl_arch}${musl_subarch}.so.1" + if (is_asan) { + asan = "-asan" + } else { + asan = "" + } + _muls_linker_so = "${root_out_dir}/common/common/libc/${_libs_path_prefix}/ld-musl-${musl_arch}${musl_subarch}${asan}.so.1" outputs = [ _muls_linker_so ] } } diff --git a/porting/linux/user/ldso/dynlink.c b/porting/linux/user/ldso/dynlink.c index 58a0c1cb7330474895dd026a8708d9ed64e8faf6..1219ee601a3e5d130862ac19a7681c261360f44e 100644 --- a/porting/linux/user/ldso/dynlink.c +++ b/porting/linux/user/ldso/dynlink.c @@ -1055,11 +1055,13 @@ static struct dso *load_library(const char *name, struct dso *needed_by) if (!sys_path) { char *prefix = 0; size_t prefix_len; + char *filename = ldso.name; 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; + filename = t+1; if (prefix_len < PATH_MAX) prefix = ldso.name; } @@ -1067,11 +1069,12 @@ static struct dso *load_library(const char *name, struct dso *needed_by) prefix = ""; prefix_len = 0; } + size_t name_len = strchrnul(filename, '.') - filename; char etc_ldso_path[prefix_len + 1 - + sizeof "/etc/ld-musl-" LDSO_ARCH ".path"]; + + sizeof "/etc/.path" + name_len]; snprintf(etc_ldso_path, sizeof etc_ldso_path, - "%.*s/etc/ld-musl-" LDSO_ARCH ".path", - (int)prefix_len, prefix); + "%.*s/etc/%.*s.path", + (int)prefix_len, prefix, (int)name_len, filename); FILE *f = fopen(etc_ldso_path, "rbe"); if (f) { if (getdelim(&sys_path, (size_t[1]){0}, 0, f) <= 0) {