diff --git a/include/slibtool/slibtool.h b/include/slibtool/slibtool.h
index 38405a0..785dae6 100644
--- a/include/slibtool/slibtool.h
+++ b/include/slibtool/slibtool.h
@@ -135,6 +135,7 @@ struct slbt_exec_ctx {
 	char *	dsofilename;
 	char *	relfilename;
 	char *	deffilename;
+	char *	rpathfilename;
 	char *	dimpfilename;
 	char *	pimpfilename;
 	char *	vimpfilename;
diff --git a/src/logic/slbt_exec_ctx.c b/src/logic/slbt_exec_ctx.c
index e874ec6..e9e7340 100644
--- a/src/logic/slbt_exec_ctx.c
+++ b/src/logic/slbt_exec_ctx.c
@@ -72,7 +72,7 @@ static struct slbt_exec_ctx_impl * slbt_exec_ctx_alloc(
 
 	/* clerical [worst-case] buffer size (guard, .libs, version) */
 	size  = strlen(".lo") + 1;
-	size +=  8 * (strlen(".libs/") + 1);
+	size += 12 * (strlen(".libs/") + 1);
 	size += 36 * (strlen(".0000") + 1);
 
 	/* buffer size (cargv, -Wc) */
@@ -237,6 +237,10 @@ int  slbt_get_exec_ctx(
 
 	ictx->ctx.lout[0] = &ictx->ctx.argv[i++];
 	ictx->ctx.lout[1] = &ictx->ctx.argv[i++];
+
+	ictx->ctx.rpath[0] = &ictx->ctx.argv[i++];
+	ictx->ctx.rpath[1] = &ictx->ctx.argv[i++];
+
 	ictx->ctx.sentinel= &ictx->ctx.argv[i++];
 
 	slbt_reset_placeholders(&ictx->ctx);
@@ -326,6 +330,15 @@ int  slbt_get_exec_ctx(
 				dctx->cctx->settings.dsosuffix);
 		ch++;
 
+		/* rpathfilename */
+		ictx->ctx.rpathfilename = ch;
+		ch += sprintf(ch,"%s%s%s%s.slibtool.rpath",
+				ictx->ctx.ldirname,
+				dsoprefix,
+				dctx->cctx->libname,
+				dctx->cctx->settings.dsosuffix);
+		ch++;
+
 		/* default implib file name */
 		ictx->ctx.dimpfilename = ch;
 		ch += sprintf(ch,"%s%s%s%s",