[09/10] ld: Add simple DT_RELR tests

Message ID 20220107190631.309790-10-hjl.tools@gmail.com
State Superseded
Headers
Series ld: Implement DT_RELR for x86 |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent

Commit Message

H.J. Lu Jan. 7, 2022, 7:06 p.m. UTC
  * testsuite/ld-elf/dt-relr-1.s: New file.
	* testsuite/ld-elf/dt-relr-1a.d: Likewise.
	* testsuite/ld-elf/dt-relr-1b.d: Likewise.
	* testsuite/ld-elf/dt-relr-1c.d: Likewise.
	* testsuite/ld-elf/dt-relr-2.s: Likewise.
	* testsuite/ld-elf/dt-relr-2a.d: Likewise.
	* testsuite/ld-elf/dt-relr-2b.d: Likewise.
	* testsuite/ld-elf/dt-relr-2c.d: Likewise.
	* testsuite/ld-elf/dt-relr-2d.d: Likewise.
	* testsuite/ld-elf/dt-relr-2e.d: Likewise.
	* testsuite/ld-elf/dt-relr-2f.d: Likewise.
	* testsuite/ld-elf/dt-relr-2g.d: Likewise.
	* testsuite/ld-elf/dt-relr-2h.d: Likewise.
---
 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 |  9 +++++++++
 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 +++++++++
 13 files changed, 149 insertions(+)
 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
  

Comments

Fangrui Song Jan. 8, 2022, 2:39 a.m. UTC | #1
On 2022-01-07, H.J. Lu via Binutils wrote:
>	* testsuite/ld-elf/dt-relr-1.s: New file.
>	* testsuite/ld-elf/dt-relr-1a.d: Likewise.
>	* testsuite/ld-elf/dt-relr-1b.d: Likewise.
>	* testsuite/ld-elf/dt-relr-1c.d: Likewise.
>	* testsuite/ld-elf/dt-relr-2.s: Likewise.
>	* testsuite/ld-elf/dt-relr-2a.d: Likewise.
>	* testsuite/ld-elf/dt-relr-2b.d: Likewise.
>	* testsuite/ld-elf/dt-relr-2c.d: Likewise.
>	* testsuite/ld-elf/dt-relr-2d.d: Likewise.
>	* testsuite/ld-elf/dt-relr-2e.d: Likewise.
>	* testsuite/ld-elf/dt-relr-2f.d: Likewise.
>	* testsuite/ld-elf/dt-relr-2g.d: Likewise.
>	* testsuite/ld-elf/dt-relr-2h.d: Likewise.
>---
> 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 |  9 +++++++++
> 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 +++++++++
> 13 files changed, 149 insertions(+)
> 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
>
>diff --git a/ld/testsuite/ld-elf/dt-relr-1.s b/ld/testsuite/ld-elf/dt-relr-1.s
>new file mode 100644
>index 00000000000..18486d3acb2
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-1.s
>@@ -0,0 +1,13 @@
>+	.text
>+	.p2align 3
>+	.globl _start
>+_start:
>+	.byte 0
>+
>+	.data
>+	.p2align 3
>+	.globl data
>+data:
>+	.byte 0
>+	//  Offset is not a multiple of 2.  Don't use DT_RELR.
>+	.dc.a __ehdr_start + 10
>diff --git a/ld/testsuite/ld-elf/dt-relr-1a.d b/ld/testsuite/ld-elf/dt-relr-1a.d
>new file mode 100644
>index 00000000000..55c93cefb59
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-1a.d
>@@ -0,0 +1,10 @@
>+#source: dt-relr-1.s
>+#ld: -e _start $DT_RELR_LDFLAGS
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#...
>+There is no dynamic section in this file.
>+#...
>+There are no relocations in this file.
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-1b.d b/ld/testsuite/ld-elf/dt-relr-1b.d
>new file mode 100644
>index 00000000000..2b78f75d378
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-1b.d
>@@ -0,0 +1,9 @@
>+#source: dt-relr-1.s
>+#ld: -e _start -pie $DT_RELR_LDFLAGS
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#failif
>+#...
>+Relocation section '\.relr\.dyn' at offset .*

Worth testing "contains XX entries" and "YY offsets".

>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-1c.d b/ld/testsuite/ld-elf/dt-relr-1c.d
>new file mode 100644
>index 00000000000..14f6cda6832
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-1c.d
>@@ -0,0 +1,9 @@
>+#source: dt-relr-1.s
>+#ld: -shared $DT_RELR_LDFLAGS
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#failif
>+#...
>+Relocation section '\.relr\.dyn' at offset .*

Worth testing "contains XX entries" and "YY offsets".

