From 2baf1cc107ba6041a3856b77d33140ac876ad6f0 Mon Sep 17 00:00:00 2001 From: midipix Date: Thu, 21 Jun 2018 09:50:26 -0400 Subject: link mode: --disable-{shared|static}: use differently-named placeholders. --- src/internal/slibtool_symlink_impl.c | 44 ++++++++++++++++++++++++++++++++---- src/internal/slibtool_symlink_impl.h | 2 ++ src/logic/slbt_exec_install.c | 8 +++---- src/logic/slbt_exec_link.c | 4 +--- 4 files changed, 46 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/internal/slibtool_symlink_impl.c b/src/internal/slibtool_symlink_impl.c index 72d693a..b5b9b28 100644 --- a/src/internal/slibtool_symlink_impl.c +++ b/src/internal/slibtool_symlink_impl.c @@ -11,6 +11,7 @@ #include "slibtool_errinfo_impl.h" #include "slibtool_symlink_impl.h" +#include "slibtool_readlink_impl.h" #define SLBT_DEV_NULL_FLAGS (SLBT_DRIVER_ALL_STATIC \ | SLBT_DRIVER_DISABLE_SHARED \ @@ -29,19 +30,29 @@ int slbt_create_symlink( char * dotdot; char tmplnk [PATH_MAX]; char lnkarg [PATH_MAX]; + char alnkarg[PATH_MAX]; char atarget[PATH_MAX]; + char * suffix = 0; - /* atarget */ + /* symlink is a placeholder? */ if ((dctx->cctx->drvflags & SLBT_DEV_NULL_FLAGS) - && !strcmp(target,"/dev/null")) - slash = target; - else if ((slash = strrchr(target,'/'))) + && !strcmp(target,"/dev/null")) { + slash = target; + suffix = ".disabled"; + + /* symlink target contains a dirname? */ + } else if ((slash = strrchr(target,'/'))) { slash++; - else + + /* symlink target is a basename */ + } else { slash = target; + } + /* .la wrapper? */ dotdot = flawrapper ? "../" : ""; + /* atarget */ if ((size_t)snprintf(atarget,sizeof(atarget),"%s%s", dotdot,slash) >= sizeof(atarget)) return SLBT_BUFFER_ERROR(dctx); @@ -51,6 +62,12 @@ int slbt_create_symlink( lnkname) >= sizeof(tmplnk)) return SLBT_BUFFER_ERROR(dctx); + /* placeholder? */ + if (suffix) { + sprintf(alnkarg,"%s%s",lnkname,suffix); + lnkname = alnkarg; + } + /* lnkarg */ strcpy(lnkarg,lnkname); @@ -90,3 +107,20 @@ int slbt_create_symlink( ? SLBT_SYSTEM_ERROR(dctx) : 0; } + +int slbt_symlink_is_a_placeholder(char * lnkpath) +{ + size_t len; + char slink [PATH_MAX]; + char target[PATH_MAX]; + const char suffix[] = ".disabled"; + + if ((sizeof(slink)-sizeof(suffix)) < (len=strlen(lnkpath))) + return 0; + + memcpy(slink,lnkpath,len); + memcpy(&slink[len],suffix,sizeof(suffix)); + + return (!slbt_readlink(slink,target,sizeof(target))) + && (!strcmp(target,"/dev/null")); +} diff --git a/src/internal/slibtool_symlink_impl.h b/src/internal/slibtool_symlink_impl.h index 63a74a8..b96fdb9 100644 --- a/src/internal/slibtool_symlink_impl.h +++ b/src/internal/slibtool_symlink_impl.h @@ -13,3 +13,5 @@ int slbt_create_symlink( const char * target, const char * lnkname, bool flawrapper); + +int slbt_symlink_is_a_placeholder(char * lnkpath); diff --git a/src/logic/slbt_exec_install.c b/src/logic/slbt_exec_install.c index ea795e3..2d98881 100644 --- a/src/logic/slbt_exec_install.c +++ b/src/logic/slbt_exec_install.c @@ -424,6 +424,10 @@ static int slbt_exec_install_entry( /* source (build) symlink target */ if (slbt_readlink(slnkname,target,sizeof(target)) < 0) { + /* -all-static? */ + if (slbt_symlink_is_a_placeholder(slnkname)) + return 0; + /* -avoid-version? */ if (stat(slnkname,&st)) return SLBT_SYSTEM_ERROR(dctx); @@ -447,10 +451,6 @@ static int slbt_exec_install_entry( return 0; } - /* -all-static? */ - if (!strcmp(target,"/dev/null")) - return 0; - /* srcfile: .libs/libfoo.so.x.y.z */ slash = strrchr(srcfile,'/'); strcpy(++slash,target); diff --git a/src/logic/slbt_exec_link.c b/src/logic/slbt_exec_link.c index 542448c..5cf3355 100644 --- a/src/logic/slbt_exec_link.c +++ b/src/logic/slbt_exec_link.c @@ -200,7 +200,6 @@ static int slbt_adjust_linker_argument( char * slash; char * dot; char base[PATH_MAX]; - char slnk[PATH_MAX]; if (*arg == '-') return 0; @@ -229,8 +228,7 @@ static int slbt_adjust_linker_argument( if (fpic) { sprintf(dot,"%s",dsosuffix); - if (!slbt_readlink(arg,slnk,sizeof(slnk)) - && !(strcmp(slnk,"/dev/null"))) + if (slbt_symlink_is_a_placeholder(arg)) sprintf(dot,"%s",arsuffix); else if ((fdlib = open(arg,O_RDONLY)) >= 0) close(fdlib); -- cgit v1.2.3