diff --git a/include/slibtool/slibtool.h b/include/slibtool/slibtool.h index 2db22b9..e413602 100644 --- a/include/slibtool/slibtool.h +++ b/include/slibtool/slibtool.h @@ -215,6 +215,7 @@ struct slbt_flavor_settings { const char * impprefix; const char * impsuffix; const char * ldpathenv; + char * picswitch; }; struct slbt_common_ctx { diff --git a/src/driver/slbt_driver_ctx.c b/src/driver/slbt_driver_ctx.c index 8a1b0ec..37e10f8 100644 --- a/src/driver/slbt_driver_ctx.c +++ b/src/driver/slbt_driver_ctx.c @@ -29,15 +29,15 @@ static const struct slbt_source_version slbt_src_version = { }; /* flavor settings */ -#define SLBT_FLAVOR_SETTINGS(flavor,bfmt,arp,ars,dsop,dsos,exep,exes,impp,imps,ldenv) \ +#define SLBT_FLAVOR_SETTINGS(flavor,bfmt,pic,arp,ars,dsop,dsos,exep,exes,impp,imps,ldenv) \ static const struct slbt_flavor_settings flavor = { \ - bfmt,arp,ars,dsop,dsos,exep,exes,impp,imps,ldenv} + bfmt,arp,ars,dsop,dsos,exep,exes,impp,imps,ldenv,pic} -SLBT_FLAVOR_SETTINGS(host_flavor_default, "elf", "lib",".a", "lib",".so", "","", "", "", "LD_LIBRARY_PATH"); -SLBT_FLAVOR_SETTINGS(host_flavor_midipix, "pe", "lib",".a", "lib",".so", "","", "lib",".lib.a", "PATH"); -SLBT_FLAVOR_SETTINGS(host_flavor_mingw, "pe", "lib",".a", "lib",".dll", "",".exe", "lib",".dll.a", "PATH"); -SLBT_FLAVOR_SETTINGS(host_flavor_cygwin, "pe", "lib",".a", "lib",".dll", "",".exe", "lib",".dll.a", "PATH"); -SLBT_FLAVOR_SETTINGS(host_flavor_darwin, "macho","lib",".a", "lib",".dylib", "","", "", "", "DYLD_LIBRARY_PATH"); +SLBT_FLAVOR_SETTINGS(host_flavor_default, "elf", "-fPIC","lib",".a", "lib",".so", "","", "", "", "LD_LIBRARY_PATH"); +SLBT_FLAVOR_SETTINGS(host_flavor_midipix, "pe", "-fPIC","lib",".a", "lib",".so", "","", "lib",".lib.a", "PATH"); +SLBT_FLAVOR_SETTINGS(host_flavor_mingw, "pe", 0, "lib",".a", "lib",".dll", "",".exe", "lib",".dll.a", "PATH"); +SLBT_FLAVOR_SETTINGS(host_flavor_cygwin, "pe", 0, "lib",".a", "lib",".dll", "",".exe", "lib",".dll.a", "PATH"); +SLBT_FLAVOR_SETTINGS(host_flavor_darwin, "macho","-fPIC","lib",".a", "lib",".dylib", "","", "", "", "DYLD_LIBRARY_PATH"); /* annotation strings */ @@ -1245,25 +1245,21 @@ int slbt_get_driver_ctx( ctx->cctx.cargv = sargv.cargv; /* host params */ - if (cctx.mode == SLBT_MODE_COMPILE) { - (void)0; - - } else { - if (slbt_init_host_params( - &ctx->ctx, - &ctx->cctx, - &ctx->host, - &ctx->cctx.host, - &ctx->cctx.cfgmeta)) { - slbt_free_driver_ctx(&ctx->ctx); - return -1; - } - - slbt_init_flavor_settings( - &ctx->cctx,0, - &ctx->cctx.settings); + if (slbt_init_host_params( + &ctx->ctx, + &ctx->cctx, + &ctx->host, + &ctx->cctx.host, + &ctx->cctx.cfgmeta)) { + slbt_free_driver_ctx(&ctx->ctx); + return -1; } + /* flavor settings */ + slbt_init_flavor_settings( + &ctx->cctx,0, + &ctx->cctx.settings); + /* ldpath */ if (slbt_init_ldrpath(&ctx->cctx,&ctx->cctx.host)) { slbt_free_driver_ctx(&ctx->ctx); diff --git a/src/logic/slbt_exec_compile.c b/src/logic/slbt_exec_compile.c index 9e4e7a1..f3d3b48 100644 --- a/src/logic/slbt_exec_compile.c +++ b/src/logic/slbt_exec_compile.c @@ -66,10 +66,12 @@ int slbt_exec_compile( /* shared library object */ if (dctx->cctx->drvflags & SLBT_DRIVER_SHARED) { - if (!(dctx->cctx->drvflags & SLBT_DRIVER_ANTI_PIC)) { + if (!(dctx->cctx->drvflags & SLBT_DRIVER_ANTI_PIC)) *ectx->dpic = "-DPIC"; - *ectx->fpic = "-fPIC"; - } + + if (!(dctx->cctx->drvflags & SLBT_DRIVER_ANTI_PIC)) + if (dctx->cctx->settings.picswitch) + *ectx->fpic = dctx->cctx->settings.picswitch; *ectx->lout[0] = "-o"; *ectx->lout[1] = ectx->lobjname; @@ -91,10 +93,12 @@ int slbt_exec_compile( if (dctx->cctx->drvflags & SLBT_DRIVER_STATIC) { slbt_reset_placeholders(ectx); - if (dctx->cctx->drvflags & SLBT_DRIVER_PRO_PIC) { + if (dctx->cctx->drvflags & SLBT_DRIVER_PRO_PIC) *ectx->dpic = "-DPIC"; - *ectx->fpic = "-fPIC"; - } + + if (dctx->cctx->drvflags & SLBT_DRIVER_PRO_PIC) + if (dctx->cctx->settings.picswitch) + *ectx->fpic = dctx->cctx->settings.picswitch; *ectx->lout[0] = "-o"; *ectx->lout[1] = ectx->aobjname; diff --git a/src/logic/slbt_exec_link.c b/src/logic/slbt_exec_link.c index 4f422d2..a2501b9 100644 --- a/src/logic/slbt_exec_link.c +++ b/src/logic/slbt_exec_link.c @@ -1221,9 +1221,11 @@ static int slbt_exec_link_create_library( /* shared/static */ if (dctx->cctx->drvflags & SLBT_DRIVER_ALL_STATIC) { *ectx->dpic = "-static"; + } else if (dctx->cctx->settings.picswitch) { + *ectx->dpic = "-shared"; + *ectx->fpic = dctx->cctx->settings.picswitch; } else { *ectx->dpic = "-shared"; - *ectx->fpic = "-fPIC"; } /* output */