>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-2.s b/ld/testsuite/ld-elf/dt-relr-2.s
>new file mode 100644
>index 00000000000..c3917ee8c3a
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2.s
>@@ -0,0 +1,20 @@
>+	.text
>+	.p2align 3
>+	.globl _start
>+_start:
>+	.byte 0
>+
>+	.data
>+	.p2align 3
>+	.globl data
>+data:
>+
>+	.dc.a .data
>+	.dc.a 0
>+	.dc.a data + 2
>+	.dc.a __ehdr_start + 4
>+	.dc.a __ehdr_start + 9
>+
>+	.byte 0
>+	//  Offset is not a multiple of 2.  Don't use DT_RELR.
>+	.dc.a __ehdr_start + 10
>diff --git a/ld/testsuite/ld-elf/dt-relr-2a.d b/ld/testsuite/ld-elf/dt-relr-2a.d
>new file mode 100644
>index 00000000000..31ef9e8e80e
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2a.d
>@@ -0,0 +1,10 @@
>+#source: dt-relr-2.s
>+#ld: -e _start $DT_RELR_LDFLAGS
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#...
>+There is no dynamic section in this file.
>+#...
>+There are no relocations in this file.
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-2b.d b/ld/testsuite/ld-elf/dt-relr-2b.d
>new file mode 100644
>index 00000000000..7c401732a56
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2b.d
>@@ -0,0 +1,17 @@
>+#source: dt-relr-2.s
>+#ld: -e _start -pie $DT_RELR_LDFLAGS
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#...
>+ 0x[0-9a-f]+ \(RELR\)    +0x[0-9a-f]+
>+ 0x[0-9a-f]+ \(RELRSZ\)  +(8|16) \(bytes\)
>+ 0x[0-9a-f]+ \(RELRENT\) +(4|8) \(bytes\)
>+#...
>+Relocation section '\.rel(a|)\.dyn' at offset 0x[0-9a-f]+ contains 1 entry:
>+#...
>+[0-9a-f]+ +[0-9a-f]+ +R_.*_RELATIVE .*
>+#...
>+Relocation section '\.relr\.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
>+  4 offsets
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-2c.d b/ld/testsuite/ld-elf/dt-relr-2c.d
>new file mode 100644
>index 00000000000..63877b2f90f
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2c.d
>@@ -0,0 +1,17 @@
>+#source: dt-relr-2.s
>+#ld: -shared $DT_RELR_LDFLAGS
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#...
>+ 0x[0-9a-f]+ \(RELR\)    +0x[0-9a-f]+
>+ 0x[0-9a-f]+ \(RELRSZ\)  +(8|16) \(bytes\)
>+ 0x[0-9a-f]+ \(RELRENT\) +(4|8) \(bytes\)
>+#...
>+Relocation section '\.rel(a|)\.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
>+#...
>+[0-9a-f]+ +[0-9a-f]+ +R_.*_RELATIVE .*
>+#...
>+Relocation section '\.relr\.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
>+  3 offsets
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-2d.d b/ld/testsuite/ld-elf/dt-relr-2d.d
>new file mode 100644
>index 00000000000..270a901f1a6
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2d.d
>@@ -0,0 +1,9 @@
>+#source: dt-relr-2.s
>+#ld: -e _start -pie $DT_RELR_LDFLAGS --no-relax
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#failif
>+#...
>+Relocation section '\.relr\.dyn' at offset .*
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-2e.d b/ld/testsuite/ld-elf/dt-relr-2e.d
>new file mode 100644
>index 00000000000..79ea62b096a
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2e.d
>@@ -0,0 +1,9 @@
>+#source: dt-relr-2.s
>+#ld: -e _start -pie $DT_RELR_LDFLAGS -z nocombreloc
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#failif
>+#...
>+Relocation section '\.relr\.dyn' at offset .*
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-2f.d b/ld/testsuite/ld-elf/dt-relr-2f.d
>new file mode 100644
>index 00000000000..4ad592f71fb
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2f.d
>@@ -0,0 +1,8 @@
>+#source: dt-relr-2.s
>+#ld: -r $DT_RELR_LDFLAGS
>+#readelf: -rW
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#...
>+Relocation section '\.rel(a|)\.data' at offset 0x[0-9a-f]+ contains 5 entries:
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-2g.d b/ld/testsuite/ld-elf/dt-relr-2g.d
>new file mode 100644
>index 00000000000..78e370068af
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2g.d
>@@ -0,0 +1,9 @@
>+#source: dt-relr-2.s
>+#ld: -e _start -pie $NO_DT_RELR_LDFLAGS
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#failif
>+#...
>+Relocation section '\.relr\.dyn' at offset .*
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-2h.d b/ld/testsuite/ld-elf/dt-relr-2h.d
>new file mode 100644
>index 00000000000..312373fb179
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2h.d
>@@ -0,0 +1,9 @@
>+#source: dt-relr-2.s
>+#ld: -e _start -shared $NO_DT_RELR_LDFLAGS
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#failif
>+#...
>+Relocation section '\.relr\.dyn' at offset .*
>+#pass
>-- 
>2.33.1
>
  
