summaryrefslogtreecommitdiffhomepage
path: root/src/arbits/slbt_archive_mapfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/arbits/slbt_archive_mapfile.c')
-rw-r--r--src/arbits/slbt_archive_mapfile.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/arbits/slbt_archive_mapfile.c b/src/arbits/slbt_archive_mapfile.c
index 3e7d4df..18f94dc 100644
--- a/src/arbits/slbt_archive_mapfile.c
+++ b/src/arbits/slbt_archive_mapfile.c
@@ -33,11 +33,14 @@ static int slbt_ar_output_mapfile_impl(
bool fsort;
bool fcoff;
bool fmach;
+ const char * dot;
+ const char * mark;
const char * regex;
const char ** symv;
const char ** symstrv;
regex_t regctx;
regmatch_t pmatch[2] = {{0,0},{0,0}};
+ char strbuf[4096];
fsort = !(dctx->cctx->fmtflags & SLBT_OUTPUT_ARCHIVE_NOSORT);
@@ -84,6 +87,17 @@ static int slbt_ar_output_mapfile_impl(
return SLBT_SYSTEM_ERROR(dctx,0);
}
}
+ /* coff weak symbols: expsym = .weak.alias.strong */
+ } else if (fcoff && !strncmp(*symv,".weak.",6)) {
+ mark = &(*symv)[6];
+ dot = strchr(mark,'.');
+
+ strncpy(strbuf,mark,dot-mark);
+ strbuf[dot-mark] = '\0';
+
+ if (!regex || !regexec(&regctx,strbuf,1,pmatch,0))
+ if (slbt_dprintf(fdout," %s = %s\n",strbuf,++dot) < 0)
+ return SLBT_SYSTEM_ERROR(dctx,0);
}
}