From fbda3a30a94210a48e797fa9c9dc635f3afaceb9 Mon Sep 17 00:00:00 2001 From: midipix Date: Wed, 25 Oct 2017 22:26:30 -0400 Subject: driver: added --mdso and --implib support. --- include/slibtool/slibtool.h | 6 +++++ src/driver/slbt_driver_ctx.c | 44 +++++++++++++++++++++++++++++++++++++ src/internal/slibtool_driver_impl.h | 3 +++ src/output/slbt_output_config.c | 6 +++++ src/skin/slbt_skin_default.c | 11 ++++++++++ 5 files changed, 70 insertions(+) diff --git a/include/slibtool/slibtool.h b/include/slibtool/slibtool.h index 25820be..c320ee9 100644 --- a/include/slibtool/slibtool.h +++ b/include/slibtool/slibtool.h @@ -26,6 +26,8 @@ extern "C" { #define SLBT_ERROR 0x02 /* driver flags */ +#define SLBT_DRIVER_XFLAG(x) ((uint64_t)x << 32) + #define SLBT_DRIVER_VERBOSITY_NONE 0x0000 #define SLBT_DRIVER_VERBOSITY_ERRORS 0x0001 #define SLBT_DRIVER_VERBOSITY_STATUS 0x0002 @@ -63,6 +65,9 @@ extern "C" { #define SLBT_DRIVER_ANNOTATE_NEVER 0x20000000 #define SLBT_DRIVER_ANNOTATE_FULL 0x40000000 +#define SLBT_DRIVER_IMPLIB_IDATA SLBT_DRIVER_XFLAG(0x0001) +#define SLBT_DRIVER_IMPLIB_DSOMETA SLBT_DRIVER_XFLAG(0x0002) + /* error flags */ #define SLBT_ERROR_TOP_LEVEL 0x0001 #define SLBT_ERROR_NESTED 0x0002 @@ -189,6 +194,7 @@ struct slbt_host_params { const char * ar; const char * ranlib; const char * dlltool; + const char * mdso; const char * ldrpath; }; diff --git a/src/driver/slbt_driver_ctx.c b/src/driver/slbt_driver_ctx.c index 8100e0a..8d2fa6e 100644 --- a/src/driver/slbt_driver_ctx.c +++ b/src/driver/slbt_driver_ctx.c @@ -532,6 +532,31 @@ static int slbt_init_host_params( host->dlltool = drvhost->dlltool; } + /* mdso */ + if (host->mdso) + cfgmeta->mdso = cfgexplicit; + + else if (strcmp(host->flavor,"cygwin") + && strcmp(host->flavor,"midipix") + && strcmp(host->flavor,"mingw")) { + host->mdso = ""; + cfgmeta->mdso = "not applicable"; + + } else { + if (!(drvhost->mdso = calloc(1,toollen))) + return -1; + + if (fnative) { + strcpy(drvhost->mdso,"mdso"); + cfgmeta->mdso = cfgnative; + } else { + sprintf(drvhost->mdso,"%s-mdso",host->host); + cfgmeta->mdso = cfghost; + } + + host->mdso = drvhost->mdso; + } + return 0; } @@ -555,6 +580,9 @@ static void slbt_free_host_params(struct slbt_host_strs * host) if (host->dlltool) free(host->dlltool); + if (host->mdso) + free(host->mdso); + memset(host,0,sizeof(*host)); } @@ -902,6 +930,18 @@ int slbt_get_driver_ctx( break; + case TAG_IMPLIB: + if (!strcmp("idata",entry->arg)) { + cctx.drvflags |= SLBT_DRIVER_IMPLIB_IDATA; + cctx.drvflags &= ~(uint64_t)SLBT_DRIVER_IMPLIB_DSOMETA; + + } else if (!strcmp("never",entry->arg)) { + cctx.drvflags |= SLBT_DRIVER_IMPLIB_DSOMETA; + cctx.drvflags &= ~(uint64_t)SLBT_DRIVER_IMPLIB_IDATA; + } + + break; + case TAG_WARNINGS: if (!strcmp("all",entry->arg)) cctx.warnings = SLBT_WARNING_LEVEL_ALL; @@ -963,6 +1003,10 @@ int slbt_get_driver_ctx( cctx.host.dlltool = entry->arg; break; + case TAG_MDSO: + cctx.host.mdso = entry->arg; + break; + case TAG_OUTPUT: cctx.output = entry->arg; break; diff --git a/src/internal/slibtool_driver_impl.h b/src/internal/slibtool_driver_impl.h index b630126..b255042 100644 --- a/src/internal/slibtool_driver_impl.h +++ b/src/internal/slibtool_driver_impl.h @@ -35,6 +35,8 @@ enum app_tags { TAG_AR, TAG_RANLIB, TAG_DLLTOOL, + TAG_MDSO, + TAG_IMPLIB, TAG_OUTPUT, TAG_BINDIR, TAG_LDRPATH, @@ -71,6 +73,7 @@ struct slbt_host_strs { char * ar; char * ranlib; char * dlltool; + char * mdso; }; struct slbt_driver_ctx_impl { diff --git a/src/output/slbt_output_config.c b/src/output/slbt_output_config.c index d1d9712..800c6c3 100644 --- a/src/output/slbt_output_config.c +++ b/src/output/slbt_output_config.c @@ -63,6 +63,9 @@ int slbt_output_config(const struct slbt_driver_ctx * dctx) if ((len = strlen(cctx->host.dlltool)) > midwidth) midwidth = len; + if ((len = strlen(cctx->host.mdso)) > midwidth) + midwidth = len; + midwidth += SLBT_TAB_WIDTH; midwidth &= (~(SLBT_TAB_WIDTH-1)); @@ -93,6 +96,9 @@ int slbt_output_config(const struct slbt_driver_ctx * dctx) if (slbt_output_config_line("dlltool",cctx->host.dlltool,cctx->cfgmeta.dlltool,midwidth)) return SLBT_SYSTEM_ERROR(dctx); + if (slbt_output_config_line("mdso",cctx->host.mdso,cctx->cfgmeta.mdso,midwidth)) + return SLBT_SYSTEM_ERROR(dctx); + return fflush(stdout) ? SLBT_SYSTEM_ERROR(dctx) : 0; diff --git a/src/skin/slbt_skin_default.c b/src/skin/slbt_skin_default.c index 40eb189..ceb4d30 100644 --- a/src/skin/slbt_skin_default.c +++ b/src/skin/slbt_skin_default.c @@ -91,6 +91,17 @@ const struct argv_option slbt_default_options[] = { "explicitly specify the PE import library generator " "to be used"}, + {"mdso", 0,TAG_MDSO,ARGV_OPTARG_REQUIRED,0,0,"", + "explicitly specify the PE custom import library " + "generator to be used"}, + + {"implib", 0,TAG_IMPLIB,ARGV_OPTARG_REQUIRED,0, + "idata|dsometa",0, + "PE import libraries should either use the legacy " + "format (.idata section) and be generated by dlltool, " + "or the custom format (.dsometa section) and be " + "generated by mdso"}, + {"warnings", 0,TAG_WARNINGS,ARGV_OPTARG_REQUIRED,0, "all|none|error",0, "set the warning reporting level; " -- cgit v1.2.3