H.J. Lu Jan. 8, 2022, 2:44 a.m. UTC | #2
On Fri, Jan 7, 2022 at 6:39 PM Fangrui Song <i@maskray.me> wrote:
>
> On 2022-01-07, H.J. Lu via Binutils wrote:
> >       * testsuite/ld-elf/dt-relr-1.s: New file.
> >       * testsuite/ld-elf/dt-relr-1a.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-1b.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-1c.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-2.s: Likewise.
> >       * testsuite/ld-elf/dt-relr-2a.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-2b.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-2c.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-2d.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-2e.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-2f.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-2g.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-2h.d: Likewise.
> >---
> > 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 |  9 +++++++++
> > 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 +++++++++
> > 13 files changed, 149 insertions(+)
> > 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
> >
> >diff --git a/ld/testsuite/ld-elf/dt-relr-1.s b/ld/testsuite/ld-elf/dt-relr-1.s
> >new file mode 100644
> >index 00000000000..18486d3acb2
> >--- /dev/null
> >+++ b/ld/testsuite/ld-elf/dt-relr-1.s
> >@@ -0,0 +1,13 @@
> >+      .text
> >+      .p2align 3
> >+      .globl _start
> >+_start:
> >+      .byte 0
> >+
> >+      .data
> >+      .p2align 3
> >+      .globl data
> >+data:
> >+      .byte 0
> >+      //  Offset is not a multiple of 2.  Don't use DT_RELR.
> >+      .dc.a __ehdr_start + 10
> >diff --git a/ld/testsuite/ld-elf/dt-relr-1a.d b/ld/testsuite/ld-elf/dt-relr-1a.d
> >new file mode 100644
> >index 00000000000..55c93cefb59
> >--- /dev/null
> >+++ b/ld/testsuite/ld-elf/dt-relr-1a.d
> >@@ -0,0 +1,10 @@
> >+#source: dt-relr-1.s
> >+#ld: -e _start $DT_RELR_LDFLAGS
> >+#readelf: -rW -d
> >+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
> >+
> >+#...
> >+There is no dynamic section in this file.
> >+#...
> >+There are no relocations in this file.
> >+#pass
> >diff --git a/ld/testsuite/ld-elf/dt-relr-1b.d b/ld/testsuite/ld-elf/dt-relr-1b.d
> >new file mode 100644
> >index 00000000000..2b78f75d378
> >--- /dev/null
> >+++ b/ld/testsuite/ld-elf/dt-relr-1b.d
> >@@ -0,0 +1,9 @@
> >+#source: dt-relr-1.s
> >+#ld: -e _start -pie $DT_RELR_LDFLAGS
> >+#readelf: -rW -d
> >+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
> >+
> >+#failif
> >+#...
> >+Relocation section '\.relr\.dyn' at offset .*
>
> Worth testing "contains XX entries" and "YY offsets".
>
> >+#pass
> >diff --git a/ld/testsuite/ld-elf/dt-relr-1c.d b/ld/testsuite/ld-elf/dt-relr-1c.d
> >new file mode 100644
> >index 00000000000..14f6cda6832
> >--- /dev/null
> >+++ b/ld/testsuite/ld-elf/dt-relr-1c.d
> >@@ -0,0 +1,9 @@
> >+#source: dt-relr-1.s
> >+#ld: -shared $DT_RELR_LDFLAGS
> >+#readelf: -rW -d
> >+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
> >+
> >+#failif
> >+#...
> >+Relocation section '\.relr\.dyn' at offset .*
>
> Worth testing "contains XX entries" and "YY offsets".

These tests fail if there is a .relr.dyn section.  There is no
need to check more.

