commit:     89b02b4b145ab489734ebcee4d111657473ba560
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Mon Jun 20 15:25:35 2022 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Mon Jun 20 15:28:28 2022 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=89b02b4b

sys-apps/attr: update EAPI 7 -> 8; use real symbol versioning (fix lld, etc)

This should finally let us fix compatibility with LLD and.. pretty much
anything other than gcc + bfd + -fno-lto (and even then it wasn't
technically correct).

Big thanks to Alexander Miller for sorting it out.

Closes: https://bugs.gentoo.org/644048
Closes: https://bugs.gentoo.org/700116
Thanks-to: Alexander Miller <alex.miller <AT> gmx.de>
Signed-off-by: Sam James <sam <AT> gentoo.org>

 .../{attr-9999.ebuild => attr-2.5.1-r1.ebuild}     |  44 +++---
 sys-apps/attr/attr-9999.ebuild                     |  44 +++---
 sys-apps/attr/files/attr-2.5.1-fix-symver.patch    | 173 +++++++++++++++++++++
 3 files changed, 225 insertions(+), 36 deletions(-)

diff --git a/sys-apps/attr/attr-9999.ebuild b/sys-apps/attr/attr-2.5.1-r1.ebuild
similarity index 74%
copy from sys-apps/attr/attr-9999.ebuild
copy to sys-apps/attr/attr-2.5.1-r1.ebuild
index 58d5e41c2738..c8051fdd82e4 100644
--- a/sys-apps/attr/attr-9999.ebuild
+++ b/sys-apps/attr/attr-2.5.1-r1.ebuild
@@ -1,30 +1,34 @@
 # Copyright 1999-2022 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
-EAPI="7"
+EAPI=8
 
-inherit flag-o-matic libtool toolchain-funcs multilib-minimal usr-ldscript
+# autotools inherit only needed for 2.5.1-r1 patch for symvers
+# hopefully in next release
+inherit autotools flag-o-matic toolchain-funcs multilib-minimal usr-ldscript
 
 if [[ ${PV} == 9999 ]] ; then
        EGIT_REPO_URI="https://git.savannah.gnu.org/git/${PN}.git";
-
        inherit autotools git-r3
 else
+       inherit libtool
+
        KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k ~mips ~ppc 
~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux"
        SRC_URI="mirror://nongnu/${PN}/${P}.tar.xz"
 fi
 
 DESCRIPTION="Extended attributes tools"
 HOMEPAGE="https://savannah.nongnu.org/projects/attr";
+
 LICENSE="LGPL-2.1"
 SLOT="0"
-
 IUSE="debug nls static-libs"
 
