[0/2] Improve -z mark-plt

Message ID 20240105215015.1123568-1-hjl.tools@gmail.com
Headers
Series Improve -z mark-plt |

Message

H.J. Lu Jan. 5, 2024, 9:50 p.m. UTC
  Add --enable-make-plt linker configure option to mark PLT entries with
DT_X86_64_PLT, DT_X86_64_PLTSZ and DT_X86_64_PLTENT dynamic tags by
default.

When -z mark-plt is used to add DT_X86_64_PLT, DT_X86_64_PLTSZ and
DT_X86_64_PLTENT, the r_addend field of the R_X86_64_JUMP_SLOT relocation
stores the offset of the indirect branch instruction.  However, glibc
versions which don't have this commit in glibc 2.36:

commit f8587a61892cbafd98ce599131bf4f103466f084
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Fri May 20 19:21:48 2022 -0700

    x86-64: Ignore r_addend for R_X86_64_GLOB_DAT/R_X86_64_JUMP_SLOT

    According to x86-64 psABI, r_addend should be ignored for R_X86_64_GLOB_DAT
    and R_X86_64_JUMP_SLOT.  Since linkers always set their r_addends to 0, we
    can ignore their r_addends.

    Reviewed-by: Fangrui Song <maskray@google.com>

won't ignore the r_addend value in the R_X86_64_JUMP_SLOT relocation.
Although this commit has been backported to glibc 2.33/2.34/2.35 release
branches, it is safer to require glibc 2.36 for such binaries.

Extend the glibc version dependency of GLIBC_ABI_DT_RELR for DT_RELR to
also add GLIBC_2.36 version dependency for -z mark-plt on the the shared C
library if it provides a GLIBC_2.XX symbol version.

H.J. Lu (2):
  elf: Add elf_backend_add_glibc_version_dependency
  ld: Add --enable-make-plt configure option

 bfd/elf-bfd.h                                 |  23 +++
 bfd/elf64-x86-64.c                            |  27 ++++
 bfd/elflink.c                                 | 146 ++++++++++--------
 bfd/elfxx-target.h                            |   5 +
 ld/NEWS                                       |   5 +
 ld/config.in                                  |   4 +
 ld/configure                                  |  26 +++-
 ld/configure.ac                               |  17 ++
 ld/emulparams/x86-64-plt.sh                   |   7 +-
 ld/emultempl/elf-x86.em                       |  17 ++
 .../ld-elf/indirect-extern-access-2.rd        |   2 +-
 ld/testsuite/ld-elf/pr23161d.rd               |   2 +-
 ld/testsuite/ld-ifunc/ifunc-16-x86-64-now.d   |   2 +-
 ld/testsuite/ld-ifunc/ifunc-16-x86-64.d       |   2 +-
 .../ld-ifunc/ifunc-2-local-x86-64-now.d       |   2 +-
 ld/testsuite/ld-ifunc/ifunc-2-local-x86-64.d  |   2 +-
 ld/testsuite/ld-ifunc/ifunc-2-x86-64-now.d    |   2 +-
 ld/testsuite/ld-ifunc/ifunc-2-x86-64.d        |   2 +-
 ld/testsuite/ld-ifunc/ifunc-20-x86-64.d       |   2 +-
 ld/testsuite/ld-ifunc/ifunc-25c-x86.d         |   2 +-
 ld/testsuite/ld-ifunc/ifunc-5b-x86-64.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/mark-plt-1a.rd         |   7 +
 ld/testsuite/ld-x86-64/mark-plt-1b.rd         |   7 +
 ld/testsuite/ld-x86-64/x86-64.exp             |  47 +++++-
 26 files changed, 281 insertions(+), 83 deletions(-)
 create mode 100644 ld/testsuite/ld-x86-64/mark-plt-1a.rd
 create mode 100644 ld/testsuite/ld-x86-64/mark-plt-1b.rd