From 08dec09d8a26c115921b17110da1e07cb233c494 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 14 Oct 2019 13:55:32 +1030 Subject: [PATCH] qsort: pe-dll.c reloc sorting * pe-dll.c (reloc_data_type): Add idx field. (reloc_sort): Perform final sort by idx. (generate_reloc): Set idx. --- ld/ChangeLog | 6 ++++++ ld/pe-dll.c | 16 +++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 06c7cf761ea..19ed0b5f21c 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2019-10-14 Alan Modra + + * pe-dll.c (reloc_data_type): Add idx field. + (reloc_sort): Perform final sort by idx. + (generate_reloc): Set idx. + 2019-10-13 Nick Clifton * NEWS: Delete superflous "Changes in 2.33" comment. diff --git a/ld/pe-dll.c b/ld/pe-dll.c index 6daf984b0f7..4679fca6d52 100644 --- a/ld/pe-dll.c +++ b/ld/pe-dll.c @@ -445,16 +445,25 @@ typedef struct bfd_vma vma; char type; short extra; + int idx; } reloc_data_type; static int reloc_sort (const void *va, const void *vb) { - bfd_vma a = ((const reloc_data_type *) va)->vma; - bfd_vma b = ((const reloc_data_type *) vb)->vma; + const reloc_data_type *a = (const reloc_data_type *) va; + const reloc_data_type *b = (const reloc_data_type *) vb; - return (a > b) ? 1 : ((a < b) ? -1 : 0); + if (a->vma > b->vma) + return 1; + if (a->vma < b->vma) + return -1; + if (a->idx > b->idx) + return 1; + if (a->idx < b->idx) + return -1; + return 0; } static int @@ -1596,6 +1605,7 @@ generate_reloc (bfd *abfd, struct bfd_link_info *info) } reloc_data[total_relocs].vma = sec_vma + relocs[i]->address; + reloc_data[total_relocs].idx = total_relocs; #define BITS_AND_SHIFT(bits, shift) (bits * 1000 | shift) -- 2.30.2