summaryrefslogtreecommitdiff
path: root/src/logic/slbt_exec_ctx.c
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2024-03-09 23:09:24 +0000
committermidipix <writeonce@midipix.org>2024-03-10 02:40:15 +0000
commitd054ee34663b98b4387690f83ac4d836891f9743 (patch)
tree20737807aa5c8885eb07bad4aa532083a73db303 /src/logic/slbt_exec_ctx.c
parent9c46bdbfb161a06b5a3c0559abb456961ca519f9 (diff)
downloadslibtool-d054ee34663b98b4387690f83ac4d836891f9743.tar.bz2
slibtool-d054ee34663b98b4387690f83ac4d836891f9743.tar.xz
link mode: dlopen/dlpreopen the static archive as needed.
Diffstat (limited to 'src/logic/slbt_exec_ctx.c')
-rw-r--r--src/logic/slbt_exec_ctx.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/src/logic/slbt_exec_ctx.c b/src/logic/slbt_exec_ctx.c
index 0564218..b1177db 100644
--- a/src/logic/slbt_exec_ctx.c
+++ b/src/logic/slbt_exec_ctx.c
@@ -205,6 +205,7 @@ int slbt_ectx_get_exec_ctx(
{
struct slbt_exec_ctx_impl * ictx;
struct slbt_driver_ctx_impl * idctx;
+ struct slbt_error_info** errinfp;
uint64_t fmask;
char ** parg;
char ** src;
@@ -635,12 +636,30 @@ int slbt_ectx_get_exec_ctx(
for (; *dlopenv; ) {
arname = ictx->sbuf;
strcpy(arname,*dlopenv);
- slbt_adjust_wrapper_argument(arname,true);
- if (slbt_ar_get_archive_ctx(dctx,arname,dlactxv) < 0)
- return slbt_ectx_free_exec_ctx_impl(
- ictx,
- SLBT_NESTED_ERROR(dctx));
+ slbt_adjust_wrapper_argument(
+ arname,true,
+ ".expsyms.a");
+
+ errinfp = idctx->errinfp;
+
+ if (slbt_ar_get_archive_ctx(dctx,arname,dlactxv) < 0) {
+ strcpy(arname,*dlopenv);
+
+ slbt_adjust_wrapper_argument(
+ arname,true,
+ dctx->cctx->settings.arsuffix);
+
+ if (slbt_ar_get_archive_ctx(dctx,arname,dlactxv) < 0)
+ return slbt_ectx_free_exec_ctx_impl(
+ ictx,
+ SLBT_NESTED_ERROR(dctx));
+
+ idctx->errinfp = errinfp;
+
+ for (; *errinfp; )
+ *errinfp++ = 0;
+ }
if (slbt_ar_update_syminfo(*dlactxv,&ictx->ctx) < 0)
return slbt_ectx_free_exec_ctx_impl(