summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/slibtool/slibtool.h1
-rw-r--r--src/logic/slbt_exec_ctx.c10
-rw-r--r--src/logic/slbt_exec_link.c18
3 files changed, 22 insertions, 7 deletions
diff --git a/include/slibtool/slibtool.h b/include/slibtool/slibtool.h
index 3971645..2db22b9 100644
--- a/include/slibtool/slibtool.h
+++ b/include/slibtool/slibtool.h
@@ -136,6 +136,7 @@ struct slbt_exec_ctx {
char * program;
char * compiler;
char ** cargv;
+ char ** xargv;
char ** argv;
char ** envp;
char ** altv;
diff --git a/src/logic/slbt_exec_ctx.c b/src/logic/slbt_exec_ctx.c
index 230dd7f..baddab7 100644
--- a/src/logic/slbt_exec_ctx.c
+++ b/src/logic/slbt_exec_ctx.c
@@ -110,8 +110,13 @@ static struct slbt_exec_ctx_impl * slbt_exec_ctx_alloc(
return 0;
}
+ /* ictx, argv, xargv */
+ vsize = sizeof(*ictx);
+ vsize += sizeof(char *) * (argc + 1);
+ vsize += sizeof(char *) * (argc + 1);
+
/* altv: duplicate set, -Wl,--whole-archive, -Wl,--no-whole-archive */
- vsize = sizeof(*ictx) + 4*(argc+1)*sizeof(char *);
+ vsize += sizeof(char *) * (argc + 1) * 3;
if (!(ictx = calloc(1,vsize))) {
free(args);
@@ -155,7 +160,8 @@ int slbt_get_exec_ctx(
/* init with guard for later .lo check */
ch = ictx->args + strlen(".lo");
ictx->ctx.argv = ictx->vbuffer;
- ictx->ctx.altv = &ictx->vbuffer[ictx->argc + 1];
+ ictx->ctx.xargv = &ictx->ctx.argv [ictx->argc + 1];
+ ictx->ctx.altv = &ictx->ctx.xargv[ictx->argc + 1];
/* <compiler> */
ictx->ctx.compiler = dctx->cctx->cargv[0];
diff --git a/src/logic/slbt_exec_link.c b/src/logic/slbt_exec_link.c
index 53fcd83..4f422d2 100644
--- a/src/logic/slbt_exec_link.c
+++ b/src/logic/slbt_exec_link.c
@@ -193,6 +193,7 @@ static bool slbt_adjust_input_argument(
static int slbt_adjust_linker_argument(
const struct slbt_driver_ctx * dctx,
char * arg,
+ char ** xarg,
bool fpic,
const char * dsosuffix,
const char * arsuffix,
@@ -209,8 +210,10 @@ static int slbt_adjust_linker_argument(
if (!(dot = strrchr(arg,'.')))
return 0;
- if (!(strcmp(dot,arsuffix)))
+ if (!(strcmp(dot,arsuffix))) {
+ *xarg = arg;
return slbt_get_deps_meta(dctx,arg,1,depsmeta);
+ }
if (!(strcmp(dot,dsosuffix)))
return slbt_get_deps_meta(dctx,arg,1,depsmeta);
@@ -350,6 +353,9 @@ static int slbt_exec_link_adjust_argument_vector(
} else if (!(dot = strrchr(*carg,'.'))) {
*aarg++ = *carg++;
+ } else if (ectx->xargv[carg - ectx->cargv]) {
+ *aarg++ = *carg++;
+
} else if (!(strcmp(dot,".a"))) {
if (flibrary && !fwholearchive)
*aarg++ = "-Wl,--whole-archive";
@@ -1120,6 +1126,7 @@ static int slbt_exec_link_create_library(
const char * relfilename)
{
char ** parg;
+ char ** xarg;
char cwd [PATH_MAX];
char output [PATH_MAX];
char soname [PATH_MAX];
@@ -1145,10 +1152,10 @@ static int slbt_exec_link_create_library(
SLBT_NESTED_ERROR(dctx));
/* linker argument adjustment */
- for (parg=ectx->cargv; *parg; parg++)
+ for (parg=ectx->cargv, xarg=ectx->xargv; *parg; parg++, xarg++)
if (slbt_adjust_linker_argument(
dctx,
- *parg,true,
+ *parg,xarg,true,
dctx->cctx->settings.dsosuffix,
dctx->cctx->settings.arsuffix,
&depsmeta) < 0)
@@ -1287,6 +1294,7 @@ static int slbt_exec_link_create_executable(
int fdcwd;
int fdwrap;
char ** parg;
+ char ** xarg;
char * base;
char cwd [PATH_MAX];
char output [PATH_MAX];
@@ -1314,10 +1322,10 @@ static int slbt_exec_link_create_executable(
slbt_adjust_input_argument(*parg,".lo",".o",fpic);
/* linker argument adjustment */
- for (parg=ectx->cargv; *parg; parg++)
+ for (parg=ectx->cargv, xarg=ectx->xargv; *parg; parg++, xarg++)
if (slbt_adjust_linker_argument(
dctx,
- *parg,true,
+ *parg,xarg,true,
dctx->cctx->settings.dsosuffix,
dctx->cctx->settings.arsuffix,
&depsmeta) < 0)