[PATCH v2 2/2] src/readelf: use qsort instead of qsort_r.

Érico Nogueira ericonr@disroot.org
Wed Dec 16 22:30:12 GMT 2020


From: Érico Rolim <erico.erc@gmail.com>

This program is single threaded, so using qsort with a global variable
isn't a danger. The interface for qsort_r isn't standardized (and
diverges between glibc and FreeBSD, for example), which makes usage of
qsort, where possible, preferrable.

Signed-off-by: Érico Rolim <erico.erc@gmail.com>
---

Only difference from the initial patch is that this includes the
Signed-off-by line.

 src/ChangeLog |  4 ++++
 src/readelf.c | 14 ++++++++++----
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index 2e428e0b..5c1ad1a2 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
+2020-12-16  Érico Nogueira  <ericonr@disroot.org>
+
+	* readelf.c (qsort_r): Use qsort for improved portability.
+
 2020-12-12  Mark Wielaard  <mark@klomp.org>
 
 	* elflint.c (check_sections): Handle SHF_GNU_RETAIN.
diff --git a/src/readelf.c b/src/readelf.c
index 829a418d..0001a3d8 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -4831,10 +4831,13 @@ listptr_base (struct listptr *p)
   return cudie_base (&cu);
 }
 
+/* To store the name used in compare_listptr */
+static const char *sort_listptr_name;
+
 static int
-compare_listptr (const void *a, const void *b, void *arg)
+compare_listptr (const void *a, const void *b)
 {
-  const char *name = arg;
+  const char *name = sort_listptr_name;
   struct listptr *p1 = (void *) a;
   struct listptr *p2 = (void *) b;
 
@@ -4944,8 +4947,11 @@ static void
 sort_listptr (struct listptr_table *table, const char *name)
 {
   if (table->n > 0)
-    qsort_r (table->table, table->n, sizeof table->table[0],
-	     &compare_listptr, (void *) name);
+    {
+      sort_listptr_name = name;
+      qsort (table->table, table->n, sizeof table->table[0],
+	     &compare_listptr);
+    }
 }
 
 static bool
-- 
2.29.2



More information about the Elfutils-devel mailing list