From 6ce9ba7afcc64217e008d3b51f8c7ef4c496957e Mon Sep 17 00:00:00 2001
From: Alan Modra <amodra@gmail.com>
Date: Mon, 14 Oct 2019 13:54:09 +1030
Subject: [PATCH] qsort: objcopy.c section sort

	* objcopy.c (compare_section_lma): Correct comment.  Dereference
	section pointer earlier and lose unnecessary const.  Style fixes.
	Add final sort by id.
---
 binutils/ChangeLog |  6 ++++++
 binutils/objcopy.c | 22 +++++++++++++---------
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index df07e749035..e47c145764a 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,9 @@
+2019-10-14  Alan Modra  <amodra@gmail.com>
+
+	* objcopy.c (compare_section_lma): Correct comment.  Dereference
+	section pointer earlier and lose unnecessary const.  Style fixes.
+	Add final sort by id.
+
 2019-10-13  Nick Clifton  <nickc@redhat.com>
 
 	* README-how-to-make-a-release: Add a note to reset the
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 8f74bebae88..bc9d75d71d2 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -4256,20 +4256,20 @@ get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg)
   ++(*secppp);
 }
 
-/* Sort sections by VMA.  This is called via qsort, and is used when
+/* Sort sections by LMA.  This is called via qsort, and is used when
    --gap-fill or --pad-to is used.  We force non loadable or empty
    sections to the front, where they are easier to ignore.  */
 
 static int
 compare_section_lma (const void *arg1, const void *arg2)
 {
-  const asection *const *sec1 = (const asection * const *) arg1;
-  const asection *const *sec2 = (const asection * const *) arg2;
+  const asection *sec1 = *(const asection **) arg1;
+  const asection *sec2 = *(const asection **) arg2;
   flagword flags1, flags2;
 
   /* Sort non loadable sections to the front.  */
-  flags1 = (*sec1)->flags;
-  flags2 = (*sec2)->flags;
+  flags1 = sec1->flags;
+  flags2 = sec2->flags;
   if ((flags1 & SEC_HAS_CONTENTS) == 0
       || (flags1 & SEC_LOAD) == 0)
     {
@@ -4285,17 +4285,21 @@ compare_section_lma (const void *arg1, const void *arg2)
     }
 
   /* Sort sections by LMA.  */
-  if ((*sec1)->lma > (*sec2)->lma)
+  if (sec1->lma > sec2->lma)
     return 1;
-  else if ((*sec1)->lma < (*sec2)->lma)
+  if (sec1->lma < sec2->lma)
     return -1;
 
   /* Sort sections with the same LMA by size.  */
-  if (bfd_section_size (*sec1) > bfd_section_size (*sec2))
+  if (bfd_section_size (sec1) > bfd_section_size (sec2))
     return 1;
-  else if (bfd_section_size (*sec1) < bfd_section_size (*sec2))
+  if (bfd_section_size (sec1) < bfd_section_size (sec2))
     return -1;
 
+  if (sec1->id > sec2->id)
+    return 1;
+  if (sec1->id < sec2->id)
+    return -1;
   return 0;
 }