> >+#pass
> >diff --git a/ld/testsuite/ld-elf/dt-relr-2.s b/ld/testsuite/ld-elf/dt-relr-2.s
> >new file mode 100644
> >index 00000000000..c3917ee8c3a
> >--- /dev/null
> >+++ b/ld/testsuite/ld-elf/dt-relr-2.s
> >@@ -0,0 +1,20 @@
> >+      .text
> >+      .p2align 3
> >+      .globl _start
> >+_start:
> >+      .byte 0
> >+
> >+      .data
> >+      .p2align 3
> >+      .globl data
> >+data:
> >+
> >+      .dc.a .data
> >+      .dc.a 0
> >+      .dc.a data + 2
> >+      .dc.a __ehdr_start + 4
> >+      .dc.a __ehdr_start + 9
> >+
> >+      .byte 0
> >+      //  Offset is not a multiple of 2.  Don't use DT_RELR.
> >+      .dc.a __ehdr_start + 10
> >diff --git a/ld/testsuite/ld-elf/dt-relr-2a.d b/ld/testsuite/ld-elf/dt-relr-2a.d
> >new file mode 100644
> >index 00000000000..31ef9e8e80e
> >--- /dev/null
> >+++ b/ld/testsuite/ld-elf/dt-relr-2a.d
> >@@ -0,0 +1,10 @@
> >+#source: dt-relr-2.s
> >+#ld: -e _start $DT_RELR_LDFLAGS
> >+#readelf: -rW -d
> >+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
> >+
> >+#...
> >+There is no dynamic section in this file.
> >+#...
> >+There are no relocations in this file.
> >+#pass
> >diff --git a/ld/testsuite/ld-elf/dt-relr-2b.d b/ld/testsuite/ld-elf/dt-relr-2b.d
> >new file mode 100644
> >index 00000000000..7c401732a56
> >--- /dev/null
> >+++ b/ld/testsuite/ld-elf/dt-relr-2b.d
> >@@ -0,0 +1,17 @@
> >+#source: dt-relr-2.s
> >+#ld: -e _start -pie $DT_RELR_LDFLAGS
> >+#readelf: -rW -d
> >+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
> >+
> >+#...
> >+ 0x[0-9a-f]+ \(RELR\)    +0x[0-9a-f]+
> >+ 0x[0-9a-f]+ \(RELRSZ\)  +(8|16) \(bytes\)
> >+ 0x[0-9a-f]+ \(RELRENT\) +(4|8) \(bytes\)
> >+#...
> >+Relocation section '\.rel(a|)\.dyn' at offset 0x[0-9a-f]+ contains 1 entry:
> >+#...
> >+[0-9a-f]+ +[0-9a-f]+ +R_.*_RELATIVE .*
> >+#...
> >+Relocation section '\.relr\.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
> >+  4 offsets
> >+#pass
> >diff --git a/ld/testsuite/ld-elf/dt-relr-2c.d b/ld/testsuite/ld-elf/dt-relr-2c.d
> >new file mode 100644
> >index 00000000000..63877b2f90f
> >--- /dev/null
> >+++ b/ld/testsuite/ld-elf/dt-relr-2c.d
> >@@ -0,0 +1,17 @@
> >+#source: dt-relr-2.s
> >+#ld: -shared $DT_RELR_LDFLAGS
> >+#readelf: -rW -d
> >+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
> >+
> >+#...
> >+ 0x[0-9a-f]+ \(RELR\)    +0x[0-9a-f]+
> >+ 0x[0-9a-f]+ \(RELRSZ\)  +(8|16) \(bytes\)
> >+ 0x[0-9a-f]+ \(RELRENT\) +(4|8) \(bytes\)
> >+#...
> >+Relocation section '\.rel(a|)\.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
> >+#...
> >+[0-9a-f]+ +[0-9a-f]+ +R_.*_RELATIVE .*
> >+#...
> >+Relocation section '\.relr\.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
> >+  3 offsets
> >+#pass
> >diff --git a/ld/testsuite/ld-elf/dt-relr-2d.d b/ld/testsuite/ld-elf/dt-relr-2d.d
> >new file mode 100644
> >index 00000000000..270a901f1a6
> >--- /dev/null
> >+++ b/ld/testsuite/ld-elf/dt-relr-2d.d
> >@@ -0,0 +1,9 @@
> >+#source: dt-relr-2.s
> >+#ld: -e _start -pie $DT_RELR_LDFLAGS --no-relax
> >+#readelf: -rW -d
> >+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
> >+
> >+#failif
> >+#...
> >+Relocation section '\.relr\.dyn' at offset .*
> >+#pass
> >diff --git a/ld/testsuite/ld-elf/dt-relr-2e.d b/ld/testsuite/ld-elf/dt-relr-2e.d
> >new file mode 100644
> >index 00000000000..79ea62b096a
> >--- /dev/null
> >+++ b/ld/testsuite/ld-elf/dt-relr-2e.d
> >@@ -0,0 +1,9 @@
> >+#source: dt-relr-2.s
> >+#ld: -e _start -pie $DT_RELR_LDFLAGS -z nocombreloc
> >+#readelf: -rW -d
> >+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
> >+
> >+#failif
> >+#...
> >+Relocation section '\.relr\.dyn' at offset .*
> >+#pass
> >diff --git a/ld/testsuite/ld-elf/dt-relr-2f.d b/ld/testsuite/ld-elf/dt-relr-2f.d
> >new file mode 100644
> >index 00000000000..4ad592f71fb
> >--- /dev/null
> >+++ b/ld/testsuite/ld-elf/dt-relr-2f.d
> >@@ -0,0 +1,8 @@
> >+#source: dt-relr-2.s
> >+#ld: -r $DT_RELR_LDFLAGS
> >+#readelf: -rW
> >+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
> >+
> >+#...
> >+Relocation section '\.rel(a|)\.data' at offset 0x[0-9a-f]+ contains 5 entries:
> >+#pass
> >diff --git a/ld/testsuite/ld-elf/dt-relr-2g.d b/ld/testsuite/ld-elf/dt-relr-2g.d
> >new file mode 100644
> >index 00000000000..78e370068af
> >--- /dev/null
> >+++ b/ld/testsuite/ld-elf/dt-relr-2g.d
> >@@ -0,0 +1,9 @@
> >+#source: dt-relr-2.s
> >+#ld: -e _start -pie $NO_DT_RELR_LDFLAGS
> >+#readelf: -rW -d
> >+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
> >+
> >+#failif
> >+#...
> >+Relocation section '\.relr\.dyn' at offset .*
> >+#pass
> >diff --git a/ld/testsuite/ld-elf/dt-relr-2h.d b/ld/testsuite/ld-elf/dt-relr-2h.d
> >new file mode 100644
> >index 00000000000..312373fb179
> >--- /dev/null
> >+++ b/ld/testsuite/ld-elf/dt-relr-2h.d
> >@@ -0,0 +1,9 @@
> >+#source: dt-relr-2.s
> >+#ld: -e _start -shared $NO_DT_RELR_LDFLAGS
> >+#readelf: -rW -d
> >+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
> >+
> >+#failif
> >+#...
> >+Relocation section '\.relr\.dyn' at offset .*
> >+#pass
> >--
> >2.33.1
> >
  
