[binutils-gdb] qsort: pe-dll.c reloc sorting

Alan Modra amodra@sourceware.org
Mon Oct 14 06:18:00 GMT 2019


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=08dec09d8a26c115921b17110da1e07cb233c494

commit 08dec09d8a26c115921b17110da1e07cb233c494
Author: Alan Modra <amodra@gmail.com>
Date:   Mon Oct 14 13:55:32 2019 +1030

    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.

Diff:
---
 ld/ChangeLog |  6 ++++++
 ld/pe-dll.c  | 16 +++++++++++++---
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/ld/ChangeLog b/ld/ChangeLog
index 06c7cf7..19ed0b5 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,9 @@
+2019-10-14  Alan Modra  <amodra@gmail.com>
+
+	* 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  <nickc@redhat.com>
 
 	* NEWS: Delete superflous "Changes in 2.33" comment.
diff --git a/ld/pe-dll.c b/ld/pe-dll.c
index 6daf984..4679fca 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)



More information about the Binutils-cvs mailing list