# Check for issues with installed libraries

scanelf_lib_check() {
	local t v
	for t in NM:nm ; do
		v=${t%:*} # NM
		t=${t#*:} # nm
		eval ${v}=\"${!v:-${CHOST}-${t}}\"
		type -P -- ${!v} >/dev/null || eval ${v}=${t}
	done

	local f x i j library libraries

	# Check for shared libraries lacking SONAMEs
	local qa_var="QA_SONAME_${ARCH/-/_}"
	eval "[[ -n \${!qa_var} ]] && QA_SONAME=(\"\${${qa_var}[@]}\")"
	f=$(scanelf -ByF '%S %p' "${ED%/}"/{,usr/}lib*/lib*.so* | awk '$2 == "" { print }' | sed -e "s:^[[:space:]]${ED%/}/:/:")
	if [[ -n ${f} ]] ; then
		echo "${f}" > "${T}"/scanelf-missing-SONAME.log
		if [[ "${QA_STRICT_SONAME-unset}" == unset ]] ; then
			if [[ ${#QA_SONAME[@]} -gt 1 ]] ; then
				for x in "${QA_SONAME[@]}" ; do
					sed -e "s#^/${x#/}\$##" -i "${T}"/scanelf-missing-SONAME.log
				done
			else
				local shopts=$-
				set -o noglob
				for x in ${QA_SONAME} ; do
					sed -e "s#^/${x#/}\$##" -i "${T}"/scanelf-missing-SONAME.log
				done
				set +o noglob
				set -${shopts}
			fi
		fi
		sed -e "/^\$/d" -i "${T}"/scanelf-missing-SONAME.log
		f=$(<"${T}"/scanelf-missing-SONAME.log)
		if [[ -n ${f} ]] ; then
			__vecho -ne '\n'
			eqawarn "QA Notice: The following shared libraries lack a SONAME"
			eqawarn "${f}"
			__vecho -ne '\n'
			sleep 1
		else
			rm -f "${T}"/scanelf-missing-SONAME.log
		fi
	fi

	# Check for shared libraries lacking NEEDED entries
	qa_var="QA_DT_NEEDED_${ARCH/-/_}"
	eval "[[ -n \${!qa_var} ]] && QA_DT_NEEDED=(\"\${${qa_var}[@]}\")"
	f=
	libraries=$(scanelf -ByF '%n %p' "${ED%/}"/{,usr/}lib*/lib*.so* | awk '$2 == "" { print }' | sed -e "s:^[[:space:]]::")
	if [[ -n ${libraries} ]] ; then
		while IFS= read -r library ; do
			# Only shared libraries containing undefined non-weak symbols actually need NEEDED entries.
			if [[ -n $(${NM} -D "${library}" | grep -E "^ +U ") ]] ; then
				f+="/${library#${ED%/}/}"$'\n'
			fi
		done <<< "${libraries}"
	fi
	if [[ -n ${f} ]] ; then
		echo "${f}" > "${T}"/scanelf-missing-NEEDED.log
		if [[ "${QA_STRICT_DT_NEEDED-unset}" == unset ]] ; then
			if [[ ${#QA_DT_NEEDED[@]} -gt 1 ]] ; then
				for x in "${QA_DT_NEEDED[@]}" ; do
					sed -e "s#^/${x#/}\$##" -i "${T}"/scanelf-missing-NEEDED.log
				done
			else
				local shopts=$-
				set -o noglob
				for x in ${QA_DT_NEEDED} ; do
					sed -e "s#^/${x#/}\$##" -i "${T}"/scanelf-missing-NEEDED.log
				done
				set +o noglob
				set -${shopts}
			fi
		fi
		sed -e "/^\$/d" -i "${T}"/scanelf-missing-NEEDED.log
		f=$(<"${T}"/scanelf-missing-NEEDED.log)
		if [[ -n ${f} ]] ; then
			__vecho -ne '\n'
			eqawarn "QA Notice: The following shared libraries lack NEEDED entries"
			eqawarn "${f}"
			__vecho -ne '\n'
			sleep 1
		else
			rm -f "${T}"/scanelf-missing-NEEDED.log
		fi
	fi
}

lib_check() {
	local f x i j

	if type -P scanelf >/dev/null && ! has binchecks ${RESTRICT}; then
		scanelf_lib_check
	fi

	# this should help to ensure that all (most?) shared libraries are executable
	# and that all libtool scripts / static libraries are not executable
	for i in "${ED%/}"/opt/*/lib* \
	         "${ED%/}"/lib* \
	         "${ED%/}"/usr/lib* ; do
		[[ ! -d ${i} ]] && continue

		for j in "${i}"/*.so.* "${i}"/*.so ; do
			[[ ! -e ${j} ]] && continue
			[[ -L ${j} ]] && continue
			[[ -x ${j} ]] && continue
			__vecho "making executable: ${j#${ED%/}}"
			chmod +x "${j}"
		done

		for j in "${i}"/*.a "${i}"/*.la ; do
			[[ ! -e ${j} ]] && continue
			[[ -L ${j} ]] && continue
			[[ ! -x ${j} ]] && continue
			__vecho "removing executable bit: ${j#${ED%/}}"
			chmod -x "${j}"
		done

		for j in "${i}"/*.{a,dll,dylib,sl,so}.* "${i}"/*.{a,dll,dylib,sl,so} ; do
			[[ ! -e ${j} ]] && continue
			[[ ! -L ${j} ]] && continue
			linkdest=$(readlink "${j}")
			if [[ ${linkdest} == /* ]] ; then
				__vecho -ne '\n'
				eqawarn "QA Notice: Found an absolute symlink in a library directory:"
				eqawarn "           ${j#${D%/}} -> ${linkdest}"
				eqawarn "           It should be a relative symlink if in the same directory"
				eqawarn "           or a linker script if it crosses the /usr boundary."
			fi
		done
	done

	# When installing static libraries into /usr/lib and shared libraries into
	# /lib, we have to make sure we have a linker script in /usr/lib along side
	# the static library, or gcc will utilize the static lib when linking :(.
	# https://bugs.gentoo.org/4411
	local abort="no"
	local a s
	for a in "${ED%/}"/usr/lib*/*.a ; do
		s=${a%.a}.so
		if [[ ! -e ${s} ]] ; then
			s=${s%usr/*}${s##*/usr/}
			if [[ -e ${s} ]] ; then
				__vecho -ne '\n'
				eqawarn "QA Notice: Missing gen_usr_ldscript for ${s##*/}"
				abort="yes"
			fi
		fi
	done
	[[ ${abort} == "yes" ]] && die "add those ldscripts"

	# Make sure people don't store libtool files or static libs in /lib
	f=$(ls "${ED%/}"/lib*/*.{a,la} 2>/dev/null)
	if [[ -n ${f} ]] ; then
		__vecho -ne '\n'
		eqawarn "QA Notice: Excessive files found in the / partition"
		eqawarn "${f}"
		__vecho -ne '\n'
		die "static archives (*.a) and libtool library files (*.la) belong in /usr/lib*, not /lib*"
	fi

	# Verify that the libtool files don't contain bogus $D entries.
	local abort=no gentoo_bug=no always_overflow=no
	for a in "${ED%/}"/usr/lib*/*.la ; do
		s=${a##*/}
		if grep -qs "${ED}" "${a}" ; then
			__vecho -ne '\n'
			eqawarn "QA Notice: ${s} appears to contain PORTAGE_TMPDIR paths"
			abort="yes"
		fi
	done
	[[ ${abort} == "yes" ]] && die "soiled libtool library files found"
}

lib_check
: # guarantee successful exit

# vim:ft=sh
