diff options
-rw-r--r-- | src/internal/slibtool_symlink_impl.c | 10 | ||||
-rw-r--r-- | src/logic/linkcmd/slbt_linkcmd_archive.c | 19 | ||||
-rw-r--r-- | src/logic/linkcmd/slbt_linkcmd_dsolib.c | 32 | ||||
-rw-r--r-- | src/logic/slbt_exec_link.c | 77 |
4 files changed, 109 insertions, 29 deletions
diff --git a/src/internal/slibtool_symlink_impl.c b/src/internal/slibtool_symlink_impl.c index a788800..34661f0 100644 --- a/src/internal/slibtool_symlink_impl.c +++ b/src/internal/slibtool_symlink_impl.c @@ -47,18 +47,14 @@ slbt_hidden int slbt_create_symlink( fdevnull = (options & SLBT_SYMLINK_DEVNULL); /* symlink is a placeholder? */ - if (fliteral && fdevnull) { + if (fliteral) { slash = target; - } else if ((dctx->cctx->drvflags & SLBT_DEV_NULL_FLAGS) - && !strcmp(target,"/dev/null")) { + /* .disabled .so or .a file */ + } else if (fdevnull) { slash = target; suffix = ".disabled"; - /* target is an absolute path? */ - } else if (fliteral) { - slash = target; - /* symlink target contains a dirname? */ } else if ((slash = strrchr(target,'/'))) { slash++; diff --git a/src/logic/linkcmd/slbt_linkcmd_archive.c b/src/logic/linkcmd/slbt_linkcmd_archive.c index a8002fb..9b002f6 100644 --- a/src/logic/linkcmd/slbt_linkcmd_archive.c +++ b/src/logic/linkcmd/slbt_linkcmd_archive.c @@ -57,17 +57,26 @@ static int slbt_exec_link_remove_file( const char * target) { int fdcwd; - - (void)ectx; + char * mark; + char * sbuf; /* fdcwd */ fdcwd = slbt_driver_fdcwd(dctx); /* remove target (if any) */ - if (!unlinkat(fdcwd,target,0) || (errno == ENOENT)) - return 0; + if (unlinkat(fdcwd,target,0) && (errno != ENOENT)) + return SLBT_SYSTEM_ERROR(dctx,0); + + /* remove a previous .disabled placeholder */ + sbuf = (slbt_get_exec_ictx(ectx))->sbuf; + mark = sbuf; + mark += sprintf(mark,"%s",target); + strcpy(mark,".disabled"); - return SLBT_SYSTEM_ERROR(dctx,0); + if (unlinkat(fdcwd,sbuf,0) && (errno != ENOENT)) + return SLBT_SYSTEM_ERROR(dctx,0); + + return 0; } slbt_hidden int slbt_exec_link_create_archive( diff --git a/src/logic/linkcmd/slbt_linkcmd_dsolib.c b/src/logic/linkcmd/slbt_linkcmd_dsolib.c index dd5bf64..b740a00 100644 --- a/src/logic/linkcmd/slbt_linkcmd_dsolib.c +++ b/src/logic/linkcmd/slbt_linkcmd_dsolib.c @@ -55,6 +55,34 @@ static int slbt_exec_link_remove_file( return SLBT_SYSTEM_ERROR(dctx,0); } +static int slbt_exec_link_remove_dso_files( + const struct slbt_driver_ctx * dctx, + struct slbt_exec_ctx * ectx, + const char * target) +{ + int fdcwd; + char * mark; + char * sbuf; + + /* fdcwd */ + fdcwd = slbt_driver_fdcwd(dctx); + + /* remove target (if any) */ + if (unlinkat(fdcwd,target,0) && (errno != ENOENT)) + return SLBT_SYSTEM_ERROR(dctx,0); + + /* remove a previous .disabled placeholder */ + sbuf = (slbt_get_exec_ictx(ectx))->sbuf; + mark = sbuf; + mark += sprintf(mark,"%s",target); + strcpy(mark,".disabled"); + + if (unlinkat(fdcwd,sbuf,0) && (errno != ENOENT)) + return SLBT_SYSTEM_ERROR(dctx,0); + + return 0; +} + slbt_hidden int slbt_exec_link_create_library( const struct slbt_driver_ctx * dctx, struct slbt_exec_ctx * ectx, @@ -85,6 +113,10 @@ slbt_hidden int slbt_exec_link_create_library( /* fdcwd */ fdcwd = slbt_driver_fdcwd(dctx); + /* remove previous libfoo.so, libfoo.so.disabled */ + if (slbt_exec_link_remove_dso_files(dctx,ectx,ectx->dsofilename) < 0) + return SLBT_NESTED_ERROR(dctx); + /* input argument adjustment */ for (parg=ectx->cargv; *parg; parg++) slbt_adjust_object_argument(*parg,true,false,fdcwd); diff --git a/src/logic/slbt_exec_link.c b/src/logic/slbt_exec_link.c index 423a20e..1e1e5b2 100644 --- a/src/logic/slbt_exec_link.c +++ b/src/logic/slbt_exec_link.c @@ -136,7 +136,9 @@ int slbt_exec_link(const struct slbt_driver_ctx * dctx) char * dot; struct slbt_exec_ctx * ectx; bool fpic; - bool fstaticonly; + bool fnodsolib; + bool fnoarchive; + bool fstaticobjs; char soname[PATH_MAX]; char soxyz [PATH_MAX]; char solnk [PATH_MAX]; @@ -208,21 +210,37 @@ int slbt_exec_link(const struct slbt_driver_ctx * dctx) return SLBT_NESTED_ERROR(dctx); } - /* fpic, fstaticonly */ + /* fpic, fstaticobjs, fnodsolib, fnoarchive */ if (dctx->cctx->drvflags & SLBT_DRIVER_ALL_STATIC) { - fstaticonly = true; + fstaticobjs = true; + fnodsolib = true; + fnoarchive = false; fpic = false; } else if (dctx->cctx->drvflags & SLBT_DRIVER_DISABLE_SHARED) { - fstaticonly = true; + fstaticobjs = true; + fnodsolib = true; + fnoarchive = false; fpic = false; - } else if (dctx->cctx->drvflags & SLBT_DRIVER_DISABLE_STATIC) { - fstaticonly = false; - fpic = true; } else if (dctx->cctx->drvflags & SLBT_DRIVER_SHARED) { - fstaticonly = false; + fstaticobjs = false; fpic = true; + + if (dctx->cctx->libname && dctx->cctx->rpath) { + fnodsolib = false; + fnoarchive = (dctx->cctx->drvflags & SLBT_DRIVER_DISABLE_STATIC); + + } else if (dctx->cctx->libname) { + fnodsolib = true; + fnoarchive = false; + + } else { + fnodsolib = true; + fnoarchive = true; + } } else { - fstaticonly = false; + fstaticobjs = false; + fnodsolib = true; + fnoarchive = false; fpic = false; } @@ -235,7 +253,7 @@ int slbt_exec_link(const struct slbt_driver_ctx * dctx) } /* pic libfoo.a */ - if (dot && !strcmp(dot,".la")) + if (dot && !strcmp(dot,".la") && !fnoarchive) if (slbt_exec_link_create_archive( dctx,ectx, ectx->arfilename, @@ -245,7 +263,7 @@ int slbt_exec_link(const struct slbt_driver_ctx * dctx) } /* static-only libfoo.la */ - if (fstaticonly && dot && !strcmp(dot,".la")) { + if (fstaticobjs && dot && !strcmp(dot,".la")) { const struct slbt_flavor_settings * dflavor; if (slbt_host_flavor_settings("default",&dflavor) < 0) @@ -277,21 +295,46 @@ int slbt_exec_link(const struct slbt_driver_ctx * dctx) dctx,ectx, "/dev/null", ectx->deffilename, - SLBT_SYMLINK_LITERAL|SLBT_SYMLINK_DEVNULL)) + SLBT_SYMLINK_LITERAL)) return SLBT_NESTED_ERROR(dctx); } - /* -all-static library */ - if (fstaticonly && dctx->cctx->libname) + /* static archive or convenience library only? */ + if (fnodsolib && ectx->dsofilename) { + if (slbt_create_symlink( + dctx,ectx, + "/dev/null", + ectx->dsofilename, + SLBT_SYMLINK_LITERAL)) + return SLBT_NESTED_ERROR(dctx); + if (slbt_create_symlink( dctx,ectx, "/dev/null", ectx->dsofilename, + SLBT_SYMLINK_DEVNULL)) + return SLBT_NESTED_ERROR(dctx); + } + + /* disable static? */ + if (fnoarchive && ectx->arfilename) { + if (slbt_create_symlink( + dctx,ectx, + "/dev/null", + ectx->arfilename, SLBT_SYMLINK_LITERAL)) return SLBT_NESTED_ERROR(dctx); + if (slbt_create_symlink( + dctx,ectx, + "/dev/null", + ectx->arfilename, + SLBT_SYMLINK_DEVNULL)) + return SLBT_NESTED_ERROR(dctx); + } + /* dynamic library via -module */ - if (dctx->cctx->rpath && !fstaticonly) { + if (dctx->cctx->rpath && !fstaticobjs) { if (dctx->cctx->drvflags & SLBT_DRIVER_MODULE) { if (!dot || strcmp(dot,".la")) { if (slbt_exec_link_create_library( @@ -311,7 +354,7 @@ int slbt_exec_link(const struct slbt_driver_ctx * dctx) } /* dynamic library */ - if (dot && !strcmp(dot,".la") && dctx->cctx->rpath && !fstaticonly) { + if (dot && !strcmp(dot,".la") && dctx->cctx->rpath && !fstaticobjs) { const struct slbt_flavor_settings * dflavor; if (slbt_host_flavor_settings("default",&dflavor) < 0) @@ -427,7 +470,7 @@ int slbt_exec_link(const struct slbt_driver_ctx * dctx) dctx,ectx, "/dev/null", ectx->deffilename, - SLBT_SYMLINK_LITERAL|SLBT_SYMLINK_DEVNULL)) + SLBT_SYMLINK_LITERAL)) return SLBT_NESTED_ERROR(dctx); } } |