commit:     f4bae8f7128a0a7977d4cf765f21301a2275f32e
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Wed Mar  1 00:51:07 2023 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Wed Mar  1 00:51:07 2023 +0000
URL:        https://gitweb.gentoo.org/repo/proj/prefix.git/commit/?id=f4bae8f7

sys-devel/binutils: add 2.40(-r2)

Bug: https://bugs.gentoo.org/895240
Bug: https://bugs.gentoo.org/892549
Signed-off-by: Sam James <sam <AT> gentoo.org>

 sys-devel/binutils/Manifest                        |   2 +
 sys-devel/binutils/binutils-2.40-r2.ebuild         | 509 +++++++++++++++++++++
 .../files/binutils-2.40-linker-search-path.patch   |  74 +++
 3 files changed, 585 insertions(+)

diff --git a/sys-devel/binutils/Manifest b/sys-devel/binutils/Manifest
index 3969b00779..83ad995e9e 100644
--- a/sys-devel/binutils/Manifest
+++ b/sys-devel/binutils/Manifest
@@ -3,3 +3,5 @@ DIST binutils-2.34.tar.xz 21637796 BLAKE2B 
07dd23916a7d27f71c3f160c8c16abe2bd4fc
 DIST binutils-2.39-patches-4.tar.xz 62880 BLAKE2B 
5cc335769d9c88417583ce059c61d0d7655f3ab9ac69647e6e2f65bd3a9dd143fe34c50bb68ab81d4226ddd0e4ef405d7102f67375a672eedc3d01b92b8ef497
 SHA512 
ef81350979af64cf35800b39982c84657a5c01362c01d221164a43d8f0dd80276c9f052c55d24516fad457e6671a58d467d71b5edd6c1f53fddbdb31172a21ee
 DIST binutils-2.39-patches-5.tar.xz 82924 BLAKE2B 
2cf75f661989f22270d6afe5f3c543814eb6a331be4493016fa2871e1f10a84a123c1c51e77a19b35e46680b9fe77390cb1532ca40d470a6041fa768fed3ccd7
 SHA512 
4b5811b4822b3a06f590fc7d082dc0ddf18a6058ac23887254e2ee9bd63c7f06f1636e446152115c7e0b01a6c5298a0d9df6904bd1582e66504ccde80dd1ecbd
 DIST binutils-2.39.tar.xz 25167756 BLAKE2B 
ac6a5296c6586d53eaadcbffc5c399a6d79edf72450b9bb8b3525ce525129cef3d2eb90c85ef3bb3270b5a03b0e1ffb8f0b705f028158726f9777ebb8685066f
 SHA512 
68e038f339a8c21faa19a57bbc447a51c817f47c2e06d740847c6e9cc3396c025d35d5369fa8c3f8b70414757c89f0e577939ddc0d70f283182504920f53b0a3
+DIST binutils-2.40-patches-2.tar.xz 183760 BLAKE2B 
447f1c40ac8212b1e91f6f2137f87958c3f4e2366b11b9979d9d09d52e9fcde9a9d74f0c1871616157e001f505849fceb2097a512f434b9c848885e367a07c35
 SHA512 
30efbfcbd2d936c74d9480e4f2f4b8dcd30abcd0f1b22d21d20558002fdb8c90bd2fe97e3f27c2905714dcfd1297cac2646ede1e2c3d9fbf159f93c8cf01a290
+DIST binutils-2.40.tar.xz 25241484 BLAKE2B 
8d799f7c595f878b9af5b17a490021dd8b8300ac2fe0ed8574c012929d22d2d0493e003a3e631a9436e8e712da801779b777c566167fe42b0bde119ffa5ad1c2
 SHA512 
a37e042523bc46494d99d5637c3f3d8f9956d9477b748b3b1f6d7dfbb8d968ed52c932e88a4e946c6f77b8f48f1e1b360ca54c3d298f17193f3b4963472f6925

