From 46aa6f554c0f2ef1affa5ae292fffec6907ff4b3 Mon Sep 17 00:00:00 2001 From: midipix Date: Tue, 10 Jul 2018 15:14:36 +0000 Subject: link mode: properly handle explicit archive input arguments. --- include/slibtool/slibtool.h | 1 + src/logic/slbt_exec_ctx.c | 10 ++++++++-- src/logic/slbt_exec_link.c | 18 +++++++++++++----- 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]; /* */ 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) -- cgit v1.2.3