[PATCH] x86-64: Add -z mark-plt and -z nomark-plt
Jan Beulich
jbeulich@suse.com
Wed Sep 27 06:56:55 GMT 2023
On 26.09.2023 18:13, H.J. Lu via Binutils wrote:
> The PLT entry in executables and shared libraries contains an indirect
> branch, like
>
> jmp *foo@GOTPCREL(%rip)
> push $index_foo
> jmp .PLT0
>
> or
>
> endbr64
> jmp *foo@GOTPCREL(%rip)
> NOP padding
>
> which is used to branch to the function, foo, defined in another object.
> Each R_X86_64_JUMP_SLOT relocation has a corresponding PLT entry.
>
> The dynamic tags have been added to the x86-64 psABI to mark such PLT
> entries:
>
> https://gitlab.com/x86-psABIs/x86-64-ABI/-/commit/6d824a52a42d173eb838b879616c1be5870b593e
>
> Add an x86-64 linker option, -z mark-plt, to mark PLT entries with
>
> #define DT_X86_64_PLT (DT_LOPROC + 0)
> #define DT_X86_64_PLTSZ (DT_LOPROC + 1)
> #define DT_X86_64_PLTENT (DT_LOPROC + 3)
>
> 1. DT_X86_64_PLT: The address of the procedure linkage table.
> 2. DT_X86_64_PLTSZ: The total size, in bytes, of the procedure linkage
> table.
> 3. DT_X86_64_PLTENT: The size, in bytes, of a procedure linkage table
> entry.
>
> and set the r_addend field of the R_X86_64_JUMP_SLOT relocation to the
> memory offset of the indirect branch instruction. The dynamic linker
> can use these tags to update the PLT section to direct branch.
>
> bfd/
>
> * elf-linker-x86.h (elf_linker_x86_params): Add mark_plt.
> * elf64-x86-64.c (elf_x86_64_finish_dynamic_symbol): Set the
> r_addend of R_X86_64_JUMP_SLOT to the indirect branch offset
> in PLT entry for -z mark-plt.
> * elfxx-x86.c (_bfd_x86_elf_size_dynamic_sections): Add
> DT_X86_64_PLT, DT_X86_64_PLTSZ and DT_X86_64_PLTENT for
> -z mark-plt.
> (_bfd_x86_elf_finish_dynamic_sections): Set DT_X86_64_PLT,
> DT_X86_64_PLTSZ and DT_X86_64_PLTENT.
> (_bfd_x86_elf_get_synthetic_symtab): Ignore addend for
> JUMP_SLOT relocation.
> (_bfd_x86_elf_link_setup_gnu_properties): Set
> plt_indirect_branch_offset.
> * elfxx-x86.h (elf_x86_plt_layout): Add plt_indirect_branch_offset.
>
> binutils/
>
> * readelf.c (get_x86_64_dynamic_type): New function.
> (get_dynamic_type): Call get_x86_64_dynamic_type.
>
> include/
>
> * elf/x86-64.h (DT_X86_64_PLT): New.
> (DT_X86_64_PLTSZ): Likewise.
> (DT_X86_64_PLTENT): Likewise.
>
> ld/
> * emulparams/elf32_x86_64.sh: Source x86-64-plt.sh.
> * emulparams/elf_x86_64.sh: Likewise.
> * emulparams/x86-64-plt.sh: New file.
> * testsuite/ld-x86-64/mark-plt-1.s: Likewise.
> * testsuite/ld-x86-64/mark-plt-1a-x32.d: Likewise.
> * testsuite/ld-x86-64/mark-plt-1a.d: Likewise.
> * testsuite/ld-x86-64/mark-plt-1b-x32.d: Likewise.
> * testsuite/ld-x86-64/mark-plt-1b.d: Likewise.
> * testsuite/ld-x86-64/mark-plt-1c-x32.d: Likewise.
> * testsuite/ld-x86-64/mark-plt-1c.d: Likewise.
> * testsuite/ld-x86-64/mark-plt-1d-x32.d: Likewise.
> * testsuite/ld-x86-64/mark-plt-1d.d: Likewise.
> * testsuite/ld-x86-64/x86-64.exp: Run -z mark-plt tests.
Don't you also want to add text to ld.texi? There it would also be made
clear what the default setting is ("off" aiui). A related question would
be whether it would make sense to allow configure time selection of the
default.
Jan
More information about the Binutils
mailing list