From 08f5f92f68aa6f198d401229061b39a4f9602769 Mon Sep 17 00:00:00 2001 From: midipix Date: Sat, 10 Nov 2018 15:23:57 -0500 Subject: link mode: host flavors: properly support suffixed suffixes. --- include/slibtool/slibtool.h | 1 + src/logic/slbt_exec_ctx.c | 24 +++++++++++++++----- src/logic/slbt_exec_link.c | 54 +++++++++++++++++++++++++++------------------ 3 files changed, 52 insertions(+), 27 deletions(-) diff --git a/include/slibtool/slibtool.h b/include/slibtool/slibtool.h index d28cb8d..7fd99f0 100644 --- a/include/slibtool/slibtool.h +++ b/include/slibtool/slibtool.h @@ -167,6 +167,7 @@ struct slbt_exec_ctx { char * arfilename; char * lafilename; char * laifilename; + char * dsobasename; char * dsofilename; char * relfilename; char * dsorellnkname; diff --git a/src/logic/slbt_exec_ctx.c b/src/logic/slbt_exec_ctx.c index 256e941..d10d880 100644 --- a/src/logic/slbt_exec_ctx.c +++ b/src/logic/slbt_exec_ctx.c @@ -78,9 +78,12 @@ static struct slbt_exec_ctx_impl * slbt_exec_ctx_alloc( /* buffer size (ldirname, lbasename, lobjname, aobjname, etc.) */ if (dctx->cctx->output) - size += 8*strlen(dctx->cctx->output); + size += 9*strlen(dctx->cctx->output); else if ((csrc = slbt_source_file(dctx->cctx->cargv))) - size += 8*strlen(csrc); + size += 9*strlen(csrc); + + /* pessimistic: long dso suffix, long x.y.z version */ + size += 9 * (16 + 16 + 16 + 16); /* pessimistic argc: .libs/libfoo.so --> -L.libs -lfoo */ argc *= 2; @@ -306,7 +309,7 @@ int slbt_get_exec_ctx( + 1; } - /* linking: arfilename, lafilename, laifilename, dsofilename */ + /* linking: arfilename, lafilename, laifilename, dsobasename, dsofilename */ if (dctx->cctx->mode == SLBT_MODE_LINK && dctx->cctx->libname) { /* arprefix, dsoprefix */ if (dctx->cctx->drvflags & SLBT_DRIVER_MODULE) { @@ -350,6 +353,14 @@ int slbt_get_exec_ctx( ch++; + /* dsobasename */ + ictx->ctx.dsobasename = ch; + ch += sprintf(ch,"%s%s%s", + ictx->ctx.ldirname, + dsoprefix, + dctx->cctx->libname); + ch++; + /* dsofilename */ ictx->ctx.dsofilename = ch; ch += sprintf(ch,"%s%s%s%s", @@ -413,15 +424,16 @@ int slbt_get_exec_ctx( if (dctx->cctx->release) { ictx->ctx.relfilename = ch; ch += dctx->cctx->verinfo.verinfo - ? sprintf(ch,"%s%s%s-%s%s.%d.%d.%d", + ? sprintf(ch,"%s%s%s-%s%s.%d.%d.%d%s", ictx->ctx.ldirname, dsoprefix, dctx->cctx->libname, dctx->cctx->release, - dctx->cctx->settings.dsosuffix, + dctx->cctx->settings.osdsuffix, dctx->cctx->verinfo.major, dctx->cctx->verinfo.minor, - dctx->cctx->verinfo.revision) + dctx->cctx->verinfo.revision, + dctx->cctx->settings.osdfussix) : sprintf(ch,"%s%s%s-%s%s", ictx->ctx.ldirname, dsoprefix, diff --git a/src/logic/slbt_exec_link.c b/src/logic/slbt_exec_link.c index d5ebf71..0bfe7e0 100644 --- a/src/logic/slbt_exec_link.c +++ b/src/logic/slbt_exec_link.c @@ -1247,6 +1247,7 @@ static int slbt_exec_link_create_archive( static int slbt_exec_link_create_library( const struct slbt_driver_ctx * dctx, struct slbt_exec_ctx * ectx, + const char * dsobasename, const char * dsofilename, const char * relfilename) { @@ -1299,12 +1300,13 @@ static int slbt_exec_link_create_library( (void)0; } else if (relfilename && dctx->cctx->verinfo.verinfo) { - if ((size_t)snprintf(soname,sizeof(soname),"-Wl,%s%s-%s%s.%d", + if ((size_t)snprintf(soname,sizeof(soname),"-Wl,%s%s-%s%s.%d%s", ectx->sonameprefix, dctx->cctx->libname, dctx->cctx->release, - dctx->cctx->settings.dsosuffix, - dctx->cctx->verinfo.major) + dctx->cctx->settings.osdsuffix, + dctx->cctx->verinfo.major, + dctx->cctx->settings.osdfussix) >= sizeof(soname)) return SLBT_BUFFER_ERROR(dctx); @@ -1324,11 +1326,12 @@ static int slbt_exec_link_create_library( *ectx->lsoname = soname; } else if (!(dctx->cctx->drvflags & SLBT_DRIVER_AVOID_VERSION)) { - if ((size_t)snprintf(soname,sizeof(soname),"-Wl,%s%s%s.%d", + if ((size_t)snprintf(soname,sizeof(soname),"-Wl,%s%s%s.%d%s", ectx->sonameprefix, dctx->cctx->libname, - dctx->cctx->settings.dsosuffix, - dctx->cctx->verinfo.major) + dctx->cctx->settings.osdsuffix, + dctx->cctx->verinfo.major, + dctx->cctx->settings.osdfussix) >= sizeof(soname)) return SLBT_BUFFER_ERROR(dctx); @@ -1363,11 +1366,13 @@ static int slbt_exec_link_create_library( } else if (dctx->cctx->drvflags & SLBT_DRIVER_AVOID_VERSION) { strcpy(output,dsofilename); } else { - if ((size_t)snprintf(output,sizeof(output),"%s.%d.%d.%d", - dsofilename, + if ((size_t)snprintf(output,sizeof(output),"%s%s.%d.%d.%d%s", + dsobasename, + dctx->cctx->settings.osdsuffix, dctx->cctx->verinfo.major, dctx->cctx->verinfo.minor, - dctx->cctx->verinfo.revision) + dctx->cctx->verinfo.revision, + dctx->cctx->settings.osdfussix) >= sizeof(output)) return SLBT_BUFFER_ERROR(dctx); } @@ -1621,11 +1626,13 @@ static int slbt_exec_link_create_library_symlink( false)) return SLBT_NESTED_ERROR(dctx); } else { - sprintf(target,"%s.%d.%d.%d", - ectx->dsofilename, + sprintf(target,"%s%s.%d.%d.%d%s", + ectx->dsobasename, + dctx->cctx->settings.osdsuffix, dctx->cctx->verinfo.major, dctx->cctx->verinfo.minor, - dctx->cctx->verinfo.revision); + dctx->cctx->verinfo.revision, + dctx->cctx->settings.osdfussix); } @@ -1635,9 +1642,11 @@ static int slbt_exec_link_create_library_symlink( dctx->cctx->verinfo.major); } else if (fmajor) { - sprintf(lnkname,"%s.%d", - ectx->dsofilename, - dctx->cctx->verinfo.major); + sprintf(lnkname,"%s%s.%d%s", + ectx->dsobasename, + dctx->cctx->settings.osdsuffix, + dctx->cctx->verinfo.major, + dctx->cctx->settings.osdfussix); } else { strcpy(lnkname,ectx->dsofilename); @@ -1683,24 +1692,26 @@ int slbt_exec_link( actx = ectx; /* libfoo.so.x.y.z */ - if ((size_t)snprintf(soxyz,sizeof(soxyz),"%s%s%s.%d.%d.%d", + if ((size_t)snprintf(soxyz,sizeof(soxyz),"%s%s%s.%d.%d.%d%s", ectx->sonameprefix, dctx->cctx->libname, - dctx->cctx->settings.dsosuffix, + dctx->cctx->settings.osdsuffix, dctx->cctx->verinfo.major, dctx->cctx->verinfo.minor, - dctx->cctx->verinfo.revision) + dctx->cctx->verinfo.revision, + dctx->cctx->settings.osdfussix) >= sizeof(soxyz)) { slbt_free_exec_ctx(actx); return SLBT_BUFFER_ERROR(dctx); } /* libfoo.so.x */ - sprintf(soname,"%s%s%s.%d", + sprintf(soname,"%s%s%s.%d%s", ectx->sonameprefix, dctx->cctx->libname, - dctx->cctx->settings.dsosuffix, - dctx->cctx->verinfo.major); + dctx->cctx->settings.osdsuffix, + dctx->cctx->verinfo.major, + dctx->cctx->settings.osdfussix); /* libfoo.so */ sprintf(solnk,"%s%s%s", @@ -1773,6 +1784,7 @@ int slbt_exec_link( /* linking: libfoo.so.x.y.z */ if (slbt_exec_link_create_library( dctx,ectx, + ectx->dsobasename, ectx->dsofilename, ectx->relfilename)) { slbt_free_exec_ctx(actx); -- cgit v1.2.3