diff --git a/sys-devel/binutils/binutils-2.40-r2.ebuild 
b/sys-devel/binutils/binutils-2.40-r2.ebuild
new file mode 100644
index 0000000000..fc19343327
--- /dev/null
+++ b/sys-devel/binutils/binutils-2.40-r2.ebuild
@@ -0,0 +1,509 @@
+# Copyright 1999-2023 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+inherit libtool flag-o-matic gnuconfig strip-linguas toolchain-funcs
+
+DESCRIPTION="Tools necessary to build programs"
+HOMEPAGE="https://sourceware.org/binutils/";
+
+LICENSE="GPL-3+"
+IUSE="cet doc gold gprofng multitarget +nls pgo +plugins static-libs test 
vanilla zstd"
+
+# Variables that can be set here  (ignored for live ebuilds)
+# PATCH_VER          - the patchset version
+#                      Default: empty, no patching
+# PATCH_BINUTILS_VER - the binutils version in the patchset name
+#                    - Default: PV
+# PATCH_DEV          - Use download URI 
https://dev.gentoo.org/~{PATCH_DEV}/distfiles/...
+#                      for the patchsets
+
+PATCH_VER=2
+PATCH_DEV=dilfridge
+
+if [[ ${PV} == 9999* ]]; then
+       inherit git-r3
+       SLOT=${PV}
+else
+       PATCH_BINUTILS_VER=${PATCH_BINUTILS_VER:-${PV}}
+       PATCH_DEV=${PATCH_DEV:-dilfridge}
+       SRC_URI="mirror://gnu/binutils/binutils-${PV}.tar.xz 
https://sourceware.org/pub/binutils/releases/binutils-${PV}.tar.xz 
https://dev.gentoo.org/~${PATCH_DEV}/distfiles/binutils-${PV}.tar.xz";
+       [[ -z ${PATCH_VER} ]] || SRC_URI="${SRC_URI}
+               
https://dev.gentoo.org/~${PATCH_DEV}/distfiles/binutils-${PATCH_BINUTILS_VER}-patches-${PATCH_VER}.tar.xz";
+       SLOT=$(ver_cut 1-2)
+       KEYWORDS="~x64-cygwin ~amd64-linux ~x86-linux ~sparc-solaris 
~sparc64-solaris ~x64-solaris ~x86-solaris"
+fi
+
+#
+# The cross-compile logic
+#
+export CTARGET=${CTARGET:-${CHOST}}
+if [[ ${CTARGET} == ${CHOST} ]] ; then
+       if [[ ${CATEGORY} == cross-* ]] ; then
+               export CTARGET=${CATEGORY#cross-}
+       fi
+fi
+is_cross() { [[ ${CHOST} != ${CTARGET} ]] ; }
+
+#
+# The dependencies
+#
+RDEPEND="
+       >=sys-devel/binutils-config-3
+       sys-libs/zlib
+       zstd? ( app-arch/zstd:= )
+"
+DEPEND="${RDEPEND}"
+BDEPEND="
+       doc? ( sys-apps/texinfo )
+       test? (
+               dev-util/dejagnu
+               sys-devel/bc
+       )
+       nls? ( sys-devel/gettext )
+       zstd? ( virtual/pkgconfig )
+       sys-devel/flex
+       app-alternatives/yacc
+"
+
+RESTRICT="!test? ( test )"
+
+PATCHES=(
+       "${FILESDIR}"/${PN}-2.22-solaris-anonymous-version-script-fix.patch
+)
+
+MY_BUILDDIR=${WORKDIR}/build
+
+src_unpack() {
+       if [[ ${PV} == 9999* ]] ; then
+               
EGIT_REPO_URI="https://anongit.gentoo.org/git/proj/toolchain/binutils-patches.git";
+               EGIT_CHECKOUT_DIR=${WORKDIR}/patches-git
+               git-r3_src_unpack
+               mv patches-git/9999 patch || die
+
+               EGIT_REPO_URI="https://sourceware.org/git/binutils-gdb.git";
+               S=${WORKDIR}/binutils
+               EGIT_CHECKOUT_DIR=${S}
+               git-r3_src_unpack
+       else
+               unpack ${P/-hppa64/}.tar.xz
+
+               cd "${WORKDIR}" || die
+               unpack 
binutils-${PATCH_BINUTILS_VER}-patches-${PATCH_VER}.tar.xz
+
+               # _p patch versions are Gentoo specific tarballs ...
+               local dir=${P%_p?}
+               dir=${dir/-hppa64/}
+
+               S=${WORKDIR}/${dir}
+       fi
+
+       cd "${WORKDIR}" || die
+       mkdir -p "${MY_BUILDDIR}" || die
+}
+
+src_prepare() {
+       local patchsetname
+       if [[ ${PV} == 9999* ]] ; then
+               patchsetname="from git master"
+       else
+               patchsetname="${PATCH_BINUTILS_VER}-${PATCH_VER}"
+       fi
+
+       if [[ -n ${PATCH_VER} ]] || [[ ${PV} == 9999* ]] ; then
+               if ! use vanilla; then
+                       einfo "Applying binutils patchset ${patchsetname}"
+                       eapply "${WORKDIR}/patch"
+                       einfo "Done."
+
+                       # This is applied conditionally for now just out of 
caution.
+                       # It should be okay on non-prefix systems though. See 
bug #892549.
+                       use prefix && eapply 
"${FILESDIR}"/binutils-2.40-linker-search-path.patch
+               fi
+       fi
+
+       # Make sure our explicit libdir paths don't get clobbered, bug #562460
+       sed -i \
+               -e 's:@bfdlibdir@:@libdir@:g' \
+               -e 's:@bfdincludedir@:@includedir@:g' \
+               {bfd,opcodes}/Makefile.in || die
+
+       # Fix locale issues if possible, bug #122216
+       if [[ -e ${FILESDIR}/binutils-configure-LANG.patch ]] ; then
+               einfo "Fixing misc issues in configure files"
+               for f in $(find "${S}" -name configure -exec grep -l 'autoconf 
version 2.13' {} +) ; do
+                       ebegin "  Updating ${f/${S}\/}"
+                       patch "${f}" 
"${FILESDIR}"/binutils-configure-LANG.patch >& "${T}"/configure-patch.log \
+                               || eerror "Please file a bug about this"
+                       eend $?
+               done
+       fi
+
+       # Apply things from PATCHES and user dirs
+       default
+
+       # Run misc portage update scripts
+       gnuconfig_update
+       elibtoolize --portage --no-uclibc
+}
+
+toolchain-binutils_bugurl() {
+       printf "https://bugs.gentoo.org/";
+}
+toolchain-binutils_pkgversion() {
+       printf "Gentoo ${PV}"
+       [[ -n ${PATCH_VER} ]] && printf " p${PATCH_VER}"
+}
+
+src_configure() {
+       # See 
https://www.gnu.org/software/make/manual/html_node/Parallel-Output.html
+       # Avoid really confusing logs from subconfigure spam, makes logs far
+       # more legible.
+       MAKEOPTS="--output-sync=line ${MAKEOPTS}"
+
+       # Setup some paths
+       LIBPATH=/usr/$(get_libdir)/binutils/${CTARGET}/${PV}
+       INCPATH=${LIBPATH}/include
+       DATAPATH=/usr/share/binutils-data/${CTARGET}/${PV}
+       if is_cross ; then
+               TOOLPATH=/usr/${CHOST}/${CTARGET}
+       else
+               TOOLPATH=/usr/${CTARGET}
+       fi
+       BINPATH=${TOOLPATH}/binutils-bin/${PV}
+
+       # Make sure we filter $LINGUAS so that only ones that
+       # actually work make it through, bug #42033
+       strip-linguas -u */po
+
+       # Keep things sane
+       strip-flags
+       use cet && filter-flags -mindirect-branch -mindirect-branch=*
+       use elibc_musl && append-ldflags -Wl,-z,stack-size=2097152
+
+       # ideally we want !tc-ld-is-bfd for best future-proofing, but it needs
+       # https://github.com/gentoo/gentoo/pull/28355
+       # mold needs this too but right now tc-ld-is-mold is also not available
+       if tc-ld-is-lld; then
+               append-ldflags -Wl,--undefined-version
+       fi
+
+       local x
+       echo
+       for x in CATEGORY CBUILD CHOST CTARGET CFLAGS LDFLAGS ; do
+               einfo "$(printf '%10s' ${x}:) ${!x}"
+       done
+       echo
+
+       cd "${MY_BUILDDIR}" || die
+       local myconf=()
+
+       if use plugins ; then
+               myconf+=( --enable-plugins )
+       fi
+       # enable gold (installed as ld.gold) and ld's plugin architecture
+       if use gold ; then
+               myconf+=( --enable-gold )
+       fi
+
+       if use nls ; then
+               myconf+=( --without-included-gettext )
+               [[ ${CHOST} == *"-solaris"* ]] && append-libs -lintl
+       else
+               myconf+=( --disable-nls )
+       fi
+
+       myconf+=( --with-system-zlib )
+
+       # For bi-arch systems, enable a 64bit bfd. This matches the bi-arch
+       # logic in toolchain.eclass. bug #446946
+       #
+       # We used to do it for everyone, but it's slow on 32bit arches. bug 
#438522
+       case $(tc-arch) in
+               ppc|sparc|x86) myconf+=( --enable-64-bit-bfd ) ;;
+       esac
+
+       use multitarget && myconf+=( --enable-targets=all --enable-64-bit-bfd )
+
+       [[ -n ${CBUILD} ]] && myconf+=( --build=${CBUILD} )
+
+       is_cross && myconf+=(
+               --with-sysroot="${EPREFIX}"/usr/${CTARGET}
+               --enable-poison-system-directories
+       )
+
+       myconf+=( --enable-secureplt )
+
+       # mips can't do hash-style=gnu ...
+       # let's not do this on Solaris either
+       if [[ $(tc-arch) != mips && ${CHOST} != *-solaris* ]] ; then
+               myconf+=( --enable-default-hash-style=gnu )
+       fi
+
+       myconf+=(
+               --prefix="${EPREFIX}"/usr
+               --host=${CHOST}
+               --target=${CTARGET}
+               --datadir="${EPREFIX}"${DATAPATH}
+               --datarootdir="${EPREFIX}"${DATAPATH}
+               --infodir="${EPREFIX}"${DATAPATH}/info
+               --mandir="${EPREFIX}"${DATAPATH}/man
+               --bindir="${EPREFIX}"${BINPATH}
+               --libdir="${EPREFIX}"${LIBPATH}
+               --libexecdir="${EPREFIX}"${LIBPATH}
+               --includedir="${EPREFIX}"${INCPATH}
+               --enable-obsolete
+               --enable-shared
+               --enable-threads
+               # Newer versions (>=2.27) offer a configure flag now.
+               --enable-relro
+               # Newer versions (>=2.24) make this an explicit option, bug 
#497268
+               --enable-install-libiberty
+               # Available from 2.35 on
+               --enable-textrel-check=warning
+
+               # These hardening options are available from 2.39+ but
+               # they unconditionally enable the behaviour even on arches
+               # where e.g. execstacks can't be avoided.
+               # See https://sourceware.org/bugzilla/show_bug.cgi?id=29592.
+               #--enable-warn-execstack
+               #--enable-warn-rwx-segments
+               #--disable-default-execstack (or is it 
--enable-default-execstack=no? docs are confusing)
+
+               # Things to think about
+               #--enable-deterministic-archives
+
+               # Works better than vapier's patch, bug #808787
+               --enable-new-dtags
+
+               --disable-jansson
+               --disable-werror
+               --with-bugurl="$(toolchain-binutils_bugurl)"
+               --with-pkgversion="$(toolchain-binutils_pkgversion)"
+               $(use_enable static-libs static)
+               $(use_with zstd)
+
+               # Disable modules that are in a combined binutils/gdb tree, bug 
#490566
+               --disable-{gdb,libdecnumber,readline,sim}
+               # Strip out broken static link flags.
+               # https://gcc.gnu.org/PR56750
+               --without-stage1-ldflags
+               # Change SONAME to avoid conflict across
+               # {native,cross}/binutils, binutils-libs. bug #666100
+               --with-extra-soversion-suffix=gentoo-${CATEGORY}-${PN}-$(usex 
multitarget mt st)
+
+               # Avoid automagic dependency on (currently prefix) systems
+               # systems with debuginfod library, bug #754753
+               --without-debuginfod
+
+               # Avoid automagic dev-libs/msgpack dep, bug #865875
+               --without-msgpack
+
+               # Allow user to opt into CET for host libraries.
+               # Ideally we would like automagic-or-disabled here.
+               # But the check does not quite work on i686: bug #760926.
+               $(use_enable cet)
+
+               # We can enable this by default in future, but it's brand new
+               # in 2.39 with several bugs:
+               # - Doesn't build on musl 
(https://sourceware.org/bugzilla/show_bug.cgi?id=29477)
+               # - No man pages 
(https://sourceware.org/bugzilla/show_bug.cgi?id=29521)
+               # - Broken at runtime without Java 
(https://sourceware.org/bugzilla/show_bug.cgi?id=29479)
+               # - binutils-config (and this ebuild?) needs adaptation first 
(https://bugs.gentoo.org/865113)
+               $(use_enable gprofng)
+       )
+
+       if ! is_cross ; then
+               myconf+=( $(use_enable pgo pgo-build lto) )
+
+               if use pgo ; then
+                       export BUILD_CFLAGS="${CFLAGS}"
+               fi
+       fi
+
+       ECONF_SOURCE="${S}" econf "${myconf[@]}" || die
+
+       # Prevent makeinfo from running if doc is unset.
+       if ! use doc ; then
+               sed -i \
+                       -e '/^MAKEINFO/s:=.*:= true:' \
+                       Makefile || die
+       fi
+}
+
+src_compile() {
+       cd "${MY_BUILDDIR}" || die
+
+       # see Note [tooldir hack for ldscripts]
+       emake V=1 tooldir="${EPREFIX}${TOOLPATH}" all
+
+       # only build info pages if the user wants them
+       if use doc ; then
+               emake V=1 info
+       fi
+
+       # we nuke the manpages when we're left with junk
+       # (like when we bootstrap, no perl -> no manpages)
+       find . -name '*.1' -a -size 0 -delete
+}
+
+src_test() {
+       cd "${MY_BUILDDIR}" || die
+
+       # bug #637066
+       filter-flags -Wall -Wreturn-type
+
+       emake -k V=1 check
+}
+
+src_install() {
+       local x d
+
+       cd "${MY_BUILDDIR}" || die
+
+       # see Note [tooldir hack for ldscripts]
+       emake V=1 DESTDIR="${D}" tooldir="${EPREFIX}${LIBPATH}" install
+       rm -rf "${ED}"/${LIBPATH}/bin || die
+       use static-libs || find "${ED}" -name '*.la' -delete
+
+       # Newer versions of binutils get fancy with ${LIBPATH}, bug #171905
+       cd "${ED}"/${LIBPATH} || die
+       for d in ../* ; do
+               [[ ${d} == ../${PV} ]] && continue
+               mv ${d}/* . || die
+               rmdir ${d} || die
+       done
+
+       # Now we collect everything intp the proper SLOT-ed dirs
+       # When something is built to cross-compile, it installs into
+       # /usr/$CHOST/ by default ... we have to 'fix' that :)
+       if is_cross ; then
+               cd "${ED}"/${BINPATH} || die
+               for x in * ; do
+                       mv ${x} ${x/${CTARGET}-} || die
+               done
+
+               if [[ -d ${ED}/usr/${CHOST}/${CTARGET} ]] ; then
+                       mv "${ED}"/usr/${CHOST}/${CTARGET}/include 
"${ED}"/${INCPATH}
+                       mv "${ED}"/usr/${CHOST}/${CTARGET}/lib/* 
"${ED}"/${LIBPATH}/
+                       rm -r "${ED}"/usr/${CHOST}/{include,lib}
+               fi
+       fi
+
+       insinto ${INCPATH}
+       local libiberty_headers=(
+               # Not all the libiberty headers.  See 
libiberty/Makefile.in:install_to_libdir.
+               demangle.h
+               dyn-string.h
+               fibheap.h
+               hashtab.h
+               libiberty.h
+               objalloc.h
+               splay-tree.h
+       )
+       doins "${libiberty_headers[@]/#/${S}/include/}"
+       if [[ -d ${ED}/${LIBPATH}/lib ]] ; then
+               mv "${ED}"/${LIBPATH}/lib/* "${ED}"/${LIBPATH}/ || die
+               rm -r "${ED}"/${LIBPATH}/lib || die
+       fi
+
+       # Generate an env.d entry for this binutils
+       insinto /etc/env.d/binutils
+       cat <<-EOF > "${T}"/env.d
+               TARGET="${CTARGET}"
+               VER="${PV}"
+               LIBPATH="${EPREFIX}${LIBPATH}"
+       EOF
+       newins "${T}"/env.d ${CTARGET}-${PV}
+
+       # Handle documentation
+       if ! is_cross ; then
+               cd "${S}" || die
+               dodoc README
+
+               docinto bfd
+               dodoc bfd/ChangeLog* bfd/README bfd/PORTING bfd/TODO
+
+               docinto binutils
+               dodoc binutils/ChangeLog binutils/NEWS binutils/README
+
+               docinto gas
+               dodoc gas/ChangeLog* gas/CONTRIBUTORS gas/NEWS gas/README*
+
+               docinto gprof
+               dodoc gprof/ChangeLog* gprof/TEST gprof/TODO gprof/bbconv.pl
+
+               docinto ld
+               dodoc ld/ChangeLog* ld/README ld/NEWS ld/TODO
+
+               docinto libiberty
+               dodoc libiberty/ChangeLog* libiberty/README
+
+               docinto opcodes
+               dodoc opcodes/ChangeLog*
+       fi
+
+       # Remove shared info pages
+       rm -f "${ED}"/${DATAPATH}/info/{dir,configure.info,standards.info}
+
+       # Trim all empty dirs
+       find "${ED}" -depth -type d -exec rmdir {} + 2>/dev/null
+}
+
+pkg_postinst() {
+       # Make sure this ${CTARGET} has a binutils version selected
+       [[ -e ${EROOT}/etc/env.d/binutils/config-${CTARGET} ]] && return 0
+       binutils-config ${CTARGET}-${PV}
+}
+
+pkg_postrm() {
+       local current_profile=$(binutils-config -c ${CTARGET})
+
+       # If no other versions exist, then uninstall for this
+       # target ... otherwise, switch to the newest version
+       # Note: only do this if this version is unmerged.  We
+       #       rerun binutils-config if this is a remerge, as
+       #       we want the mtimes on the symlinks updated (if
+       #       it is the same as the current selected profile)
+       if [[ ! -e ${EPREFIX}${BINPATH}/ld ]] && [[ ${current_profile} == 
${CTARGET}-${PV} ]] ; then
+               local choice=$(binutils-config -l | grep ${CTARGET} | awk 
'{print $2}')
+               choice=${choice//$'\n'/ }
+               choice=${choice/* }
+               if [[ -z ${choice} ]] ; then
+                       env -i ROOT="${ROOT}" binutils-config -u ${CTARGET}
+               else
+                       binutils-config ${choice}
+               fi
+       elif [[ $(CHOST=${CTARGET} binutils-config -c) == ${CTARGET}-${PV} ]] ; 
then
+               binutils-config ${CTARGET}-${PV}
+       fi
+}
+
+# Note [slotting support]
+# -----------------------
+# Gentoo's layout for binutils files is non-standard as Gentoo
+# supports slotted installation for binutils. Many tools
+# still expect binutils to reside in known locations.
+# binutils-config package restores symlinks into known locations,
+# like:
+#    /usr/bin/${CTARGET}-<tool>
+#    /usr/bin/${CHOST}/${CTARGET}/lib/ldscrips
+#    /usr/include/
+#
+# Note [tooldir hack for ldscripts]
+# ---------------------------------
+# Build system does not allow ./configure to tweak every location
+# we need for slotting binutils hence all the shuffling in
+# src_install(). This note is about SCRIPTDIR define handling.
+#
+# SCRIPTDIR defines 'ldscripts/' directory location. SCRIPTDIR value
+# is set at build-time in ld/Makefile.am as: 'scriptdir = $(tooldir)/lib'
+# and hardcoded as -DSCRIPTDIR='"$(scriptdir)"' at compile time.
+# Thus we can't just move files around after compilation finished.
+#
+# Our goal is the following:
+# - at build-time set scriptdir to point to symlinked location:
+#   ${TOOLPATH}: /usr/${CHOST} (or /usr/${CHOST}/${CTARGET} for cross-case)
+# - at install-time set scriptdir to point to slotted location:
+#   ${LIBPATH}: /usr/$(get_libdir)/binutils/${CTARGET}/${PV}

diff --git a/sys-devel/binutils/files/binutils-2.40-linker-search-path.patch 
b/sys-devel/binutils/files/binutils-2.40-linker-search-path.patch
new file mode 100644
index 0000000000..7423f8d705
--- /dev/null
+++ b/sys-devel/binutils/files/binutils-2.40-linker-search-path.patch
@@ -0,0 +1,74 @@
+https://bugs.gentoo.org/892549
+https://github.com/gentoo/binutils-gdb/pull/4
+
+From 1601840f9f2397edd56177871527a198a14277bd Mon Sep 17 00:00:00 2001
+From: James Le Cuirot <ch...@gentoo.org>
+Date: Sat, 11 Feb 2023 15:15:20 +0000
+Subject: [PATCH 1/2] ldelf.c: Always consider -L arguments when handling
+ DT_NEEDED
+
+This is for consistency with other linkers, including gold. Without
+this, we typically rely on ld.so.conf to find libraries such as
+libstdc++.so.6, while other linkers do not use this file at all.
+--- a/ld/ldelf.c
++++ b/ld/ldelf.c
+@@ -1090,8 +1090,8 @@ ldelf_handle_dt_needed (struct elf_link_hash_table *htab,
+        linker will search.  That means that we want to use
+        rpath_link, rpath, then the environment variable
+        LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
+-       entries (native only), then the linker script LIB_SEARCH_DIRS.
+-       We do not search using the -L arguments.
++       entries (native only), then the linker script LIB_SEARCH_DIRS,
++       then the -L arguments.
+ 
+        We search twice.  The first time, we skip objects which may
+        introduce version mismatches.  The second time, we force
+@@ -1165,11 +1165,7 @@ ldelf_handle_dt_needed (struct elf_link_hash_table 
*htab,
+         len = strlen (l->name);
+         for (search = search_head; search != NULL; search = search->next)
+           {
+-            char *filename;
+-
+-            if (search->cmdline)
+-              continue;
+-            filename = (char *) xmalloc (strlen (search->name) + len + 2);
++            char *filename = (char *) xmalloc (strlen (search->name) + len + 
2);
+             sprintf (filename, "%s/%s", search->name, l->name);
+             nn.name = filename;
+             if (ldelf_try_needed (&nn, force, is_linux))
+
+From 8afc65c8d8c0fff2f686ddd8eb9023c7ebabcca9 Mon Sep 17 00:00:00 2001
+From: James Le Cuirot <ch...@gentoo.org>
+Date: Sat, 11 Feb 2023 15:18:58 +0000
+Subject: [PATCH 2/2] ldelf.c: Do not search for libraries using ld.so.conf
+
+Other linkers do not do this. It is problematic for Gentoo Linux,
+because crossdev installs libraries such as libstdc++.so.6 outside of
+the sysroot.
+--- a/ld/ld.texi
++++ b/ld/ld.texi
+@@ -2355,7 +2355,9 @@ For a linker for a Linux system, if the file 
@file{/etc/ld.so.conf}
+ exists, the list of directories found in that file.  Note: the path
+ to this file is prefixed with the @code{sysroot} value, if that is
+ defined, and then any @code{prefix} string if the linker was
+-configured with the @command{--prefix=<path>} option.
++configured with the @command{--prefix=<path>} option. This has feature has
++been disabled on Gentoo Linux to make it consistent with the other
++linkers, which do not do this.
+ @item
+ For a native linker on a FreeBSD system, any directories specified by
+ the @code{_PATH_ELF_HINTS} macro defined in the @file{elf-hints.h}
+--- a/ld/ldelf.c
++++ b/ld/ldelf.c
+@@ -1156,10 +1156,6 @@ ldelf_handle_dt_needed (struct elf_link_hash_table 
*htab,
+             if (is_freebsd
+                 && ldelf_check_ld_elf_hints (l, force, elfsize))
+               break;
+-
+-            if (is_linux
+-                && ldelf_check_ld_so_conf (l, force, elfsize, prefix))
+-              break;
+           }
+ 
+         len = strlen (l->name);
+

Reply via email to