summaryrefslogtreecommitdiff
path: root/src/arbits
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2024-03-16 18:04:34 +0000
committermidipix <writeonce@midipix.org>2024-03-16 18:04:34 +0000
commit752cd9fff4d112e534cd137b30ddefb87b651b30 (patch)
treeaa9e1bbd257e78d4bfadab8c1ef4adb52c6da37a /src/arbits
parentfbd10d2262e87eb93f8fe9c17bde23a1dcdf6e74 (diff)
downloadslibtool-752cd9fff4d112e534cd137b30ddefb87b651b30.tar.bz2
slibtool-752cd9fff4d112e534cd137b30ddefb87b651b30.tar.xz
slbt_ar_update_syminfo(): sort the syminfo vector in a coff-aware manner.
Diffstat (limited to 'src/arbits')
-rw-r--r--src/arbits/slbt_archive_syminfo.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/arbits/slbt_archive_syminfo.c b/src/arbits/slbt_archive_syminfo.c
index 5a96ab9..ee5cc30 100644
--- a/src/arbits/slbt_archive_syminfo.c
+++ b/src/arbits/slbt_archive_syminfo.c
@@ -18,6 +18,7 @@
#include <slibtool/slibtool.h>
#include "slibtool_ar_impl.h"
+#include "slibtool_coff_impl.h"
#include "slibtool_driver_impl.h"
#include "slibtool_dprintf_impl.h"
#include "slibtool_spawn_impl.h"
@@ -236,6 +237,32 @@ static int slbt_get_symbol_nm_info(
return (mctx->syminfv[idx] ? 0 : (-1));
}
+static int slbt_qsort_syminfo_cmp(const void * a, const void * b)
+{
+ struct ar_meta_symbol_info ** syminfoa;
+ struct ar_meta_symbol_info ** syminfob;
+
+ syminfoa = (struct ar_meta_symbol_info **)a;
+ syminfob = (struct ar_meta_symbol_info **)b;
+
+ return strcmp(
+ (*syminfoa)->ar_symbol_name,
+ (*syminfob)->ar_symbol_name);
+}
+
+static int slbt_coff_qsort_syminfo_cmp(const void * a, const void * b)
+{
+ struct ar_meta_symbol_info ** syminfoa;
+ struct ar_meta_symbol_info ** syminfob;
+
+ syminfoa = (struct ar_meta_symbol_info **)a;
+ syminfob = (struct ar_meta_symbol_info **)b;
+
+ return slbt_coff_qsort_strcmp(
+ &(*syminfoa)->ar_symbol_name,
+ &(*syminfob)->ar_symbol_name);
+}
+
slbt_hidden int slbt_ar_update_syminfo(
struct slbt_archive_ctx * actx,
struct slbt_exec_ctx * ectx)
@@ -244,6 +271,7 @@ slbt_hidden int slbt_ar_update_syminfo(
struct slbt_archive_ctx_impl * ictx;
struct slbt_archive_meta_impl * mctx;
uint64_t idx;
+ bool fcoff;
/* driver context, etc. */
ictx = slbt_get_archive_ictx(actx);
@@ -282,6 +310,14 @@ slbt_hidden int slbt_ar_update_syminfo(
return SLBT_CUSTOM_ERROR(
dctx,
SLBT_ERR_FLOW_ERROR);
+
+ /* coff-aware sorting */
+ fcoff = slbt_host_objfmt_is_coff(dctx);
+ fcoff |= (mctx->ofmtattr & AR_OBJECT_ATTR_COFF);
+
+ qsort(mctx->syminfv,mctx->armaps.armap_nsyms,sizeof(*mctx->syminfv),
+ fcoff ? slbt_coff_qsort_syminfo_cmp : slbt_qsort_syminfo_cmp);
+
/* yay */
return 0;
}