summaryrefslogtreecommitdiff
path: root/src/arbits
diff options
context:
space:
mode:
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;
}