Fangrui Song Jan. 8, 2022, 8:37 a.m. UTC | #3
On 2022-01-07, H.J. Lu via Binutils wrote:
>	* testsuite/ld-elf/dt-relr-1.s: New file.
>	* testsuite/ld-elf/dt-relr-1a.d: Likewise.
>	* testsuite/ld-elf/dt-relr-1b.d: Likewise.
>	* testsuite/ld-elf/dt-relr-1c.d: Likewise.
>	* testsuite/ld-elf/dt-relr-2.s: Likewise.
>	* testsuite/ld-elf/dt-relr-2a.d: Likewise.
>	* testsuite/ld-elf/dt-relr-2b.d: Likewise.
>	* testsuite/ld-elf/dt-relr-2c.d: Likewise.
>	* testsuite/ld-elf/dt-relr-2d.d: Likewise.
>	* testsuite/ld-elf/dt-relr-2e.d: Likewise.
>	* testsuite/ld-elf/dt-relr-2f.d: Likewise.
>	* testsuite/ld-elf/dt-relr-2g.d: Likewise.
>	* testsuite/ld-elf/dt-relr-2h.d: Likewise.
>---
> 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 |  9 +++++++++
> 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 +++++++++
> 13 files changed, 149 insertions(+)
> 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
>
>diff --git a/ld/testsuite/ld-elf/dt-relr-1.s b/ld/testsuite/ld-elf/dt-relr-1.s
>new file mode 100644
>index 00000000000..18486d3acb2
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-1.s
>@@ -0,0 +1,13 @@
>+	.text
>+	.p2align 3
>+	.globl _start
>+_start:
>+	.byte 0
>+
>+	.data
>+	.p2align 3
>+	.globl data
>+data:
>+	.byte 0
>+	//  Offset is not a multiple of 2.  Don't use DT_RELR.
>+	.dc.a __ehdr_start + 10

.data
.balign 1
.dc.a .data

may be worth adding as a test.

Currently R_X86_64_RELATIVE is used even if its r_offset is even.
There is conservative but safe as it's difficult to ensure an input
section's address is even when its alignment is 1.

