qsort: objcopy.c section sort
authorAlan Modra <amodra@gmail.com>
Mon, 14 Oct 2019 03:24:09 +0000 (13:54 +1030)
committerAlan Modra <amodra@gmail.com>
Mon, 14 Oct 2019 06:17:13 +0000 (16:47 +1030)
* objcopy.c (compare_section_lma): Correct comment.  Dereference
section pointer earlier and lose unnecessary const.  Style fixes.
Add final sort by id.

binutils/ChangeLog
binutils/objcopy.c

index df07e749035f151903dad4ac00a971efedb2088d..e47c145764ae28ed9eed8739b85a3075b81ddc12 100644 (file)
@@ -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
index 8f74bebae88e7cd8d60f8658b37b68fc7ba5b464..bc9d75d71d2f8b6973ee3585f2ef8ced9cbf16f8 100644 (file)
@@ -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;
 }