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