>diff --git a/ld/testsuite/ld-elf/dt-relr-1a.d b/ld/testsuite/ld-elf/dt-relr-1a.d
>new file mode 100644
>index 00000000000..55c93cefb59
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-1a.d
>@@ -0,0 +1,10 @@
>+#source: dt-relr-1.s
>+#ld: -e _start $DT_RELR_LDFLAGS
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#...
>+There is no dynamic section in this file.
>+#...
>+There are no relocations in this file.
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-1b.d b/ld/testsuite/ld-elf/dt-relr-1b.d
>new file mode 100644
>index 00000000000..2b78f75d378
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-1b.d
>@@ -0,0 +1,9 @@
>+#source: dt-relr-1.s
>+#ld: -e _start -pie $DT_RELR_LDFLAGS
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#failif
>+#...
>+Relocation section '\.relr\.dyn' at offset .*
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-1c.d b/ld/testsuite/ld-elf/dt-relr-1c.d
>new file mode 100644
>index 00000000000..14f6cda6832
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-1c.d
>@@ -0,0 +1,9 @@
>+#source: dt-relr-1.s
>+#ld: -shared $DT_RELR_LDFLAGS
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#failif
>+#...
>+Relocation section '\.relr\.dyn' at offset .*
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-2.s b/ld/testsuite/ld-elf/dt-relr-2.s
>new file mode 100644
>index 00000000000..c3917ee8c3a
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2.s
>@@ -0,0 +1,20 @@
>+	.text
>+	.p2align 3
>+	.globl _start
>+_start:
>+	.byte 0
>+
>+	.data
>+	.p2align 3
>+	.globl data
>+data:
>+
>+	.dc.a .data
>+	.dc.a 0
>+	.dc.a data + 2
>+	.dc.a __ehdr_start + 4
>+	.dc.a __ehdr_start + 9
>+
>+	.byte 0
>+	//  Offset is not a multiple of 2.  Don't use DT_RELR.
>+	.dc.a __ehdr_start + 10
>diff --git a/ld/testsuite/ld-elf/dt-relr-2a.d b/ld/testsuite/ld-elf/dt-relr-2a.d
>new file mode 100644
>index 00000000000..31ef9e8e80e
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2a.d
>@@ -0,0 +1,10 @@
>+#source: dt-relr-2.s
>+#ld: -e _start $DT_RELR_LDFLAGS
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#...
>+There is no dynamic section in this file.
>+#...
>+There are no relocations in this file.
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-2b.d b/ld/testsuite/ld-elf/dt-relr-2b.d
>new file mode 100644
>index 00000000000..7c401732a56
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2b.d
>@@ -0,0 +1,17 @@
>+#source: dt-relr-2.s
>+#ld: -e _start -pie $DT_RELR_LDFLAGS
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#...
>+ 0x[0-9a-f]+ \(RELR\)    +0x[0-9a-f]+
>+ 0x[0-9a-f]+ \(RELRSZ\)  +(8|16) \(bytes\)
>+ 0x[0-9a-f]+ \(RELRENT\) +(4|8) \(bytes\)
>+#...
>+Relocation section '\.rel(a|)\.dyn' at offset 0x[0-9a-f]+ contains 1 entry:
>+#...
>+[0-9a-f]+ +[0-9a-f]+ +R_.*_RELATIVE .*
>+#...
>+Relocation section '\.relr\.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
>+  4 offsets
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-2c.d b/ld/testsuite/ld-elf/dt-relr-2c.d
>new file mode 100644
>index 00000000000..63877b2f90f
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2c.d
>@@ -0,0 +1,17 @@
>+#source: dt-relr-2.s
>+#ld: -shared $DT_RELR_LDFLAGS
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#...
>+ 0x[0-9a-f]+ \(RELR\)    +0x[0-9a-f]+
>+ 0x[0-9a-f]+ \(RELRSZ\)  +(8|16) \(bytes\)
>+ 0x[0-9a-f]+ \(RELRENT\) +(4|8) \(bytes\)
>+#...
>+Relocation section '\.rel(a|)\.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
>+#...
>+[0-9a-f]+ +[0-9a-f]+ +R_.*_RELATIVE .*
>+#...
>+Relocation section '\.relr\.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
>+  3 offsets
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-2d.d b/ld/testsuite/ld-elf/dt-relr-2d.d
>new file mode 100644
>index 00000000000..270a901f1a6
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2d.d
>@@ -0,0 +1,9 @@
>+#source: dt-relr-2.s
>+#ld: -e _start -pie $DT_RELR_LDFLAGS --no-relax
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#failif
>+#...
>+Relocation section '\.relr\.dyn' at offset .*
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-2e.d b/ld/testsuite/ld-elf/dt-relr-2e.d
>new file mode 100644
>index 00000000000..79ea62b096a
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2e.d
>@@ -0,0 +1,9 @@
>+#source: dt-relr-2.s
>+#ld: -e _start -pie $DT_RELR_LDFLAGS -z nocombreloc
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#failif
>+#...
>+Relocation section '\.relr\.dyn' at offset .*
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-2f.d b/ld/testsuite/ld-elf/dt-relr-2f.d
>new file mode 100644
>index 00000000000..4ad592f71fb
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2f.d
>@@ -0,0 +1,8 @@
>+#source: dt-relr-2.s
>+#ld: -r $DT_RELR_LDFLAGS
>+#readelf: -rW
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#...
>+Relocation section '\.rel(a|)\.data' at offset 0x[0-9a-f]+ contains 5 entries:
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-2g.d b/ld/testsuite/ld-elf/dt-relr-2g.d
>new file mode 100644
>index 00000000000..78e370068af
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2g.d
>@@ -0,0 +1,9 @@
>+#source: dt-relr-2.s
>+#ld: -e _start -pie $NO_DT_RELR_LDFLAGS
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#failif
>+#...
>+Relocation section '\.relr\.dyn' at offset .*
>+#pass
>diff --git a/ld/testsuite/ld-elf/dt-relr-2h.d b/ld/testsuite/ld-elf/dt-relr-2h.d
>new file mode 100644
>index 00000000000..312373fb179
>--- /dev/null
>+++ b/ld/testsuite/ld-elf/dt-relr-2h.d
>@@ -0,0 +1,9 @@
>+#source: dt-relr-2.s
>+#ld: -e _start -shared $NO_DT_RELR_LDFLAGS
>+#readelf: -rW -d
>+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
>+
>+#failif
>+#...
>+Relocation section '\.relr\.dyn' at offset .*
>+#pass
>-- 
>2.33.1
>
  
