diff --git a/SOURCES/0001_use_PIE_objects_for_static_libraries.patch b/SOURCES/0001_use_PIE_objects_for_static_libraries.patch new file mode 100644 index 0000000..5cff687 --- /dev/null +++ b/SOURCES/0001_use_PIE_objects_for_static_libraries.patch @@ -0,0 +1,92 @@ +From a57d1aaafe47dadaa5fad8b73ec9e2e31bb5f123 Mon Sep 17 00:00:00 2001 +From: Paolo Bonzini +Date: Thu, 8 Oct 2020 15:30:24 +0200 +Subject: [PATCH] build: use PIE objects for static libraries if + b_staticpic=false but b_pie=true + +If static_library is used as a convenience library (e.g. for link_whole) +it should in principle not need position independent code. +However, if the executables that the libraries is linked to are PIE, +the non-PIC objects in the static library will cause linker errors. +To avoid this, obey b_pie for static libraries if either b_staticpic=false +or they use "pic: false". + +Without this patch, QEMU cannot use b_staticpic, which causes a slowdown +on some QEMU benchmarks up to 20%. + +(cherry picked from commit 021d242f9ce8e6cd804af0c1eb4179b8c83fd470) +Signed-off-by: Danilo C. L. de Paula +--- + mesonbuild/backend/backends.py | 2 +- + mesonbuild/build.py | 18 +++++++++++------- + 2 files changed, 12 insertions(+), 8 deletions(-) + +diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py +index c84bb7534..f67efe370 100644 +--- a/mesonbuild/backend/backends.py ++++ b/mesonbuild/backend/backends.py +@@ -694,7 +694,7 @@ class Backend: + # Set -fPIC for static libraries by default unless explicitly disabled + if isinstance(target, build.StaticLibrary) and target.pic: + commands += compiler.get_pic_args() +- if isinstance(target, build.Executable) and target.pie: ++ elif isinstance(target, (build.StaticLibrary, build.Executable)) and target.pie: + commands += compiler.get_pie_args() + # Add compile args needed to find external dependencies. Link args are + # added while generating the link command. +diff --git a/mesonbuild/build.py b/mesonbuild/build.py +index a06979cea..90cbd1aa6 100644 +--- a/mesonbuild/build.py ++++ b/mesonbuild/build.py +@@ -972,13 +972,13 @@ This will become a hard error in a future Meson release.''') + if m.is_darwin() or m.is_windows(): + self.pic = True + else: +- self.pic = self._extract_pic_pie(kwargs, 'pic') +- if isinstance(self, Executable): ++ self.pic = self._extract_pic_pie(kwargs, 'pic', environment, 'b_staticpic') ++ if isinstance(self, Executable) or (isinstance(self, StaticLibrary) and not self.pic): + # Executables must be PIE on Android + if self.environment.machines[self.for_machine].is_android(): + self.pie = True + else: +- self.pie = self._extract_pic_pie(kwargs, 'pie') ++ self.pie = self._extract_pic_pie(kwargs, 'pie', environment, 'b_pie') + self.implicit_include_directories = kwargs.get('implicit_include_directories', True) + if not isinstance(self.implicit_include_directories, bool): + raise InvalidArguments('Implicit_include_directories must be a boolean.') +@@ -990,14 +990,20 @@ This will become a hard error in a future Meson release.''') + if self.gnu_symbol_visibility not in permitted: + raise InvalidArguments('GNU symbol visibility arg {} not one of: {}'.format(self.symbol_visibility, ', '.join(permitted))) + +- def _extract_pic_pie(self, kwargs, arg): ++ def _extract_pic_pie(self, kwargs, arg, environment, option): + # Check if we have -fPIC, -fpic, -fPIE, or -fpie in cflags + all_flags = self.extra_args['c'] + self.extra_args['cpp'] + if '-f' + arg.lower() in all_flags or '-f' + arg.upper() in all_flags: + mlog.warning("Use the '{}' kwarg instead of passing '{}' manually to {!r}".format(arg, '-f' + arg, self.name)) + return True + +- val = kwargs.get(arg, False) ++ if arg in kwargs: ++ val = kwargs[arg] ++ elif option in environment.coredata.base_options: ++ val = environment.coredata.base_options[option].value ++ else: ++ val = False ++ + if not isinstance(val, bool): + raise InvalidArguments('Argument {} to {!r} must be boolean'.format(arg, self.name)) + return val +@@ -1611,8 +1617,6 @@ class StaticLibrary(BuildTarget): + + def __init__(self, name, subdir, subproject, for_machine: MachineChoice, sources, objects, environment, kwargs): + self.typename = 'static library' +- if 'pic' not in kwargs and 'b_staticpic' in environment.coredata.base_options: +- kwargs['pic'] = environment.coredata.base_options['b_staticpic'].value + super().__init__(name, subdir, subproject, for_machine, sources, objects, environment, kwargs) + if 'cs' in self.compilers: + raise InvalidArguments('Static libraries not supported for C#.') +-- +2.27.0 + diff --git a/SPECS/meson.spec b/SPECS/meson.spec index bb996d3..b611322 100644 --- a/SPECS/meson.spec +++ b/SPECS/meson.spec @@ -7,7 +7,7 @@ Name: meson Version: 0.55.3 -Release: 2%{?dist} +Release: 3%{?dist} Summary: High productivity build system License: ASL 2.0 @@ -72,6 +72,8 @@ BuildRequires: llvm-devel BuildRequires: cups-devel %endif +patch0001: 0001_use_PIE_objects_for_static_libraries.patch + %description Meson is a build system designed to optimize programmer productivity. It aims to do this by providing simple, out-of-the-box @@ -113,6 +115,11 @@ export MESON_PRINT_TEST_OUTPUT=1 %changelog +* Tue Dec 15 2020 Danilo C. L. de Paula - 0.55.3-3 +- build: use PIE objects for static libraries + Resolves: rhbz#1899620 + (meson builds QEMU with PIC objects instead of PIE) + * Thu Oct 15 2020 Danilo C. L. de Paula - 0.55.3-2 - Add python3-devel dependency, as asked by the BZ.. - Resolves: rhbz#1872692