summaryrefslogtreecommitdiff
path: root/src/driver/slbt_driver_ctx.c
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2024-03-05 00:14:03 +0000
committermidipix <writeonce@midipix.org>2024-03-05 01:12:54 +0000
commit8ef9e14afc6d97e6cf2da17995c3278f7309cf25 (patch)
treed72b6e1bb57dfd3c3c22355ab9cb66078aa8fae8 /src/driver/slbt_driver_ctx.c
parent4451024fec461fdcd1ee4f01fa2366685cb4b245 (diff)
downloadslibtool-8ef9e14afc6d97e6cf2da17995c3278f7309cf25.tar.bz2
slibtool-8ef9e14afc6d97e6cf2da17995c3278f7309cf25.tar.xz
driver: finalized support of -`-dlpreopen self` and `-dlpreopen force`.
Diffstat (limited to 'src/driver/slbt_driver_ctx.c')
-rw-r--r--src/driver/slbt_driver_ctx.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/driver/slbt_driver_ctx.c b/src/driver/slbt_driver_ctx.c
index 5fed282..0e4ebda 100644
--- a/src/driver/slbt_driver_ctx.c
+++ b/src/driver/slbt_driver_ctx.c
@@ -1012,7 +1012,15 @@ int slbt_lib_get_driver_ctx(
if (entry->fopt) {
switch (entry->tag) {
case TAG_DLPREOPEN:
- *dlopenv++ = entry->arg;
+ if (!strcmp(entry->arg,"self")) {
+ ctx->cctx.drvflags |= SLBT_DRIVER_DLPREOPEN_SELF;
+
+ } else if (!strcmp(entry->arg,"force")) {
+ ctx->cctx.drvflags |= SLBT_DRIVER_DLPREOPEN_FORCE;
+
+ } else {
+ *dlopenv++ = entry->arg;
+ }
default:
break;
@@ -1021,6 +1029,22 @@ int slbt_lib_get_driver_ctx(
}
}
+ /* -dlopen & -dlpreopen semantic validation */
+ uint64_t fmask;
+
+ fmask = SLBT_DRIVER_DLOPEN_SELF | SLBT_DRIVER_DLPREOPEN_SELF;
+ fmask |= SLBT_DRIVER_DLOPEN_FORCE | SLBT_DRIVER_DLPREOPEN_FORCE;
+
+ if (ctx->cctx.libname && (cctx.drvflags & fmask)) {
+ slbt_dprintf(ctx->fdctx.fderr,
+ "%s: error: -dlopen/-dlpreopen: "
+ "the special 'self' and 'force' arguments "
+ "may only be used when linking a program.\n",
+ ctx->ctx.program);
+
+ return slbt_lib_get_driver_ctx_fail(&ctx->ctx,0);
+ }
+
/* all ready */
*pctx = &ctx->ctx;