H.J. Lu Jan. 8, 2022, 6:33 p.m. UTC | #4
On Sat, Jan 8, 2022 at 12:37 AM Fangrui Song <i@maskray.me> wrote:
>
> On 2022-01-07, H.J. Lu via Binutils wrote:
> >       * testsuite/ld-elf/dt-relr-1.s: New file.
> >       * testsuite/ld-elf/dt-relr-1a.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-1b.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-1c.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-2.s: Likewise.
> >       * testsuite/ld-elf/dt-relr-2a.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-2b.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-2c.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-2d.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-2e.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-2f.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-2g.d: Likewise.
> >       * testsuite/ld-elf/dt-relr-2h.d: Likewise.
> >---
> > 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 |  9 +++++++++
> > 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 +++++++++
> > 13 files changed, 149 insertions(+)
> > 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
> >
> >diff --git a/ld/testsuite/ld-elf/dt-relr-1.s b/ld/testsuite/ld-elf/dt-relr-1.s
> >new file mode 100644
> >index 00000000000..18486d3acb2
> >--- /dev/null
> >+++ b/ld/testsuite/ld-elf/dt-relr-1.s
> >@@ -0,0 +1,13 @@
> >+      .text
> >+      .p2align 3
> >+      .globl _start
> >+_start:
> >+      .byte 0
> >+
> >+      .data
> >+      .p2align 3
> >+      .globl data
> >+data:
> >+      .byte 0
> >+      //  Offset is not a multiple of 2.  Don't use DT_RELR.
> >+      .dc.a __ehdr_start + 10
>
> .data
> .balign 1
> .dc.a .data
>
> may be worth adding as a test.
>
> Currently R_X86_64_RELATIVE is used even if its r_offset is even.
> There is conservative but safe as it's difficult to ensure an input
> section's address is even when its alignment is 1.
>

Added to the v2 patch.
  

Patch

