diff options
author | midipix <writeonce@midipix.org> | 2016-03-20 13:29:08 -0400 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2016-03-20 13:29:08 -0400 |
commit | a51ace90d0bc9650a40fe17e5b857769c4ddebd2 (patch) | |
tree | 1db9f208c6523def81f70ff3dd9b6ea513a4c9c1 /src/logic/slbt_exec_link.c | |
parent | 5cc3b3bc6d95bbe4ca3e13b84d43b9d32a64eda1 (diff) | |
download | slibtool-a51ace90d0bc9650a40fe17e5b857769c4ddebd2.tar.bz2 slibtool-a51ace90d0bc9650a40fe17e5b857769c4ddebd2.tar.xz |
link mode: static archive generation: properly handle output archive name.
Diffstat (limited to 'src/logic/slbt_exec_link.c')
-rw-r--r-- | src/logic/slbt_exec_link.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/logic/slbt_exec_link.c b/src/logic/slbt_exec_link.c index 7a86d5e..a9782fb 100644 --- a/src/logic/slbt_exec_link.c +++ b/src/logic/slbt_exec_link.c @@ -50,12 +50,14 @@ static bool slbt_adjust_input_argument(char * arg, bool fpic) static int slbt_exec_link_static_archive( const struct slbt_driver_ctx * dctx, - struct slbt_exec_ctx * ectx) + struct slbt_exec_ctx * ectx, + const char * arfilename) { char ** aarg; char ** parg; char * ranlib[3]; char program[2048]; + char output[2048]; /* placeholders */ slbt_reset_placeholders(ectx); @@ -63,6 +65,11 @@ static int slbt_exec_link_static_archive( /* alternate program (ar, ranlib) */ ectx->program = program; + /* output */ + if ((size_t)snprintf(output,sizeof(output),"%s", + arfilename) >= sizeof(output)) + return -1; + /* ar alternate argument vector */ if ((size_t)snprintf(program,sizeof(program),"%s", dctx->cctx->host.ar) >= sizeof(program)) @@ -71,7 +78,7 @@ static int slbt_exec_link_static_archive( aarg = ectx->altv; *aarg++ = program; *aarg++ = "cru"; - *aarg++ = ectx->arfilename; + *aarg++ = output; /* input argument adjustment */ for (parg=ectx->cargv; *parg; parg++) @@ -96,7 +103,7 @@ static int slbt_exec_link_static_archive( return -1; ranlib[0] = program; - ranlib[1] = ectx->arfilename; + ranlib[1] = output; ranlib[2] = 0; ectx->argv = ranlib; @@ -119,6 +126,7 @@ int slbt_exec_link( { int ret; int fdlibs; + const char * output; char * dot; FILE * fout; struct slbt_exec_ctx * actx; @@ -132,7 +140,8 @@ int slbt_exec_link( actx = ectx; /* output suffix */ - dot = strrchr(dctx->cctx->output,'.'); + output = dctx->cctx->output; + dot = strrchr(output,'.'); /* .libs directory */ if (dctx->cctx->drvflags & SLBT_DRIVER_SHARED) { @@ -146,7 +155,7 @@ int slbt_exec_link( /* non-pic libfoo.a */ if (dot && !strcmp(dot,".a")) - if (slbt_exec_link_static_archive(dctx,ectx)) { + if (slbt_exec_link_static_archive(dctx,ectx,output)) { slbt_free_exec_ctx(actx); return -1; } |