ld/x86: Add -z report-relative-reloc
authorH.J. Lu <hjl.tools@gmail.com>
Sat, 16 Jan 2021 02:06:48 +0000 (18:06 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Sat, 16 Jan 2021 02:07:07 +0000 (18:07 -0800)
commit68b007788a6cc5376708af42bc220f540e8c4b8a
treeea89e2a6a9e242932f93752ba6df8c19a15caf79
parentad92f33d386e050304bf5986f28071ede9dd2284
ld/x86: Add -z report-relative-reloc

Linker generated relative relocations don't have symbol info:

[hjl@gnu-cfl-2 tmpdir]$ readelf -rW dump

Relocation section '.rela.dyn' at offset 0x180 contains 2 entries:
 Offset     Info    Type                Sym. Value  Symbol's Name + Addend
00002f70  00000008 R_X86_64_RELATIVE                 1000
00002f68  00000025 R_X86_64_IRELATIVE                1007
[hjl@gnu-cfl-2 tmpdir]$

Add -z report-relative-reloc to x86 ELF linker to report dynamic relative
relocations:

[hjl@gnu-cfl-2 tmpdir]$ ../ld-new -pie -melf32_x86_64 -z report-relative-reloc -o dump report-reloc-1.o
dump: R_X86_64_IRELATIVE (offset: 0x00002f68, info: 0x00000025, addend: 0x00001007) against 'ifunc' for section '.data.rel.ro.local' in report-reloc-1.o
dump: R_X86_64_RELATIVE (offset: 0x00002f70, info: 0x00000008, addend: 0x00001000) against '_start' for section '.data.rel.ro.local' in report-reloc-1.o
[hjl@gnu-cfl-2 tmpdir]$

It can be used to map relative relocations to corresponding symbols.

bfd/

* elf-linker-x86.h (elf_linker_x86_params): Add
report_relative_reloc.
* elf32-i386.c (elf_i386_relocate_section): Call
_bfd_x86_elf_link_report_relative_reloc to report relative
relocations for -z report-relative-reloc.
(elf_i386_finish_dynamic_symbol): Likewse.
* elf64-x86-64.c (elf_x86_64_relocate_section): Likewse.
(elf_x86_64_finish_dynamic_symbol): Likewse.
* elfxx-x86.c (_bfd_x86_elf_link_report_relative_reloc): New
function.
* elfxx-x86.h (_bfd_x86_elf_link_report_relative_reloc): New
prototype.

ld/

* NEWS: Mention -z report-relative-reloc.
* ld.texi: Document -z report-relative-reloc.
* emulparams/elf32_x86_64.sh: Source x86-report-relative.sh.
* emulparams/elf_i386.sh: Likewse.
* emulparams/elf_x86_64.sh: Likewse.
* emulparams/x86-report-relative.sh: New file.
* testsuite/ld-i386/report-reloc-1.d: Likewse.
* testsuite/ld-i386/report-reloc-1.l: Likewse.
* testsuite/ld-i386/report-reloc-1.s: Likewse.
* testsuite/ld-x86-64/report-reloc-1-x32.d: Likewse.
* testsuite/ld-x86-64/report-reloc-1.d: Likewse.
* testsuite/ld-x86-64/report-reloc-1.l: Likewse.
* testsuite/ld-x86-64/report-reloc-1.s: Likewse.
* testsuite/ld-i386/i386.exp: Run report-reloc-1.
* testsuite/ld-x86-64/x86-64.exp: Run report-reloc-1 and
report-reloc-1-x32.
22 files changed:
bfd/ChangeLog
bfd/elf-linker-x86.h
bfd/elf32-i386.c
bfd/elf64-x86-64.c
bfd/elfxx-x86.c
bfd/elfxx-x86.h
ld/ChangeLog
ld/NEWS
ld/emulparams/elf32_x86_64.sh
ld/emulparams/elf_i386.sh
ld/emulparams/elf_x86_64.sh
ld/emulparams/x86-report-relative.sh [new file with mode: 0644]
ld/ld.texi
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/report-reloc-1.d [new file with mode: 0644]
ld/testsuite/ld-i386/report-reloc-1.l [new file with mode: 0644]
ld/testsuite/ld-i386/report-reloc-1.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/report-reloc-1-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/report-reloc-1.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/report-reloc-1.l [new file with mode: 0644]
ld/testsuite/ld-x86-64/report-reloc-1.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp