feat: default to multilib library path

This commit is contained in:
sisungo
2026-02-19 10:17:36 +08:00
parent ef7d225be7
commit 4bf55c3bce
+4 -39
View File
@@ -1122,42 +1122,7 @@ static struct dso *load_library(const char *name, struct dso *needed_by)
fd = path_open(name, p->rpath, buf, sizeof buf);
}
if (fd == -1) {
if (!sys_path) {
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);
fd = open(etc_ldso_path, O_RDONLY|O_CLOEXEC);
if (fd>=0) {
size_t n = 0;
if (!fstat(fd, &st)) n = st.st_size;
if ((sys_path = malloc(n+1)))
sys_path[n] = 0;
if (!sys_path || read_loop(fd, sys_path, n)<0) {
free(sys_path);
sys_path = "";
}
close(fd);
} else if (errno != ENOENT) {
sys_path = "";
}
}
if (!sys_path) sys_path = "/lib:/usr/local/lib:/usr/lib";
if (!sys_path) sys_path = "/lib/" LDSO_ARCH "-semios-linux";
fd = path_open(name, sys_path, buf, sizeof buf);
}
pathname = buf;
@@ -1326,7 +1291,7 @@ static void extend_bfs_deps(struct dso *p)
struct dso *dep = p->deps[i];
for (j=cnt=0; j<dep->ndeps_direct; j++)
if (!dep->deps[j]->mark) cnt++;
tmp = no_realloc ?
tmp = no_realloc ?
malloc(sizeof(*tmp) * (ndeps_all+cnt+1)) :
realloc(p->deps, sizeof(*tmp) * (ndeps_all+cnt+1));
if (!tmp) {
@@ -1587,7 +1552,7 @@ static void do_init_fini(struct dso **queue)
if (p->ctor_visitor || p->constructed)
continue;
p->ctor_visitor = self;
decode_vec(p->dynv, dyn, DYN_CNT);
if (dyn[0] & ((1<<DT_FINI) | (1<<DT_FINI_ARRAY))) {
p->fini_next = fini_head;
@@ -1698,7 +1663,7 @@ static void install_new_tls(void)
* following stage 2 and stage 3 functions via primitive symbolic lookup
* since it does not have access to their addresses to begin with. */
/* Stage 2 of the dynamic linker is called after relative relocations
/* Stage 2 of the dynamic linker is called after relative relocations
* have been processed. It can make function calls to static functions
* and access string literals and static data, but cannot use extern
* symbols. Its job is to perform symbolic relocations on the dynamic