musl: Create default library search path based on configuration

In absence of /etc/ld-musl-$(ARCH).path file musl uses hardcoded default
search path "/lib:/usr/local/lib:/usr/lib". This works for cases when
system libraries installed in one of these pathes.

However if lib64 or libx32 used as system library directories and no
usr merge functionality enabled for distro musl dynamic loader cannot
find libraries and finally execute binaries.

Found while working on support for musl on powerpc64 builds where
lib64 variant is used regardless of multilib being on or off.

Fix by creating default search path based on configuration time values
for syslibdir and libdir.

(From OE-Core rev: 2da79f021b5525ea5b56a86563905a67fc958fa5)

Signed-off-by: Serhey Popovych <serhe.popovych@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Serhey Popovych
2018-12-14 19:54:35 +02:00
committed by Richard Purdie
parent 2468becd4b
commit 6be12c0622
2 changed files with 62 additions and 0 deletions

View File

@@ -0,0 +1,61 @@
From 5a2886f81dbca3f2ed28eebe7d27d471da278db8 Mon Sep 17 00:00:00 2001
From: Serhey Popovych <serhe.popovych@gmail.com>
Date: Tue, 11 Dec 2018 05:44:20 -0500
Subject: [PATCH] ldso: Use syslibdir and libdir as default pathes to libdirs
In absence of /etc/ld-musl-$(ARCH).path ldso uses default path to search
libraries /lib:/usr/local/lib:/usr/lib.
However this path isn't relevant in case when library is put in dirs
like lib64 or libx32.
Adjust CFLAGS_ALL to pass syslibdir as SYSLIBDIR and libdir as LIBDIR
preprocessor macroses to construct default ldso library search path
in ldso/dynlink.c::SYS_PATH_DFLT.
Upstream-Status: Pending
Signed-off-by: Serhey Popovych <serhe.popovych@gmail.com>
---
Makefile | 3 ++-
ldso/dynlink.c | 4 +++-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/Makefile b/Makefile
index b46f8ca4..c07e4ae8 100644
--- a/Makefile
+++ b/Makefile
@@ -46,7 +46,8 @@ CFLAGS_AUTO = -Os -pipe
CFLAGS_C99FSE = -std=c99 -ffreestanding -nostdinc
CFLAGS_ALL = $(CFLAGS_C99FSE)
-CFLAGS_ALL += -D_XOPEN_SOURCE=700 -I$(srcdir)/arch/$(ARCH) -I$(srcdir)/arch/generic -Iobj/src/internal -I$(srcdir)/src/include -I$(srcdir)/src/internal -Iobj/include -I$(srcdir)/include
+CFLAGS_ALL += -D_XOPEN_SOURCE=700 -DSYSLIBDIR='"$(syslibdir)"' -DLIBDIR='"$(libdir)"'
+CFLAGS_ALL += -I$(srcdir)/arch/$(ARCH) -I$(srcdir)/arch/generic -Iobj/src/internal -I$(srcdir)/src/include -I$(srcdir)/src/internal -Iobj/include -I$(srcdir)/include
CFLAGS_ALL += $(CPPFLAGS) $(CFLAGS_AUTO) $(CFLAGS)
LDFLAGS_ALL = $(LDFLAGS_AUTO) $(LDFLAGS)
diff --git a/ldso/dynlink.c b/ldso/dynlink.c
index ec921dfd..7c119c55 100644
--- a/ldso/dynlink.c
+++ b/ldso/dynlink.c
@@ -22,6 +22,8 @@
#include "dynlink.h"
#include "malloc_impl.h"
+#define SYS_PATH_DFLT SYSLIBDIR ":" LIBDIR
+
static void error(const char *, ...);
#define MAXP2(a,b) (-(-(a)&-(b)))
@@ -1038,7 +1040,7 @@ static struct dso *load_library(const char *name, struct dso *needed_by)
sys_path = "";
}
}
- if (!sys_path) sys_path = "/lib:/usr/local/lib:/usr/lib";
+ if (!sys_path) sys_path = SYS_PATH_DFLT;
fd = path_open(name, sys_path, buf, sizeof buf);
}
pathname = buf;
--
2.7.4

View File

@@ -12,6 +12,7 @@ PV = "1.1.20+git${SRCPV}"
SRC_URI = "git://git.musl-libc.org/musl \
file://0001-Make-dynamic-linker-a-relative-symlink-to-libc.patch \
file://0002-ldso-Use-syslibdir-and-libdir-as-default-pathes-to-l.patch \
"
S = "${WORKDIR}/git"