From: "H.J. Lu" <hjl.tools@gmail.com>
To: binutils@sourceware.org
Cc: Nick Clifton <nickc@redhat.com>, Alan Modra <amodra@gmail.com>,
libc-alpha@sourceware.org
Subject: [PATCH v2 0/9] ld: Implement DT_RELR for x86
Date: Sat, 8 Jan 2022 10:38:29 -0800 [thread overview]
Message-ID: <20220108183838.1920397-1-hjl.tools@gmail.com> (raw)
Hi Nick,
I'd like to enable DT_RELR for x86 in binutils 2.38.
H.J.
---
Changes in v2:
1. Drop the _bfd_elf_link_iterate_on_relocs patch, which has been checked
into master branch.
2. Also pack R_*_RELATIVE relocations against dynamic symbols.
3. Skip relocation against IFUNC symbol earlier.
4. Don't require the --relax option enabled.
5. Add more DT_RELR tests:
a. Add a test with relative relocation in section with 1-byte
alignment.
b. Add a test with -z pack-relative-relocs --no-relax.
c. Add tests for packing R_*_RELATIVE relocations against dynamic
symbols.
DT_RELR encodes consecutive R_*_RELATIVE relocations in GOT (the global
offset table) and data sections in a compact format:
https://groups.google.com/g/generic-abi/c/bX460iggiKg
On some targets, R_*_RELATIVE relocations are counted and the GOT offsets
are allocated when setting the dynamic section sizes after seeing all
relocations. R_*_RELATIVE relocations are generated while relocating
sections after section layout has been finalized.
For x86 targets, the old check_relocs is renamed to scan_relocs and a
new check_relocs is added to chek input sections and create dynamic
relocation sections so that they will be mapped to output sections.
scan_relocs is now called from elf_backend_always_size_sections.
On some targets, the DT_RELR section size can be computed only after all
symbols addresses can be determined:
1. Update ldelf_map_segments to pass need_layout to
_bfd_elf_map_sections_to_segments which will size DT_RELR section and
set need_layout to true if the DT_RELR section size is changed.
2. Set the preliminary DT_RELR section size before mapping sections to
segments and set the final DT_RELR section size after regular symbol
processing is done.
On x86, DT_RELR is implemented with linker relaxation:
1. During linker relaxation, we scan input relocations with the same
logic in relocate_section to determine if a relative relocation should
be generated and save the relative relocation candidate information for
sizing the DT_RELR section later after all symbols addresses can be
determined. For these relative relocations which can't be placed in
the DT_RELR section, they will be placed in the rela.dyn/rel.dyn
section.
2. When DT_RELR is enabled, _bfd_elf_map_sections_to_segments calls a
backend function to size the DT_RELR section which will compute the
DT_RELR section size and tell ldelf_map_segments to layout sections
again when the DT_RELR section size has been increased.
3. After regular symbol processing is finished, bfd_elf_final_link calls
a backend function to finish the DT_RELR section.
When DT_RELR is enabled, to avoid random run-time crash with older glibc
binaries without DT_RELR support, add a GLIBC_ABI_DT_RELR symbol version,
which is provided by glibc with DT_RELR support, dependency on the shared
C library if it provides a GLIBC_2.XX symbol version.
It can build DT_RELR enabled glibc successfully on x86-64, x32 and
i686.
H.J. Lu (9):
elf: Add .relr.dyn to special_sections_r
elf: Extract _bfd_elf_process_reverse_copy
elf: Pass need_layout to _bfd_elf_map_sections_to_segments
ld: Initial DT_RELR support
elf: Add size_relative_relocs and finish_relative_relocs
elf: Support DT_RELR in linker tests
x86: Add DT_RELR support
ld: Add simple DT_RELR tests
ld: Add glibc dependency for DT_RELR
bfd/elf-bfd.h | 15 +-
bfd/elf.c | 22 +-
bfd/elf32-i386.c | 77 +-
bfd/elf64-x86-64.c | 92 +-
bfd/elflink.c | 168 ++-
bfd/elfxx-target.h | 8 +
bfd/elfxx-x86.c | 954 ++++++++++++++++++
bfd/elfxx-x86.h | 147 ++-
binutils/testsuite/lib/binutils-common.exp | 1 +
include/bfdlink.h | 4 +
ld/NEWS | 3 +
ld/emulparams/dt-relr.sh | 21 +
ld/emulparams/elf32_x86_64.sh | 1 +
ld/emulparams/elf_i386.sh | 1 +
ld/emulparams/elf_x86_64.sh | 1 +
ld/emultempl/elf.em | 5 +-
ld/ld.texi | 13 +
ld/ldelf.c | 9 +
ld/ldelfgen.c | 3 +-
ld/ldlang.c | 3 +-
ld/scripttempl/elf.sc | 4 +
ld/testsuite/config/default.exp | 16 +
ld/testsuite/ld-elf/dt-relr-1.s | 13 +
ld/testsuite/ld-elf/dt-relr-1a.d | 10 +
ld/testsuite/ld-elf/dt-relr-1b.d | 9 +
ld/testsuite/ld-elf/dt-relr-1c.d | 9 +
ld/testsuite/ld-elf/dt-relr-2.s | 20 +
ld/testsuite/ld-elf/dt-relr-2a.d | 10 +
ld/testsuite/ld-elf/dt-relr-2b.d | 17 +
ld/testsuite/ld-elf/dt-relr-2c.d | 17 +
ld/testsuite/ld-elf/dt-relr-2d.d | 17 +
ld/testsuite/ld-elf/dt-relr-2e.d | 9 +
ld/testsuite/ld-elf/dt-relr-2f.d | 8 +
ld/testsuite/ld-elf/dt-relr-2g.d | 9 +
ld/testsuite/ld-elf/dt-relr-2h.d | 9 +
ld/testsuite/ld-elf/dt-relr-3.s | 12 +
ld/testsuite/ld-elf/dt-relr-3a.d | 9 +
ld/testsuite/ld-elf/dt-relr-3b.d | 9 +
ld/testsuite/ld-elf/dt-relr-glibc-1.c | 11 +
ld/testsuite/ld-elf/dt-relr-glibc-1a.rd | 4 +
ld/testsuite/ld-elf/dt-relr-glibc-1b.rd | 7 +
ld/testsuite/ld-elf/dt-relr.exp | 44 +
ld/testsuite/ld-elf/shared.exp | 3 +-
ld/testsuite/ld-i386/dt-relr-1.d | 14 +
ld/testsuite/ld-i386/dt-relr-1.s | 3 +
ld/testsuite/ld-i386/export-class.exp | 2 +-
ld/testsuite/ld-i386/i386.exp | 21 +-
ld/testsuite/ld-i386/ibt-plt-2a.d | 2 +-
ld/testsuite/ld-i386/ibt-plt-3a.d | 2 +-
ld/testsuite/ld-i386/ibt-plt-3c.d | 2 +-
ld/testsuite/ld-i386/pr26869.d | 2 +-
ld/testsuite/ld-i386/report-reloc-1.d | 2 +-
ld/testsuite/ld-ifunc/ifunc-2-i386-now.d | 2 +-
.../ld-ifunc/ifunc-2-local-i386-now.d | 2 +-
.../ld-ifunc/ifunc-2-local-x86-64-now.d | 2 +-
ld/testsuite/ld-ifunc/ifunc-2-x86-64-now.d | 2 +-
ld/testsuite/ld-ifunc/pr17154-x86-64-now.d | 2 +-
ld/testsuite/ld-ifunc/pr17154-x86-64.d | 2 +-
ld/testsuite/ld-x86-64/bnd-branch-1-now.d | 2 +-
ld/testsuite/ld-x86-64/bnd-ifunc-1-now.d | 2 +-
ld/testsuite/ld-x86-64/bnd-ifunc-2-now.d | 2 +-
ld/testsuite/ld-x86-64/bnd-ifunc-2.d | 2 +-
ld/testsuite/ld-x86-64/bnd-plt-1-now.d | 2 +-
ld/testsuite/ld-x86-64/bnd-plt-1.d | 2 +-
ld/testsuite/ld-x86-64/dt-relr-1-x32.d | 15 +
ld/testsuite/ld-x86-64/dt-relr-1.d | 14 +
ld/testsuite/ld-x86-64/dt-relr-1.s | 3 +
ld/testsuite/ld-x86-64/export-class.exp | 3 +-
ld/testsuite/ld-x86-64/ibt-plt-2a-x32.d | 2 +-
ld/testsuite/ld-x86-64/ibt-plt-2a.d | 2 +-
ld/testsuite/ld-x86-64/ibt-plt-3a-x32.d | 2 +-
ld/testsuite/ld-x86-64/ibt-plt-3a.d | 2 +-
ld/testsuite/ld-x86-64/ilp32-4.d | 2 +-
ld/testsuite/ld-x86-64/load1c.d | 2 +-
ld/testsuite/ld-x86-64/load1d.d | 2 +-
ld/testsuite/ld-x86-64/pr13082-2b.d | 2 +-
ld/testsuite/ld-x86-64/pr14207.d | 2 +-
ld/testsuite/ld-x86-64/pr18176.d | 2 +-
ld/testsuite/ld-x86-64/pr19162.d | 2 +-
ld/testsuite/ld-x86-64/pr19636-2d.d | 2 +-
ld/testsuite/ld-x86-64/pr19636-2l.d | 2 +-
ld/testsuite/ld-x86-64/pr20253-1d.d | 2 +-
ld/testsuite/ld-x86-64/pr20253-1f.d | 2 +-
ld/testsuite/ld-x86-64/pr20253-1j.d | 2 +-
ld/testsuite/ld-x86-64/pr20253-1l.d | 2 +-
ld/testsuite/ld-x86-64/report-reloc-1-x32.d | 2 +-
ld/testsuite/ld-x86-64/report-reloc-1.d | 2 +-
ld/testsuite/ld-x86-64/x86-64.exp | 67 +-
88 files changed, 1883 insertions(+), 155 deletions(-)
create mode 100644 ld/emulparams/dt-relr.sh
create mode 100644 ld/testsuite/ld-elf/dt-relr-1.s
create mode 100644 ld/testsuite/ld-elf/dt-relr-1a.d
create mode 100644 ld/testsuite/ld-elf/dt-relr-1b.d
create mode 100644 ld/testsuite/ld-elf/dt-relr-1c.d
create mode 100644 ld/testsuite/ld-elf/dt-relr-2.s
create mode 100644 ld/testsuite/ld-elf/dt-relr-2a.d
create mode 100644 ld/testsuite/ld-elf/dt-relr-2b.d
create mode 100644 ld/testsuite/ld-elf/dt-relr-2c.d
create mode 100644 ld/testsuite/ld-elf/dt-relr-2d.d
create mode 100644 ld/testsuite/ld-elf/dt-relr-2e.d
create mode 100644 ld/testsuite/ld-elf/dt-relr-2f.d
create mode 100644 ld/testsuite/ld-elf/dt-relr-2g.d
create mode 100644 ld/testsuite/ld-elf/dt-relr-2h.d
create mode 100644 ld/testsuite/ld-elf/dt-relr-3.s
create mode 100644 ld/testsuite/ld-elf/dt-relr-3a.d
create mode 100644 ld/testsuite/ld-elf/dt-relr-3b.d
create mode 100644 ld/testsuite/ld-elf/dt-relr-glibc-1.c
create mode 100644 ld/testsuite/ld-elf/dt-relr-glibc-1a.rd
create mode 100644 ld/testsuite/ld-elf/dt-relr-glibc-1b.rd
create mode 100644 ld/testsuite/ld-elf/dt-relr.exp
create mode 100644 ld/testsuite/ld-i386/dt-relr-1.d
create mode 100644 ld/testsuite/ld-i386/dt-relr-1.s
create mode 100644 ld/testsuite/ld-x86-64/dt-relr-1-x32.d
create mode 100644 ld/testsuite/ld-x86-64/dt-relr-1.d
create mode 100644 ld/testsuite/ld-x86-64/dt-relr-1.s
--
2.33.1
next reply other threads:[~2022-01-08 18:38 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-08 18:38 H.J. Lu [this message]
2022-01-08 18:38 ` [PATCH v2 1/9] elf: Add .relr.dyn to special_sections_r H.J. Lu
2022-01-08 18:38 ` [PATCH v2 2/9] elf: Extract _bfd_elf_process_reverse_copy H.J. Lu
2022-01-08 18:38 ` [PATCH v2 3/9] elf: Pass need_layout to _bfd_elf_map_sections_to_segments H.J. Lu
2022-01-08 18:38 ` [PATCH v2 4/9] ld: Initial DT_RELR support H.J. Lu
2022-01-08 18:38 ` [PATCH v2 5/9] elf: Add size_relative_relocs and finish_relative_relocs H.J. Lu
2022-01-08 18:38 ` [PATCH v2 6/9] elf: Support DT_RELR in linker tests H.J. Lu
2022-01-08 18:38 ` [PATCH v2 7/9] x86: Add DT_RELR support H.J. Lu
2022-01-08 18:38 ` [PATCH v2 8/9] ld: Add simple DT_RELR tests H.J. Lu
2022-01-08 18:38 ` [PATCH v2 9/9] ld: Add glibc dependency for DT_RELR H.J. Lu
2022-01-10 15:31 ` Florian Weimer
2022-01-10 15:40 ` H.J. Lu
2022-01-10 15:42 ` Florian Weimer
2022-01-08 21:53 ` [PATCH v2 0/9] ld: Implement DT_RELR for x86 Fangrui Song
2022-01-09 8:13 ` Alexander Monakov
2022-01-13 2:54 ` Fangrui Song
2022-01-13 3:00 ` H.J. Lu
2022-01-11 10:13 ` Nick Clifton
2022-01-11 14:08 ` H.J. Lu
2022-01-12 12:33 ` Nick Clifton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220108183838.1920397-1-hjl.tools@gmail.com \
--to=hjl.tools@gmail.com \
--cc=amodra@gmail.com \
--cc=binutils@sourceware.org \
--cc=libc-alpha@sourceware.org \
--cc=nickc@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).