diff options
author | Esteve Varela Colominas <esteve.varela@gmail.com> | 2022-02-12 16:34:33 +0100 |
---|---|---|
committer | Sam James <sam@gentoo.org> | 2022-02-20 00:29:46 +0000 |
commit | b02003640228503cb93d5c371bef1f55c555429f (patch) | |
tree | 60a082d45478e7847fb391ed58327ccaf1ca54fc /sys-libs/musl/files | |
parent | app-emulation/xen: drop vulnerable (diff) | |
download | gentoo-b02003640228503cb93d5c371bef1f55c555429f.tar.gz gentoo-b02003640228503cb93d5c371bef1f55c555429f.tar.bz2 gentoo-b02003640228503cb93d5c371bef1f55c555429f.zip |
sys-libs/musl: Support Gentoo prefix
Added necessary framework to get this libc to run properly under a prefix.
Closes: https://bugs.gentoo.org/833192
Signed-off-by: Esteve Varela Colominas <esteve.varela@gmail.com>
Closes: https://github.com/gentoo/gentoo/pull/24169
Signed-off-by: Sam James <sam@gentoo.org>
Diffstat (limited to 'sys-libs/musl/files')
-rw-r--r-- | sys-libs/musl/files/ldconfig.in-r3 | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/sys-libs/musl/files/ldconfig.in-r3 b/sys-libs/musl/files/ldconfig.in-r3 new file mode 100644 index 000000000000..60f6cc9e1130 --- /dev/null +++ b/sys-libs/musl/files/ldconfig.in-r3 @@ -0,0 +1,160 @@ +#!/bin/bash -e +# Copyright 1999-2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +ROOT="/" +EPREFIX="@GENTOO_PORTAGE_EPREFIX@" +LDSO_CONF_FILE="/etc/ld.so.conf" + +VERBOSE=0 + +UPDATE_LINKS=1 + +get_options() { + LDSO_CONF="" + while getopts "vnNXf:C:r:p" opt "$@"; do + case $opt in + v) + echo "ldconfig for musl in Gentoo" + VERBOSE=1 + ;; + r) + ROOT=${OPTARG} + ;; + f) + LDSO_CONF=${OPTARG} + ;; + X) + UPDATE_LINKS=0 + ;; + \?) + echo "Invalid option: -${opt}" >&2 + exit 1 + ;; + n|N|C|p) + echo "Unimplemented option: -${opt}" >&2 + exit 1 + ;; + esac + done + if [[ -z ${LDSO_CONF} ]]; then + LDSO_CONF=${ROOT}${EPREFIX}${LDSO_CONF_FILE} + fi + + if [[ ${UPDATE_LINKS} == 1 ]]; then + echo "Updating links is not implemented." + fi +} + + +repeated() { + local l=${1} + local drs="${@:2}" + for m in ${drs}; do + [[ ${m} == ${l} ]] && return 0 + done + return 1 +} + +expand() { + # We are assuming the ld.so.conf's 'include' is not recursive + local f line l + local glob="${LDSO_CONF_DIR}/${1}" + local drs="${@:2} " + + for f in ${glob}; do + [[ ! -f ${f} ]] && continue + while read line; do + line=${line%%#*} + line=${line//:/ } + line=${line//,/ } + for l in ${line}; do + # We must add this whether or not the directory exists + repeated ${l} ${drs} && continue + drs+=" ${l} " + done + done < ${f} + done + + echo ${drs} +} + +read_ldso_conf() { + local drs=" " + + while read line; do + # Sanitize the line - see ldconfig(8) for delimiters + # Note: bash read turns tabs into spaces and read already + # delimits on newlines with the default $IFS + line=${line%%#*} # Remove comments + line=${line//:/ } # Change colon delimiter to space + line=${line//,/ } # Change comma delimiter to space + + next=0 + for l in ${line}; do + if [[ ${next} == 1 ]]; then + next=0 + drs=$(expand ${l} ${drs}) + elif [[ ${l} == "include" ]]; then + next=1 + else + # glibc's ldconfig silently skips non directories + if [[ -d ${l} ]]; then + repeated ${l} ${drs} && continue + drs+=" ${l} " + fi + fi + done + done < ${1} + + echo ${drs} +} + +sanitize() { + local drs=$@ + + repeated "${EPREFIX}/lib" ${drs} || drs="${EPREFIX}/lib ${drs}" + repeated "${EPREFIX}/usr/lib" ${drs} || drs="${EPREFIX}/usr/lib ${drs}" + + echo ${drs} +} + +changed() { + [[ -f ${ETC_LDSO_PATH} ]] || return 0 + local current=$(<${ETC_LDSO_PATH}) + current=${current//$'\n'/ } + [[ ${current} != ${drs} ]] || return 1 +} + +get_options "$@" + +if [[ ! -e ${LDSO_CONF} ]]; then + echo "${LDSO_CONF} not found" >&2 + exit 1 +fi + +LDSO_CONF_DIR=$(dirname ${LDSO_CONF}) + +drs=$(read_ldso_conf "${LDSO_CONF}") +drs=$(sanitize ${drs}) + +ARCH=@@ARCH@@ +LDSO_PATH="${ROOT}${EPREFIX}/lib/ld-musl-${ARCH}.so.1" +if [[ ! -e ${LDSO_PATH} ]]; then + echo "${LDSO_PATH} not found" >&2 + exit 1 +fi + +LDSO_ARCH=$(basename ${LDSO_PATH}) +LDSO_NAME=${LDSO_ARCH%.so.1} +ETC_LDSO_PATH="${ROOT}${EPREFIX}/etc/${LDSO_NAME}.path" + +changed || exit 0 +X=$(mktemp -p /tmp ${LDSO_NAME}.XXXXXX) +for d in ${drs}; do + echo ${d} >> ${X} +done +chmod 644 ${X} +# busybox doesn't support mz -Z +cp ${X} ${ETC_LDSO_PATH} +rm ${X} |