diff options
author | Tomoaki Kawada <kawada@kmckk.co.jp> | 2022-06-16 09:54:30 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2022-06-18 20:11:23 +0930 |
commit | fba1ac87dcb76e61f270d236f1e7c8aaec80f9c4 (patch) | |
tree | 4122da4e90d8f5897cec0d8719132794548883de /ld | |
parent | 3f52a09075e3c62f2150375bb7fca338e7db45e7 (diff) | |
download | gdb-fba1ac87dcb76e61f270d236f1e7c8aaec80f9c4.zip gdb-fba1ac87dcb76e61f270d236f1e7c8aaec80f9c4.tar.gz gdb-fba1ac87dcb76e61f270d236f1e7c8aaec80f9c4.tar.bz2 |
Fix the sorting algorithm for reloc entries
The optimized insertion sort algorithm in `elf_link_adjust_relocs`
incorrectly assembled "runs" from unsorted entries and inserted them to an
already-sorted prefix, breaking the loop invariants of insertion sort.
This commit updates the run assembly loop to break upon encountering a
non-monotonic change in the sort key.
PR 29259
bfd/
* elflink.c (elf_link_adjust_relocs): Ensure run being inserted
is sorted.
ld/
* testsuite/ld-elf/pr29259.d,
* testsuite/ld-elf/pr29259.s,
* testsuite/ld-elf/pr29259.t: New test.
Diffstat (limited to 'ld')
-rw-r--r-- | ld/testsuite/ld-elf/pr29259.d | 13 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr29259.s | 14 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr29259.t | 4 |
3 files changed, 31 insertions, 0 deletions
diff --git a/ld/testsuite/ld-elf/pr29259.d b/ld/testsuite/ld-elf/pr29259.d new file mode 100644 index 0000000..c7eaa7a --- /dev/null +++ b/ld/testsuite/ld-elf/pr29259.d @@ -0,0 +1,13 @@ +#ld: -r -T pr29259.t +#readelf: -Wr + +Relocation section .* + +Offset +Info +Type .* +0+00 .* +#... +0+20 .* +#... +0+40 .* +#... +0+60 .* +#pass diff --git a/ld/testsuite/ld-elf/pr29259.s b/ld/testsuite/ld-elf/pr29259.s new file mode 100644 index 0000000..65fc73f --- /dev/null +++ b/ld/testsuite/ld-elf/pr29259.s @@ -0,0 +1,14 @@ + .data +.L1: + .section ".data.1", "aw", %progbits + .p2align 5 + .dc.a .L1 + .section ".data.2", "aw", %progbits + .p2align 5 + .dc.a .L1 + .section ".data.3", "aw", %progbits + .p2align 5 + .dc.a .L1 + .section ".data.4", "aw", %progbits + .p2align 5 + .dc.a .L1 diff --git a/ld/testsuite/ld-elf/pr29259.t b/ld/testsuite/ld-elf/pr29259.t new file mode 100644 index 0000000..ed80f87 --- /dev/null +++ b/ld/testsuite/ld-elf/pr29259.t @@ -0,0 +1,4 @@ +SECTIONS +{ + .data : { *(.data.1) *(.data.4) *(.data.3) *(.data.2) *(.data) } +} |