-BDEPEND="
-       sys-devel/binutils
-       nls? ( sys-devel/gettext )
-"
+BDEPEND="nls? ( sys-devel/gettext )"
+
+PATCHES=(
+       "${FILESDIR}"/${PN}-2.5.1-fix-symver.patch
+)
 
 src_prepare() {
        default
@@ -34,35 +38,38 @@ src_prepare() {
                eautopoint
                eautoreconf
        else
-               elibtoolize #580792
+               # bug #580792
+               #elibtoolize
+
+               # Temporarily for 2.5.1-r1 for symver patch
+               eautoreconf
        fi
 }
 
 src_configure() {
-       # Remove -flto* from flags as this breaks binaries (bug #644048)
-       filter-flags -flto*
-       append-ldflags "-Wl,--no-gc-sections" #700116
-       tc-ld-force-bfd #644048
-       append-lfs-flags #760857
+       # bug #760857
+       append-lfs-flags
+
        multilib-minimal_src_configure
 }
 
 multilib_src_configure() {
        local myeconfargs=(
                --bindir="${EPREFIX}"/bin
+               --libexecdir="${EPREFIX}"/usr/$(get_libdir)
                --enable-shared
                $(use_enable static-libs static)
                $(use_enable nls)
-               --libexecdir="${EPREFIX}"/usr/$(get_libdir)
                $(use_enable debug)
        )
+
        ECONF_SOURCE="${S}" econf "${myeconfargs[@]}"
 }
 
 multilib_src_install() {
        emake DESTDIR="${D}" install
 
-       # Sanity check until we track down why this is happening. #644048
+       # Sanity check until we track down why this is happening. bug #644048
        local lib="${ED}/usr/$(get_libdir)/libattr.so.1"
        if [[ -e ${lib} ]] ; then
                local versions=$($(tc-getREADELF) -V "${lib}")
@@ -76,18 +83,19 @@ multilib_src_install() {
                        echo "${versions}"
                        echo "# readelf -sW ${lib}"
                        echo "${symbols}"
-                       die "symbol version sanity check failed; please comment 
on https://bugs.gentoo.org/644048";
+                       die "Symbol version sanity check failed; please comment 
on https://bugs.gentoo.org/644048";
                else
                        einfo "${lib} passed symbol checks"
                fi
        fi
 
        if multilib_is_native_abi; then
-               # we install attr into /bin, so we need the shared lib with it
+               # We install attr into /bin, so we need the shared lib with it
                gen_usr_ldscript -a attr
        fi
 
        # Add a wrapper until people upgrade.
+       # TODO: figure out when this was added & when we can drop it!
        insinto /usr/include/attr
        newins "${FILESDIR}"/xattr-shim.h xattr.h
 }

diff --git a/sys-apps/attr/attr-9999.ebuild b/sys-apps/attr/attr-9999.ebuild
index 58d5e41c2738..c8051fdd82e4 100644
--- a/sys-apps/attr/attr-9999.ebuild
+++ b/sys-apps/attr/attr-9999.ebuild
@@ -1,30 +1,34 @@
 # Copyright 1999-2022 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
-EAPI="7"
+EAPI=8
 
-inherit flag-o-matic libtool toolchain-funcs multilib-minimal usr-ldscript
+# autotools inherit only needed for 2.5.1-r1 patch for symvers
+# hopefully in next release
+inherit autotools flag-o-matic toolchain-funcs multilib-minimal usr-ldscript
 
 if [[ ${PV} == 9999 ]] ; then
        EGIT_REPO_URI="https://git.savannah.gnu.org/git/${PN}.git";
-
        inherit autotools git-r3
 else
+       inherit libtool
+
        KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k ~mips ~ppc 
~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux"
        SRC_URI="mirror://nongnu/${PN}/${P}.tar.xz"
 fi
 
 DESCRIPTION="Extended attributes tools"
 HOMEPAGE="https://savannah.nongnu.org/projects/attr";
+
 LICENSE="LGPL-2.1"
 SLOT="0"
-
 IUSE="debug nls static-libs"
 
-BDEPEND="
-       sys-devel/binutils
-       nls? ( sys-devel/gettext )
-"
+BDEPEND="nls? ( sys-devel/gettext )"
+
+PATCHES=(
+       "${FILESDIR}"/${PN}-2.5.1-fix-symver.patch
+)
 
 src_prepare() {
        default
@@ -34,35 +38,38 @@ src_prepare() {
                eautopoint
                eautoreconf
        else
-               elibtoolize #580792
+               # bug #580792
+               #elibtoolize
+
+               # Temporarily for 2.5.1-r1 for symver patch
+               eautoreconf
        fi
 }
 
 src_configure() {
-       # Remove -flto* from flags as this breaks binaries (bug #644048)
-       filter-flags -flto*
-       append-ldflags "-Wl,--no-gc-sections" #700116
-       tc-ld-force-bfd #644048
-       append-lfs-flags #760857
+       # bug #760857
+       append-lfs-flags
+
        multilib-minimal_src_configure
 }
 
 multilib_src_configure() {
        local myeconfargs=(
                --bindir="${EPREFIX}"/bin
+               --libexecdir="${EPREFIX}"/usr/$(get_libdir)
                --enable-shared
                $(use_enable static-libs static)
                $(use_enable nls)
-               --libexecdir="${EPREFIX}"/usr/$(get_libdir)
                $(use_enable debug)
        )
+
        ECONF_SOURCE="${S}" econf "${myeconfargs[@]}"
 }
 
 multilib_src_install() {
        emake DESTDIR="${D}" install
 
-       # Sanity check until we track down why this is happening. #644048
+       # Sanity check until we track down why this is happening. bug #644048
        local lib="${ED}/usr/$(get_libdir)/libattr.so.1"
        if [[ -e ${lib} ]] ; then
                local versions=$($(tc-getREADELF) -V "${lib}")
@@ -76,18 +83,19 @@ multilib_src_install() {
                        echo "${versions}"
                        echo "# readelf -sW ${lib}"
                        echo "${symbols}"
-                       die "symbol version sanity check failed; please comment 
on https://bugs.gentoo.org/644048";
+                       die "Symbol version sanity check failed; please comment 
on https://bugs.gentoo.org/644048";
                else
                        einfo "${lib} passed symbol checks"
                fi
        fi
 
        if multilib_is_native_abi; then
-               # we install attr into /bin, so we need the shared lib with it
+               # We install attr into /bin, so we need the shared lib with it
                gen_usr_ldscript -a attr
        fi
 
        # Add a wrapper until people upgrade.
+       # TODO: figure out when this was added & when we can drop it!
        insinto /usr/include/attr
        newins "${FILESDIR}"/xattr-shim.h xattr.h
 }

diff --git a/sys-apps/attr/files/attr-2.5.1-fix-symver.patch 
b/sys-apps/attr/files/attr-2.5.1-fix-symver.patch
new file mode 100644
index 000000000000..55ef4506f7de
--- /dev/null
+++ b/sys-apps/attr/files/attr-2.5.1-fix-symver.patch
@@ -0,0 +1,173 @@
+https://lists.nongnu.org/archive/html/acl-devel/2022-05/msg00000.html
+Bug: https://bugs.gentoo.org/644048
+Bug: https://bugs.gentoo.org/700116
+
+From a9ca51afd2b9f68f57de3a4c3d962d1d763572ca Mon Sep 17 00:00:00 2001
+From: Alexander Miller <[email protected]>
+Date: Thu, 28 Nov 2019 22:17:24 +0100
+Subject: [PATCH] Better supported way to set symbol versions for legacy
+ syscalls
+
+Using a linker script to set a symbol versions is an undocumented
+hack and doesn't work reliably in many cases. It works (to some
+degree) with the bfd linker, but fails with gold or lld. And even
+with bfd it can break when using --gc-sections or LTO.
+
+The result may be a library where the code has been discarded and
+the versioned symbols are unusable, e.g.
+    23: 00000000     0 NOTYPE  GLOBAL DEFAULT  ABS getxattr@ATTR_1.0
+instead of
+    23: 000033c0     0 FUNC    GLOBAL DEFAULT   11 getxattr@ATTR_1.0
+
+Remove the linker script entirely and set symbol versions with the
+symver attribute if available (in gcc >= 10, but not in clang),
+otherwise use the traditional global asm solution with a .symver
+directive.
+Those are the documented ways to do it and well supported by (almost)
+all configurations. (The exception is old gcc with LTO; a workaround
+is included, but some versions may still need -flto-partition=none).
+
+Signed-off-by: Alexander Miller <[email protected]>
+--- a/libattr/Makemodule.am
++++ b/libattr/Makemodule.am
+@@ -8,7 +8,7 @@ LT_CURRENT = 2
+ LT_AGE = 1
+ LTVERSION = $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
+ 
+-libattr_la_DEPENDENCIES = exports libattr/libattr.lds
++libattr_la_DEPENDENCIES = exports
+ libattr_la_SOURCES = \
+       libattr/attr_copy_action.c \
+       libattr/attr_copy_check.c \
+@@ -20,7 +20,4 @@ libattr_la_SOURCES = \
+ libattr_la_CFLAGS = -include libattr/libattr.h
+ libattr_la_LDFLAGS = \
+       -Wl,--version-script,$(top_srcdir)/exports \
+-      -Wl,$(top_srcdir)/libattr/libattr.lds \
+       -version-info $(LTVERSION)
+-
+-EXTRA_DIST += libattr/libattr.lds
+--- a/libattr/libattr.lds
++++ /dev/null
+@@ -1,12 +0,0 @@
+-"fgetxattr@ATTR_1.0" = libattr_fgetxattr;
+-"flistxattr@ATTR_1.0" = libattr_flistxattr;
+-"fremovexattr@ATTR_1.0" = libattr_fremovexattr;
+-"fsetxattr@ATTR_1.0" = libattr_fsetxattr;
+-"getxattr@ATTR_1.0" = libattr_getxattr;
+-"lgetxattr@ATTR_1.0" = libattr_lgetxattr;
+-"listxattr@ATTR_1.0" = libattr_listxattr;
+-"llistxattr@ATTR_1.0" = libattr_llistxattr;
+-"lremovexattr@ATTR_1.0" = libattr_lremovexattr;
+-"lsetxattr@ATTR_1.0" = libattr_lsetxattr;
+-"removexattr@ATTR_1.0" = libattr_removexattr;
+-"setxattr@ATTR_1.0" = libattr_setxattr;
+--- a/libattr/syscalls.c
++++ b/libattr/syscalls.c
+@@ -26,6 +26,27 @@
+ #include <sys/syscall.h>
+ #include <sys/xattr.h>
+ 
++/*
++ * Versioning of compat symbols:
++ * prefer symver attribute if available (since gcc 10),
++ * fall back to traditional .symver asm directive otherwise.
++ */
++#ifdef __has_attribute
++# if __has_attribute(symver)
++#  define SYMVER(cn, vn) __typeof(cn) cn __attribute__((symver(vn)))
++# elif __has_attribute(no_reorder)
++   /*
++    * Avoid wrong partitioning with older gcc and LTO. May not work reliably
++    * with all versions; use -flto-partition=none if you encounter problems.
++    */
++#  define SYMVER(cn, vn) __typeof(cn) cn __attribute__((noreorder)); \
++                       __asm__(".symver " #cn "," vn)
++# endif
++#endif
++#ifndef SYMVER
++#  define SYMVER(cn, vn) __asm__(".symver " #cn "," vn)
++#endif
++
+ #ifdef HAVE_VISIBILITY_ATTRIBUTE
+ # pragma GCC visibility push(default)
+ #endif
+@@ -35,66 +56,78 @@ int libattr_setxattr(const char *path, const char *name,
+ {
+       return syscall(__NR_setxattr, path, name, value, size, flags);
+ }
++SYMVER(libattr_setxattr, "setxattr@ATTR_1.0");
+ 
+ int libattr_lsetxattr(const char *path, const char *name,
+                     void *value, size_t size, int flags)
+ {
+       return syscall(__NR_lsetxattr, path, name, value, size, flags);
+ }
++SYMVER(libattr_lsetxattr, "lsetxattr@ATTR_1.0");
+ 
+ int libattr_fsetxattr(int filedes, const char *name,
+                     void *value, size_t size, int flags)
+ {
+       return syscall(__NR_fsetxattr, filedes, name, value, size, flags);
+ }
++SYMVER(libattr_fsetxattr, "fsetxattr@ATTR_1.0");
+ 
+ ssize_t libattr_getxattr(const char *path, const char *name,
+                        void *value, size_t size)
+ {
+       return syscall(__NR_getxattr, path, name, value, size);
+ }
++SYMVER(libattr_getxattr, "getxattr@ATTR_1.0");
+ 
+ ssize_t libattr_lgetxattr(const char *path, const char *name,
+                         void *value, size_t size)
+ {
+       return syscall(__NR_lgetxattr, path, name, value, size);
+ }
++SYMVER(libattr_lgetxattr, "lgetxattr@ATTR_1.0");
+ 
+ ssize_t libattr_fgetxattr(int filedes, const char *name,
+                         void *value, size_t size)
+ {
+       return syscall(__NR_fgetxattr, filedes, name, value, size);
+ }
++SYMVER(libattr_fgetxattr, "fgetxattr@ATTR_1.0");
+ 
+ ssize_t libattr_listxattr(const char *path, char *list, size_t size)
+ {
+       return syscall(__NR_listxattr, path, list, size);
+ }
++SYMVER(libattr_listxattr, "listxattr@ATTR_1.0");
+ 
+ ssize_t libattr_llistxattr(const char *path, char *list, size_t size)
+ {
+       return syscall(__NR_llistxattr, path, list, size);
+ }
++SYMVER(libattr_llistxattr, "llistxattr@ATTR_1.0");
+ 
+ ssize_t libattr_flistxattr(int filedes, char *list, size_t size)
+ {
+       return syscall(__NR_flistxattr, filedes, list, size);
+ }
++SYMVER(libattr_flistxattr, "flistxattr@ATTR_1.0");
+ 
+ int libattr_removexattr(const char *path, const char *name)
+ {
+       return syscall(__NR_removexattr, path, name);
+ }
++SYMVER(libattr_removexattr, "removexattr@ATTR_1.0");
+ 
+ int libattr_lremovexattr(const char *path, const char *name)
+ {
+       return syscall(__NR_lremovexattr, path, name);
+ }
++SYMVER(libattr_lremovexattr, "lremovexattr@ATTR_1.0");
+ 
+ int libattr_fremovexattr(int filedes, const char *name)
+ {
+       return syscall(__NR_fremovexattr, filedes, name);
+ }
++SYMVER(libattr_fremovexattr, "fremovexattr@ATTR_1.0");
+ 
+ #ifdef HAVE_VISIBILITY_ATTRIBUTE
+ # pragma GCC visibility pop

Reply via email to