Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Makefile: use -z pack-relative-relocs

Commit 27f2a4db76e8 ("Makefile: fix GDB warning with CONFIG_RELR")
added --use-android-relr-tags to fix a GDB warning

BFD: /android0/linux-next/vmlinux: unknown type [0x13] section `.relr.dyn'

The GDB warning has been fixed in version 11.2.

The DT_ANDROID_RELR tag was deprecated since DT_RELR was standardized.
Thus, --use-android-relr-tags should be removed. While making the
change, try -z pack-relative-relocs, which is supported since LLD 15.
Keep supporting --pack-dyn-relocs=relr as well for older LLD versions.
There is no indication of obsolescence for --pack-dyn-relocs=relr.

As of today, GNU ld supports the latter option for x86 and powerpc64
ports and has no intention to support --pack-dyn-relocs=relr. In the
absence of the glibc symbol version GLIBC_ABI_DT_RELR,
--pack-dyn-relocs=relr and -z pack-relative-relocs are identical in
ld.lld.

GNU ld and newer versions of LLD report warnings (instead of errors) for
unknown -z options. Only errors lead to non-zero exit codes. Therefore,
we should test --pack-dyn-relocs=relr before testing
-z pack-relative-relocs.

Link: https://github.com/ClangBuiltLinux/linux/issues/1057
Link: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=a619b58721f0a03fd91c27670d3e4c2fb0d88f1e
Signed-off-by: Fangrui Song <maskray@google.com>
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>

authored by

Fangrui Song and committed by
Masahiro Yamada
ccb2d173 ddc72c96

+8 -3
+2 -1
Makefile
··· 1113 1113 endif 1114 1114 1115 1115 ifeq ($(CONFIG_RELR),y) 1116 - LDFLAGS_vmlinux += --pack-dyn-relocs=relr --use-android-relr-tags 1116 + # ld.lld before 15 did not support -z pack-relative-relocs. 1117 + LDFLAGS_vmlinux += $(call ld-option,--pack-dyn-relocs=relr,-z pack-relative-relocs) 1117 1118 endif 1118 1119 1119 1120 # We never want expected sections to be placed heuristically by the
+6 -2
scripts/tools-support-relr.sh
··· 7 7 cat << "END" | $CC -c -x c - -o $tmp_file.o >/dev/null 2>&1 8 8 void *p = &p; 9 9 END 10 - $LD $tmp_file.o -shared -Bsymbolic --pack-dyn-relocs=relr \ 11 - --use-android-relr-tags -o $tmp_file 10 + 11 + # ld.lld before 15 did not support -z pack-relative-relocs. 12 + if ! $LD $tmp_file.o -shared -Bsymbolic --pack-dyn-relocs=relr -o $tmp_file 2>/dev/null; then 13 + $LD $tmp_file.o -shared -Bsymbolic -z pack-relative-relocs -o $tmp_file 2>&1 | 14 + grep -q pack-relative-relocs && exit 1 15 + fi 12 16 13 17 # Despite printing an error message, GNU nm still exits with exit code 0 if it 14 18 # sees a relr section. So we need to check that nothing is printed to stderr.