diff --git a/ld/testsuite/ld-elf/dt-relr-1.s b/ld/testsuite/ld-elf/dt-relr-1.s
new file mode 100644
index 00000000000..18486d3acb2
--- /dev/null
+++ b/ld/testsuite/ld-elf/dt-relr-1.s
@@ -0,0 +1,13 @@ 
+	.text
+	.p2align 3
+	.globl _start
+_start:
+	.byte 0
+
+	.data
+	.p2align 3
+	.globl data
+data:
+	.byte 0
+	//  Offset is not a multiple of 2.  Don't use DT_RELR.
+	.dc.a __ehdr_start + 10
diff --git a/ld/testsuite/ld-elf/dt-relr-1a.d b/ld/testsuite/ld-elf/dt-relr-1a.d
new file mode 100644
index 00000000000..55c93cefb59
--- /dev/null
+++ b/ld/testsuite/ld-elf/dt-relr-1a.d
@@ -0,0 +1,10 @@ 
+#source: dt-relr-1.s
+#ld: -e _start $DT_RELR_LDFLAGS
+#readelf: -rW -d
+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
+
+#...
+There is no dynamic section in this file.
+#...
+There are no relocations in this file.
+#pass
diff --git a/ld/testsuite/ld-elf/dt-relr-1b.d b/ld/testsuite/ld-elf/dt-relr-1b.d
new file mode 100644
index 00000000000..2b78f75d378
--- /dev/null
+++ b/ld/testsuite/ld-elf/dt-relr-1b.d
@@ -0,0 +1,9 @@ 
+#source: dt-relr-1.s
+#ld: -e _start -pie $DT_RELR_LDFLAGS
+#readelf: -rW -d
+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
+
+#failif
+#...
+Relocation section '\.relr\.dyn' at offset .*
+#pass
diff --git a/ld/testsuite/ld-elf/dt-relr-1c.d b/ld/testsuite/ld-elf/dt-relr-1c.d
new file mode 100644
index 00000000000..14f6cda6832
--- /dev/null
+++ b/ld/testsuite/ld-elf/dt-relr-1c.d
@@ -0,0 +1,9 @@ 
+#source: dt-relr-1.s
+#ld: -shared $DT_RELR_LDFLAGS
+#readelf: -rW -d
+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
+
+#failif
+#...
+Relocation section '\.relr\.dyn' at offset .*
+#pass
diff --git a/ld/testsuite/ld-elf/dt-relr-2.s b/ld/testsuite/ld-elf/dt-relr-2.s
new file mode 100644
index 00000000000..c3917ee8c3a
--- /dev/null
+++ b/ld/testsuite/ld-elf/dt-relr-2.s
@@ -0,0 +1,20 @@ 
+	.text
+	.p2align 3
+	.globl _start
+_start:
+	.byte 0
+
+	.data
+	.p2align 3
+	.globl data
+data:
+
+	.dc.a .data
+	.dc.a 0
+	.dc.a data + 2
+	.dc.a __ehdr_start + 4
+	.dc.a __ehdr_start + 9
+
+	.byte 0
+	//  Offset is not a multiple of 2.  Don't use DT_RELR.
+	.dc.a __ehdr_start + 10
diff --git a/ld/testsuite/ld-elf/dt-relr-2a.d b/ld/testsuite/ld-elf/dt-relr-2a.d
new file mode 100644
index 00000000000..31ef9e8e80e
--- /dev/null
+++ b/ld/testsuite/ld-elf/dt-relr-2a.d
@@ -0,0 +1,10 @@ 
+#source: dt-relr-2.s
+#ld: -e _start $DT_RELR_LDFLAGS
+#readelf: -rW -d
+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
+
+#...
+There is no dynamic section in this file.
+#...
+There are no relocations in this file.
+#pass
diff --git a/ld/testsuite/ld-elf/dt-relr-2b.d b/ld/testsuite/ld-elf/dt-relr-2b.d
new file mode 100644
index 00000000000..7c401732a56
--- /dev/null
+++ b/ld/testsuite/ld-elf/dt-relr-2b.d
@@ -0,0 +1,17 @@ 
+#source: dt-relr-2.s
+#ld: -e _start -pie $DT_RELR_LDFLAGS
+#readelf: -rW -d
+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
+
+#...
+ 0x[0-9a-f]+ \(RELR\)    +0x[0-9a-f]+
+ 0x[0-9a-f]+ \(RELRSZ\)  +(8|16) \(bytes\)
+ 0x[0-9a-f]+ \(RELRENT\) +(4|8) \(bytes\)
+#...
+Relocation section '\.rel(a|)\.dyn' at offset 0x[0-9a-f]+ contains 1 entry:
+#...
+[0-9a-f]+ +[0-9a-f]+ +R_.*_RELATIVE .*
+#...
+Relocation section '\.relr\.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
+  4 offsets
+#pass
diff --git a/ld/testsuite/ld-elf/dt-relr-2c.d b/ld/testsuite/ld-elf/dt-relr-2c.d
new file mode 100644
index 00000000000..63877b2f90f
--- /dev/null
+++ b/ld/testsuite/ld-elf/dt-relr-2c.d
@@ -0,0 +1,17 @@ 
+#source: dt-relr-2.s
+#ld: -shared $DT_RELR_LDFLAGS
+#readelf: -rW -d
+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
+
+#...
+ 0x[0-9a-f]+ \(RELR\)    +0x[0-9a-f]+
+ 0x[0-9a-f]+ \(RELRSZ\)  +(8|16) \(bytes\)
+ 0x[0-9a-f]+ \(RELRENT\) +(4|8) \(bytes\)
+#...
+Relocation section '\.rel(a|)\.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
+#...
+[0-9a-f]+ +[0-9a-f]+ +R_.*_RELATIVE .*
+#...
+Relocation section '\.relr\.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
+  3 offsets
+#pass
diff --git a/ld/testsuite/ld-elf/dt-relr-2d.d b/ld/testsuite/ld-elf/dt-relr-2d.d
new file mode 100644
index 00000000000..270a901f1a6
--- /dev/null
+++ b/ld/testsuite/ld-elf/dt-relr-2d.d
@@ -0,0 +1,9 @@ 
+#source: dt-relr-2.s
+#ld: -e _start -pie $DT_RELR_LDFLAGS --no-relax
+#readelf: -rW -d
+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
+
+#failif
+#...
+Relocation section '\.relr\.dyn' at offset .*
+#pass
diff --git a/ld/testsuite/ld-elf/dt-relr-2e.d b/ld/testsuite/ld-elf/dt-relr-2e.d
new file mode 100644
index 00000000000..79ea62b096a
--- /dev/null
+++ b/ld/testsuite/ld-elf/dt-relr-2e.d
@@ -0,0 +1,9 @@ 
+#source: dt-relr-2.s
+#ld: -e _start -pie $DT_RELR_LDFLAGS -z nocombreloc
+#readelf: -rW -d
+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
+
+#failif
+#...
+Relocation section '\.relr\.dyn' at offset .*
+#pass
diff --git a/ld/testsuite/ld-elf/dt-relr-2f.d b/ld/testsuite/ld-elf/dt-relr-2f.d
new file mode 100644
index 00000000000..4ad592f71fb
--- /dev/null
+++ b/ld/testsuite/ld-elf/dt-relr-2f.d
@@ -0,0 +1,8 @@ 
+#source: dt-relr-2.s
+#ld: -r $DT_RELR_LDFLAGS
+#readelf: -rW
+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
+
+#...
+Relocation section '\.rel(a|)\.data' at offset 0x[0-9a-f]+ contains 5 entries:
+#pass
diff --git a/ld/testsuite/ld-elf/dt-relr-2g.d b/ld/testsuite/ld-elf/dt-relr-2g.d
new file mode 100644
index 00000000000..78e370068af
--- /dev/null
+++ b/ld/testsuite/ld-elf/dt-relr-2g.d
@@ -0,0 +1,9 @@ 
+#source: dt-relr-2.s
+#ld: -e _start -pie $NO_DT_RELR_LDFLAGS
+#readelf: -rW -d
+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
+
+#failif
+#...
+Relocation section '\.relr\.dyn' at offset .*
+#pass
diff --git a/ld/testsuite/ld-elf/dt-relr-2h.d b/ld/testsuite/ld-elf/dt-relr-2h.d
new file mode 100644
index 00000000000..312373fb179
--- /dev/null
+++ b/ld/testsuite/ld-elf/dt-relr-2h.d
@@ -0,0 +1,9 @@ 
+#source: dt-relr-2.s
+#ld: -e _start -shared $NO_DT_RELR_LDFLAGS
+#readelf: -rW -d
+#target: x86_64-*-linux* i?86-*-linux-gnu i?86-*-gnu*
+
+#failif
+#...
+Relocation section '\.relr\.dyn' at offset .*
+#pass