%define lib_major 2 %define lib_name_orig %{package_prefix}%mklibname binutils %define lib_name %{lib_name_orig}%{lib_major} %define dev_name %mklibname binutils -d %define rpm_ver 2.40 %define tar_ver 2.40 %define rel 11 %define subrel 1 # Define if building a cross-binutils %define build_cross 0 %{expand: %{?cross: %%global build_cross 1}} %if %{build_cross} %define target_cpu %{cross} %define target_platform %{target_cpu}-%_real_vendor-linux%{gnuext} %define program_prefix %{target_platform}- %define package_prefix cross-%{target_cpu}- %else %define target_cpu %{_target_cpu} %define target_platform %{_target_platform} %define program_prefix %{nil} %define package_prefix %{nil} %endif %define arch %(echo %{target_cpu}|sed -e "s/\(i.86\|athlon\)/i386/" -e "s/amd64/x86_64/") %define isarch() %(case " %* " in (*" %{arch} "*) echo 1;; (*) echo 0;; esac) %if %{build_cross} %if %isarch %arm %define gnuext -gnueabi %else %define gnuext -gnu %endif %endif # List of targets where gold can be enabled %define gold_arches %{ix86} x86_64 %{arm} aarch64 Summary: GNU Binary Utility Development Utilities Name: %{package_prefix}binutils Epoch: 1 Version: %{rpm_ver} Release: %mkrel %{rel} License: GPLv3+ Group: Development/Other URL: https://www.gnu.org/software/binutils/ Source0: https://ftp.gnu.org/gnu/binutils/binutils-%{tar_ver}.tar.xz Source1: build_cross_binutils.sh Source2: binutils-2.19.50.0.1-output-format.sed Source3: binutils-git.sh %if "%{name}" == "binutils" Provides: %{lib_name} = %{epoch}:%{version}-%{release} %endif # (tmb) force build with gcc 12.3 BuildRequires: gcc >= 12.3.0-1 # (tmb) force fixed binutils BuildRequires: binutils >= 1:2.38-3 BuildRequires: autoconf BuildRequires: automake BuildRequires: bison BuildRequires: flex BuildRequires: gettext BuildRequires: texinfo-tex BuildRequires: dejagnu BuildRequires: pkgconfig(zlib) # make check'ing requires libdl.a BuildRequires: glibc-static-devel # gold make check'ing requires libstdc++.a BuildRequires: libstdc++-static-devel # revert devel enabling on branch Source101: binutils-disable-development.patch # upstream 2.40 branch Patch001: 0001-Updated-translations-for-the-gas-and-binutils-sub-di.patch Patch002: 0002-libctf-update-regexp-to-allow-makeinfo-to-build-docu.patch Patch003: 0003-Fix-version-number-snafu-in-some-configuration-files.patch Patch004: 0004-toplevel-Makefile.def-add-install-strip-dependency-o.patch Patch005: 0005-Updated-Swedish-translation-for-the-binutils-sub-dir.patch Patch006: 0006-gprofng-PR29521-docs-man-pages-are-not-in-the-releas.patch Patch007: 0007-gprofng-PR30043-libgprofng.so.-are-installed-to-a-wr.patch Patch008: 0008-RISC-V-make-C-extension-JAL-available-again-for-32-b.patch Patch009: 0009-Updated-Swedish-translation-for-the-binutils-sub-dir.patch Patch010: 0010-bpf-fix-error-conversion-from-long-unsigned-int-to-u.patch Patch011: 0011-Pass-JANSSON_LIBS-and-ZSTD_LIBS-to-ld-bootstrap-boot.patch Patch012: 0012-configure-remove-dependencies-on-gmp-and-mpfr-when-g.patch Patch013: 0013-gas-correct-symbol-name-comparison-in-.startof.-.siz.patch Patch014: 0014-Updated-translations-for-the-bfd-and-gprof-directori.patch Patch015: 0015-Updated-Serbian-translations-for-gold-gprof-and-opco.patch Patch016: 0016-ppc32-and-LOAD-segment-with-RWX-permissions.patch Patch017: 0017-PR30046-power-cmpi-leads-to-unknown-architecture.patch Patch018: 0018-PR30155-ld-segfault-in-_bfd_nearby_section.patch Patch019: 0019-PR30198-Assertion-and-segfault-when-linking-x86_64-e.patch Patch020: 0020-PR30217-dynamic-relocations-using-local-dynamic-symb.patch Patch021: 0021-coff_get_normalized_symtab-bfd_release.patch Patch022: 0022-libctf-fix-assertion-failure-with-no-system-qsort_r.patch Patch023: 0023-libctf-get-the-offsets-of-fields-of-unnamed-structs-.patch Patch024: 0024-gas-arm-Fix-a-further-IT-predicated-vcvt-issue-in-th.patch Patch025: 0025-gas-arm-Change-warning-message-to-not-reference-spec.patch Patch026: 0026-lto-Don-t-add-indirect-symbols-for-versioned-aliases.patch Patch027: 0027-Updated-Hungarian-translation-for-the-gprof-director.patch Patch028: 0028-New-Georgian-translation-for-the-bfd-sub-directory.patch # upstream master branch from 200 # patches once liberated from Fedora: # NOTE! Do not add more without maintainer approval Patch301: binutils-2.20.51.0.2-libtool-lib64.patch Patch302: binutils-2.37-export-demangle.h.patch Patch303: binutils-2.22.52.0.4-no-config-h-check.patch # Mageia patches Source401: binutils-2.39-linux32.patch Patch402: binutils-2.39-skip-gold-check.patch # security fixes # CVE-2023-1972 Patch500: 0500-Fix-an-illegal-memory-access-when-an-accessing-a-zer.patch %description Binutils is a collection of binary utilities, including: * ar: creating modifying and extracting from archives * nm: for listing symbols from object files * objcopy: for copying and translating object files * objdump: for displaying information from object files * ranlib: for generating an index for the contents of an archive * size: for listing the section sizes of an object or archive file * strings: for listing printable strings from files * strip: for discarding symbols (a filter for demangling encoded C++ symbols * addr2line: for converting addresses to file and line * nlmconv: for converting object code into an NLM Install binutils if you need to perform any of these types of actions on binary files. Most programmers will want to install binutils. %package -n %{dev_name} Summary: Main library for %{name} Group: Development/Other Provides: %{name}-devel = %{epoch}:%{version}-%{release} Provides: %{lib_name}-devel = %{epoch}:%{version}-%{release} Requires: zlib-devel # filter out self-requries %global __requires_exclude ^devel\\(libbfd-%{version} %description -n %{dev_name} This package contains BFD and opcodes static libraries and associated header files. Only *.a libraries are included, because BFD doesn't have a stable ABI. Developers starting new projects are strongly encouraged to consider using libelf instead of BFD. %prep %setup -q -n binutils-%{tar_ver} %autopatch -p1 # remove to force regenerating it because of reverts in P10-P12 rm -f ld/ldlex.c %build # Additional targets ADDITIONAL_TARGETS="" case %{target_cpu} in i*86 | athlon*) ADDITIONAL_TARGETS="x86_64-%{_target_vendor}-%{_target_os}" ;; esac if [[ -n "$ADDITIONAL_TARGETS" ]]; then TARGET_CONFIG="$TARGET_CONFIG --enable-targets=$ADDITIONAL_TARGETS" fi case %{target_cpu} in i*86 | athlon* | aarch64*) TARGET_CONFIG="$TARGET_CONFIG --enable-64-bit-bfd" ;; esac case %{target_cpu} in x86_64*|i?86*|arm*|aarch64*) TARGET_CONFIG="$TARGET_CONFIG --enable-targets=x86_64-pep" ;; esac %if "%{name}" != "binutils" %define _program_prefix %{program_prefix} TARGET_CONFIG="$TARGET_CONFIG --target=%{target_platform}" %endif # Don't build shared libraries in cross binutils %if "%{name}" == "binutils" TARGET_CONFIG="$TARGET_CONFIG --enable-shared --with-pic" %endif # Binutils comes with its own custom libtool # [gb] FIXME: but system libtool also works and has relink fix %define __libtoolize /bin/true # Build main binaries rm -rf objs mkdir objs pushd objs CONFIGURE_TOP=.. %configure $TARGET_CONFIG --with-bugurl=https://bugs.mageia.org/ \ --enable-gold \ --enable-plugins \ --enable-compressed-debug-sections=none \ --enable-gprofng=no \ --enable-relro=yes # There seems to be some problems with builds of gold randomly failing whenever # going through the build system, so let's try workaround this by trying to do # make once again when it happens... %make_build tooldir=%{_prefix} || make tooldir=%{_prefix} popd %check # All Tests must pass on x86 and x86_64 # rtp: some ld-arm tests are failing. # they're fixed in 2.21 but didn't find the fixes echo ====================TESTING========================= %if %isarch i386 x86_64 %make_build -C objs check LDFLAGS="" || : # random build failures with gold seems to happen during check as well... make -k -C objs gold-check LDFLAGS="" || : %else %make_build -C objs -k check LDFLAGS="" || : %endif echo ====================TESTING END===================== logfile="%{name}-%{version}-%{release}.log" rm -f $logfile; find . -name "*.sum" | xargs cat >> $logfile %install # disable 'check-rpaths' only from warning about standard RPATHs (0x0001) # (tmb) TODO / FIXME better ??? export QA_RPATHS=0x0001 mkdir -p $RPM_BUILD_ROOT%{_prefix} %make_install -C objs rm -f $RPM_BUILD_ROOT%{_mandir}/man1/{dlltool,nlmconv,windres}* rm -f $RPM_BUILD_ROOT%{_infodir}/dir rm -f $RPM_BUILD_ROOT%{_libdir}/*.la rm -f $RPM_BUILD_ROOT%{_libdir}/lib{bfd,opcodes}.so %if "%{name}" == "binutils" make -C objs prefix=$RPM_BUILD_ROOT%{_prefix} infodir=$RPM_BUILD_ROOT%{_infodir} install-info install -m 644 include/libiberty.h $RPM_BUILD_ROOT%{_includedir}/ %if %isarch %mips install -m 644 objs/libiberty/libiberty.a $RPM_BUILD_ROOT%{_libdir}/ # Ship with the PIC libiberty %else install -m 644 objs/libiberty/pic/libiberty.a $RPM_BUILD_ROOT%{_libdir}/ %endif rm -rf $RPM_BUILD_ROOT%{_prefix}/%{_target_platform}/ # Sanity check --enable-64-bit-bfd really works. %if %isarch i*86 athlon* grep '^#define BFD_ARCH_SIZE 64$' %{buildroot}%{_prefix}/include/bfd.h %endif # Fix multilib conflicts of generated values by __WORDSIZE-based expressions. %if %isarch %{ix86} x86_64 sed -i -e '/^#include "ansidecl.h"/{p;s~^.*$~#include ~;}' \ -e 's/^#define BFD_DEFAULT_TARGET_SIZE \(32\|64\) *$/#define BFD_DEFAULT_TARGET_SIZE __WORDSIZE/' \ -e 's/^#define BFD_HOST_64BIT_LONG [01] *$/#define BFD_HOST_64BIT_LONG (__WORDSIZE == 64)/' \ -e 's/^#define BFD_HOST_64_BIT \(long \)\?long *$/#if __WORDSIZE == 32\ #define BFD_HOST_64_BIT long long\ #else\ #define BFD_HOST_64_BIT long\ #endif/' \ -e 's/^#define BFD_HOST_U_64_BIT unsigned \(long \)\?long *$/#define BFD_HOST_U_64_BIT unsigned BFD_HOST_64_BIT/' \ %{buildroot}%{_prefix}/include/bfd.h %endif touch -r bfd/bfd-in2.h %{buildroot}%{_prefix}/include/bfd.h # Generate .so linker scripts for dependencies; imported from glibc/Makerules: # This fragment of linker script gives the OUTPUT_FORMAT statement # for the configuration we are building. OUTPUT_FORMAT="\ /* Ensure this .so library will not be used by a link for a different format on a multi-architecture system. */ $(gcc $CFLAGS $LDFLAGS -shared -x c /dev/null -o /dev/null -Wl,--verbose -v 2>&1 | sed -n -f "%{SOURCE2}")" tee %{buildroot}%{_libdir}/libbfd.so <> binutils.lang cat ld.lang >> binutils.lang cat gold.lang>> binutils.lang cat gprof.lang >> binutils.lang %find_lang opcodes %find_lang bfd cat opcodes.lang >> binutils.lang cat bfd.lang >> binutils.lang %files -f binutils.lang %{_bindir}/%{program_prefix}addr2line %{_bindir}/%{program_prefix}ar %{_bindir}/%{program_prefix}as %{_bindir}/%{program_prefix}c++filt %{_bindir}/%{program_prefix}dwp %{_bindir}/%{program_prefix}elfedit %{_bindir}/%{program_prefix}gprof %{_bindir}/%{program_prefix}ld %{_bindir}/%{program_prefix}ld.bfd %if %isarch %{gold_arches} %{_bindir}/%{program_prefix}ld.gold %endif %{_bindir}/%{program_prefix}nm %{_bindir}/%{program_prefix}objcopy %{_bindir}/%{program_prefix}objdump %{_bindir}/%{program_prefix}ranlib %{_bindir}/%{program_prefix}readelf %{_bindir}/%{program_prefix}size %{_bindir}/%{program_prefix}strings %{_bindir}/%{program_prefix}strip %{_mandir}/man1/* %if "%{name}" == "binutils" %{_infodir}/*info* %{_libdir}/bfd-plugins/libdep.so %{_libdir}/libbfd-%{version}*.so %{_libdir}/libctf.so.0 %{_libdir}/libctf.so.0.0.0 %{_libdir}/libctf-nobfd.so.0 %{_libdir}/libctf-nobfd.so.0.0.0 %{_libdir}/libopcodes-%{version}*.so %{_libdir}/libsframe.so.0 %{_libdir}/libsframe.so.0.0.0 %else %{_prefix}/%{target_platform}/bin/* %{_prefix}/%{target_platform}/lib/ldscripts %endif %if "%{name}" == "binutils" %files -n %{dev_name} %{_includedir}/*.h %{_libdir}/libbfd.a %{_libdir}/libbfd.so %{_libdir}/libctf.a %{_libdir}/libctf.so %{_libdir}/libctf-nobfd.a %{_libdir}/libctf-nobfd.so %{_libdir}/libiberty.a %{_libdir}/libopcodes.a %{_libdir}/libopcodes.so %{_libdir}/libsframe.a %{_libdir}/libsframe.so %endif