summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/slibtool/slibtool.h1
-rw-r--r--src/driver/slbt_driver_ctx.c14
-rw-r--r--src/host/slbt_host_params.c25
-rw-r--r--src/internal/slibtool_driver_impl.h4
-rw-r--r--src/internal/slibtool_lconf_impl.c13
-rw-r--r--src/output/slbt_output_info.c6
-rw-r--r--src/skin/slbt_skin_default.c3
7 files changed, 65 insertions, 1 deletions
diff --git a/include/slibtool/slibtool.h b/include/slibtool/slibtool.h
index 320a614..4940e9e 100644
--- a/include/slibtool/slibtool.h
+++ b/include/slibtool/slibtool.h
@@ -272,6 +272,7 @@ struct slbt_host_params {
const char * flavor;
const char * ar;
const char * as;
+ const char * nm;
const char * ranlib;
const char * windres;
const char * dlltool;
diff --git a/src/driver/slbt_driver_ctx.c b/src/driver/slbt_driver_ctx.c
index b3fe43a..c9cbdd6 100644
--- a/src/driver/slbt_driver_ctx.c
+++ b/src/driver/slbt_driver_ctx.c
@@ -397,6 +397,7 @@ int slbt_lib_get_driver_ctx(
const char * cfgmeta_host;
const char * cfgmeta_ar;
const char * cfgmeta_as;
+ const char * cfgmeta_nm;
const char * cfgmeta_ranlib;
const char * cfgmeta_dlltool;
@@ -455,6 +456,7 @@ int slbt_lib_get_driver_ctx(
cfgmeta_host = 0;
cfgmeta_ar = 0;
cfgmeta_as = 0;
+ cfgmeta_nm = 0;
cfgmeta_ranlib = 0;
cfgmeta_dlltool = 0;
@@ -662,6 +664,11 @@ int slbt_lib_get_driver_ctx(
cfgmeta_as = cfgexplicit;
break;
+ case TAG_NM:
+ cctx.host.nm = entry->arg;
+ cfgmeta_nm = cfgexplicit;
+ break;
+
case TAG_RANLIB:
cctx.host.ranlib = entry->arg;
cfgmeta_ranlib = cfgexplicit;
@@ -888,6 +895,9 @@ int slbt_lib_get_driver_ctx(
if (ctx->cctx.host.as && !cfgmeta_as)
cfgmeta_as = cfglconf;
+ if (ctx->cctx.host.nm && !cfgmeta_nm)
+ cfgmeta_nm = cfglconf;
+
if (ctx->cctx.host.ranlib && !cfgmeta_ranlib)
cfgmeta_ranlib = cfglconf;
@@ -936,6 +946,7 @@ int slbt_lib_get_driver_ctx(
cfgmeta_host,
cfgmeta_ar,
cfgmeta_as,
+ cfgmeta_nm,
cfgmeta_ranlib,
cfgmeta_dlltool))
return slbt_lib_get_driver_ctx_fail(&ctx->ctx,0);
@@ -944,6 +955,9 @@ int slbt_lib_get_driver_ctx(
if (slbt_driver_parse_tool_argv(ctx->cctx.host.ar,&ctx->host.ar_argv) < 0)
return slbt_lib_get_driver_ctx_fail(&ctx->ctx,0);
+ if (slbt_driver_parse_tool_argv(ctx->cctx.host.nm,&ctx->host.nm_argv) < 0)
+ return slbt_lib_get_driver_ctx_fail(&ctx->ctx,0);
+
if (slbt_driver_parse_tool_argv(ctx->cctx.host.ranlib,&ctx->host.ranlib_argv) < 0)
return slbt_lib_get_driver_ctx_fail(&ctx->ctx,0);
diff --git a/src/host/slbt_host_params.c b/src/host/slbt_host_params.c
index e140885..5c862a4 100644
--- a/src/host/slbt_host_params.c
+++ b/src/host/slbt_host_params.c
@@ -88,6 +88,7 @@ slbt_hidden int slbt_init_host_params(
const char * cfgmeta_host,
const char * cfgmeta_ar,
const char * cfgmeta_as,
+ const char * cfgmeta_nm,
const char * cfgmeta_ranlib,
const char * cfgmeta_dlltool)
{
@@ -340,6 +341,24 @@ slbt_hidden int slbt_init_host_params(
host->as = drvhost->as;
}
+ /* nm */
+ if (host->nm)
+ cfgmeta->nm = cfgmeta_nm ? cfgmeta_nm : cfgexplicit;
+ else {
+ if (!(drvhost->nm = calloc(1,toollen)))
+ return -1;
+
+ if (fnative) {
+ strcpy(drvhost->nm,"nm");
+ cfgmeta->nm = cfgnative;
+ } else {
+ sprintf(drvhost->nm,"%s-nm",host->host);
+ cfgmeta->nm = cfghost;
+ }
+
+ host->nm = drvhost->nm;
+ }
+
/* ranlib */
if (host->ranlib)
cfgmeta->ranlib = cfgmeta_ranlib ? cfgmeta_ranlib : cfgexplicit;
@@ -469,6 +488,9 @@ slbt_hidden void slbt_free_host_params(struct slbt_host_strs * host)
if (host->as)
free(host->as);
+ if (host->nm)
+ free(host->nm);
+
if (host->ranlib)
free(host->ranlib);
@@ -483,6 +505,7 @@ slbt_hidden void slbt_free_host_params(struct slbt_host_strs * host)
slbt_free_host_tool_argv(host->ar_argv);
slbt_free_host_tool_argv(host->as_argv);
+ slbt_free_host_tool_argv(host->nm_argv);
slbt_free_host_tool_argv(host->ranlib_argv);
slbt_free_host_tool_argv(host->windres_argv);
slbt_free_host_tool_argv(host->dlltool_argv);
@@ -534,7 +557,7 @@ int slbt_host_set_althost(
&ictx->ctx.ahost,
&ictx->ctx.cctx.ahost,
&ictx->ctx.cctx.acfgmeta,
- 0,0,0,0,0)) {
+ 0,0,0,0,0,0)) {
slbt_free_host_params(&ictx->ctx.ahost);
return SLBT_CUSTOM_ERROR(ctx,SLBT_ERR_HOST_INIT);
}
diff --git a/src/internal/slibtool_driver_impl.h b/src/internal/slibtool_driver_impl.h
index 3b989b5..656c113 100644
--- a/src/internal/slibtool_driver_impl.h
+++ b/src/internal/slibtool_driver_impl.h
@@ -47,6 +47,7 @@ enum app_tags {
TAG_FLAVOR,
TAG_AR,
TAG_AS,
+ TAG_NM,
TAG_RANLIB,
TAG_WINDRES,
TAG_DLLTOOL,
@@ -114,12 +115,14 @@ struct slbt_host_strs {
char * flavor;
char * ar;
char * as;
+ char * nm;
char * ranlib;
char * windres;
char * dlltool;
char * mdso;
char ** ar_argv;
char ** as_argv;
+ char ** nm_argv;
char ** ranlib_argv;
char ** windres_argv;
char ** dlltool_argv;
@@ -284,6 +287,7 @@ int slbt_init_host_params(
const char * cfgmeta_host,
const char * cfgmeta_ar,
const char * cfgmeta_as,
+ const char * cfgmeta_nm,
const char * cfgmeta_ranlib,
const char * cfgmeta_dlltool);
diff --git a/src/internal/slibtool_lconf_impl.c b/src/internal/slibtool_lconf_impl.c
index f6bfd36..b96e4f9 100644
--- a/src/internal/slibtool_lconf_impl.c
+++ b/src/internal/slibtool_lconf_impl.c
@@ -819,6 +819,19 @@ slbt_hidden int slbt_get_lconf_flags(
}
+ /* nm tool */
+ if (!ctx->cctx.host.nm) {
+ if (slbt_get_lconf_var(confctx,"NM=",0x20,&val) < 0)
+ return SLBT_CUSTOM_ERROR(
+ dctx,SLBT_ERR_LCONF_PARSE);
+
+ if (val[0] && !(ctx->host.nm = strdup(val)))
+ return SLBT_SYSTEM_ERROR(dctx,0);
+
+ ctx->cctx.host.nm = ctx->host.nm;
+ }
+
+
/* ranlib tool */
if (!ctx->cctx.host.ranlib) {
if (slbt_get_lconf_var(confctx,"RANLIB=",0x20,&val) < 0)
diff --git a/src/output/slbt_output_info.c b/src/output/slbt_output_info.c
index 92106a7..a95324d 100644
--- a/src/output/slbt_output_info.c
+++ b/src/output/slbt_output_info.c
@@ -65,6 +65,9 @@ int slbt_output_info(const struct slbt_driver_ctx * dctx)
if ((len = strlen(cctx->host.as)) > midwidth)
midwidth = len;
+ if ((len = strlen(cctx->host.nm)) > midwidth)
+ midwidth = len;
+
if ((len = strlen(cctx->host.ranlib)) > midwidth)
midwidth = len;
@@ -104,6 +107,9 @@ int slbt_output_info(const struct slbt_driver_ctx * dctx)
if (slbt_output_info_line(fdout,"as",cctx->host.as,cctx->cfgmeta.as,midwidth))
return SLBT_SYSTEM_ERROR(dctx,0);
+ if (slbt_output_info_line(fdout,"nm",cctx->host.nm,cctx->cfgmeta.nm,midwidth))
+ return SLBT_SYSTEM_ERROR(dctx,0);
+
if (slbt_output_info_line(fdout,"ranlib",cctx->host.ranlib,cctx->cfgmeta.ranlib,midwidth))
return SLBT_SYSTEM_ERROR(dctx,0);
diff --git a/src/skin/slbt_skin_default.c b/src/skin/slbt_skin_default.c
index 50d46b2..a6cc9b2 100644
--- a/src/skin/slbt_skin_default.c
+++ b/src/skin/slbt_skin_default.c
@@ -117,6 +117,9 @@ const slbt_hidden struct argv_option slbt_default_options[] = {
{"as", 0,TAG_AS,ARGV_OPTARG_REQUIRED,0,0,"<as>",
"explicitly specify the assembler to be used (with dlltool)"},
+ {"nm", 0,TAG_NM,ARGV_OPTARG_REQUIRED,0,0,"<nm>",
+ "explicitly specify the name mangler to be used"},
+
{"ranlib", 0,TAG_RANLIB,ARGV_OPTARG_REQUIRED,0,0,"<ranlib>",
"explicitly specify the librarian to be used"},