package-notes/macros.package-notes-srpm
Zbigniew Jędrzejewski-Szmek 2ee6aa07f8 Disable notes with linkers other than bfd
%_package_note_linker != "bfd" disables note insertion, so that it also works
as another opt-out mechanism. Maybe we can improve support in the future.

From https://bugzilla.redhat.com/show_bug.cgi?id=2043178#c26:

  It turns out that gold does something wrong with sections.
  When we add the new section, it shifts existing sections (and even gets one section less than before):
  │ -  Entry point address:               0x500
  │ +  Entry point address:               0x50
  │    Start of program headers:          64 (bytes into file)
  │ -  Start of section headers:          6328 (bytes into file)
  │ +  Start of section headers:          8344 (bytes into file)
  │    Flags:                             0x0
  │    Size of this header:               64 (bytes)
  │    Size of program headers:           56 (bytes)
  │ -  Number of program headers:         9
  │ +  Number of program headers:         8
  │    Size of section headers:           64 (bytes)
  │ -  Number of section headers:         36
  │ -  Section header string table index: 35
  │ +  Number of section headers:         38
  │ +  Section header string table index: 37

  There's a bug open to add INSERT AFTER [https://sourceware.org/bugzilla/show_bug.cgi?id=15373],
  but it's 8 years old.

  Opting out seems to be the best we can do for now.

I also noticed that gold support -dT, only lld doesn't, so the conditional is
adjusted accordingly.
2022-01-24 13:10:04 +01:00

54 lines
2.9 KiB
Plaintext

# This file is part of the package-notes package.
#
# Add an ELF note with information about the package the code was compiled for.
# See https://fedoraproject.org/wiki/Changes/Package_information_on_ELF_objects
# for details.
#
# To opt out of the use of this feature completely, include this in
# the spec file:
#
# %undefine _package_note_file
#
# The other macros can be undefined too to replace parts of the
# functionality. If %_generate_package_note_file is undefined, the
# linker script will not be generated, but the link flags may still
# refer to it. This may be useful if the default generation method is
# insufficient and a different mechanism will be used to generate
# %_package_note_file. If %_package_note_flags is undefined, the
# linker argument that injects the script will not be added to
# %build_ldfags, but the linker script would still be generated.
# The name of the file with the linker script. If %{buildsubdir} is
# defined, the file will be placed therein. Otherwise, one level up,
# directly in %{_builddir}.
#
# Note that %{version}-%{release} used here might be redefined from
# the "primary" values when subpackages with different version-release
# are specified. The contents of the script use the shell variable
# $RPM_PACKAGE_NAME, $RPM_PACKAGE_VERSION, $RPM_PACKAGE_RELEASE,
# and $RPM_ARCH that are set early and seem to always contain the "primary"
# values for the main package.
%_package_note_file %{_builddir}%{?buildsubdir:/%{buildsubdir}}/.package_note-%{name}-%{version}-%{release}.%{_arch}.ld
# Which linker will be used? This should be either "bfd", "gold", or
# "lld". Unfortunately linkers other than bfd do not support some of
# the options that we'd like to use, so if this is set to anything
# other than "bfd", note insertion is disabled.
%_package_note_linker bfd
# Whether to specify the READONLY attribute for the inserted
# section. We generally want this, but binutils <= 2.37 and other
# linkers do not support it.
%_package_note_readonly %["%_package_note_linker" == "bfd"?"1":"0"]
# Overall status: 1 if looks like we can insert the note, 0 otherwise
%_package_note_status %[0%{?_package_note_file:1} && 0%{?name:1} && "%_target_cpu" != "noarch" && "%_package_note_linker" == "bfd" ? 1 : 0]
# The linker flags to be passed to the compiler to insert the notes section.
%_package_note_flags %[%_package_note_status?"-Wl,%["%_package_note_linker" != "lld"?"-dT":"-T"],%{_package_note_file}":""]
# The command to actually generate the linker script that inserts the
# notes file. This command is automatically used as part of the build
# preamble.
%_generate_package_note_file %[%_package_note_status?"if [ -f %{_rpmconfigdir}/generate-rpm-note.sh ]; then %{_rpmconfigdir}/generate-rpm-note.sh %[0%{?_package_note_readonly}?"":"--readonly=no "]${RPM_PACKAGE_NAME:?} ${RPM_PACKAGE_VERSION:?}-${RPM_PACKAGE_RELEASE:?} ${RPM_ARCH:?} >%{_package_note_file}; fi":""]