From 7f35de9733d3c82eadd5eb17028803a602c3c1d8 Mon Sep 17 00:00:00 2001 From: midipix Date: Tue, 13 Sep 2016 19:20:44 -0400 Subject: link mode: account for directory depth when generating .deps for .la wrapper. --- src/logic/slbt_exec_ctx.c | 23 +++++++++++++++++++++++ src/logic/slbt_exec_link.c | 16 ++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) (limited to 'src/logic') diff --git a/src/logic/slbt_exec_ctx.c b/src/logic/slbt_exec_ctx.c index f1b6b75..6b66f12 100644 --- a/src/logic/slbt_exec_ctx.c +++ b/src/logic/slbt_exec_ctx.c @@ -147,6 +147,7 @@ int slbt_get_exec_ctx( char ** parg; char * ch; char * mark; + const char * dmark; char * slash; const char * arprefix; const char * dsoprefix; @@ -172,6 +173,28 @@ int slbt_get_exec_ctx( : ictx->ctx.csrc; if (ref && !ictx->ctx.csrc && (mark = strrchr(ref,'/'))) { + if (!(strncmp(ref,"../",3))) + dmark = 0; + else if (!(strncmp(ref,"./",2))) + dmark = &ref[1]; + else + dmark = strchr(ref,'/'); + + for (; dmark; ) { + if (!(strncmp(dmark,"/./",3))) { + dmark = strchr(&dmark[2],'/'); + } else if (!(strncmp(dmark,"/../",4))) { + ictx->ctx.ldirdepth = -1; + dmark = 0; + } else { + for (; *dmark=='/'; ) + dmark++; + + ictx->ctx.ldirdepth++; + dmark = strchr(dmark,'/'); + } + } + ictx->ctx.ldirname = ch; strcpy(ch,ref); ch += mark - ref; diff --git a/src/logic/slbt_exec_link.c b/src/logic/slbt_exec_link.c index cde7136..be46fab 100644 --- a/src/logic/slbt_exec_link.c +++ b/src/logic/slbt_exec_link.c @@ -522,6 +522,7 @@ static int slbt_exec_link_create_dep_file( char deplibs[PATH_MAX]; char depfile[PATH_MAX]; struct stat st; + int ldepth; (void)dctx; @@ -578,8 +579,19 @@ static int slbt_exec_link_create_dep_file( } /* [-L... as needed] */ - if (base > *parg) { - if (fprintf(ectx->fdeps,"-L%s/.libs\n",reladir) < 0) { + if ((base > *parg) && (ectx->ldirdepth >= 0)) { + if (fputs("-L",ectx->fdeps) < 0) { + fclose(fdeps); + return SLBT_SYSTEM_ERROR(dctx); + } + + for (ldepth=ectx->ldirdepth; ldepth; ldepth--) + if (fputs("../",ectx->fdeps) < 0) { + fclose(fdeps); + return SLBT_SYSTEM_ERROR(dctx); + } + + if (fprintf(ectx->fdeps,"%s/.libs\n",reladir) < 0) { fclose(fdeps); return SLBT_SYSTEM_ERROR(dctx); } -- cgit v1.2.3