diff --git a/project/common.mk b/project/common.mk
index f55726a..b00f745 100644
--- a/project/common.mk
+++ b/project/common.mk
@@ -1,4 +1,5 @@
 COMMON_SRCS = \
+	src/internal/slibtool_objmeta_impl.c \
 	src/internal/slibtool_symlink_impl.c \
 	src/driver/slbt_driver_ctx.c \
 	src/driver/slbt_unit_ctx.c \
diff --git a/project/headers.mk b/project/headers.mk
index bca122f..eb78201 100644
--- a/project/headers.mk
+++ b/project/headers.mk
@@ -6,6 +6,7 @@ INTERNAL_HEADERS = \
 	$(PROJECT_DIR)/src/internal/argv/argv.h \
 	$(PROJECT_DIR)/src/internal/$(PACKAGE)_driver_impl.h \
 	$(PROJECT_DIR)/src/internal/$(PACKAGE)_install_impl.h \
+	$(PROJECT_DIR)/src/internal/$(PACKAGE)_metafile_impl.h \
 	$(PROJECT_DIR)/src/internal/$(PACKAGE)_mkdir_impl.h \
 	$(PROJECT_DIR)/src/internal/$(PACKAGE)_readlink_impl.h \
 	$(PROJECT_DIR)/src/internal/$(PACKAGE)_spawn_impl.h \
diff --git a/src/internal/slibtool_metafile_impl.h b/src/internal/slibtool_metafile_impl.h
new file mode 100644
index 0000000..9a56db2
--- /dev/null
+++ b/src/internal/slibtool_metafile_impl.h
@@ -0,0 +1,11 @@
+/*******************************************************************/
+/*  slibtool: a skinny libtool implementation, written in C        */
+/*  Copyright (C) 2016  Z. Gilboa                                  */
+/*  Released under the Standard MIT License; see COPYING.SLIBTOOL. */
+/*******************************************************************/
+
+#include <slibtool/slibtool.h>
+
+int  slbt_create_object_wrapper(
+	const struct slbt_driver_ctx *	dctx,
+	struct slbt_exec_ctx *		ectx);
diff --git a/src/internal/slibtool_objmeta_impl.c b/src/internal/slibtool_objmeta_impl.c
new file mode 100644
index 0000000..e37d1eb
--- /dev/null
+++ b/src/internal/slibtool_objmeta_impl.c
@@ -0,0 +1,63 @@
+/*******************************************************************/
+/*  slibtool: a skinny libtool implementation, written in C        */
+/*  Copyright (C) 2016  Z. Gilboa                                  */
+/*  Released under the Standard MIT License; see COPYING.SLIBTOOL. */
+/*******************************************************************/
+
+#include <stdio.h>
+#include <slibtool/slibtool.h>
+#include "slibtool_metafile_impl.h"
+
+static int  slbt_create_default_object_wrapper(
+	const struct slbt_driver_ctx *	dctx,
+	struct slbt_exec_ctx *		ectx)
+{
+	int					ret;
+	FILE *					fout;
+	const struct slbt_source_version *	verinfo;
+
+	if (!(fout = fopen(ectx->ltobjname,"w")))
+		return -1;
+
+	verinfo = slbt_source_version();
+
+	ret = fprintf(fout,
+		"# libtool compatible object wrapper\n"
+		"# Generated by %s (slibtool %d.%d.%d)\n"
+		"# [commit reference: %s]\n\n"
+
+		"pic_object='%s'\n"
+		"non_pic_object='%s'\n",
+
+		dctx->program,
+		verinfo->major,verinfo->minor,verinfo->revision,
+		verinfo->commit,
+
+		(dctx->cctx->drvflags & SLBT_DRIVER_SHARED)
+			? ectx->lobjname
+			: "none",
+		(dctx->cctx->drvflags & SLBT_DRIVER_STATIC)
+			? ectx->aobjname
+			: "none");
+
+	return (ret <= 0) || fclose(fout)
+		? -1 : 0;
+}
+
+static int  slbt_create_compatible_object_wrapper(
+	const struct slbt_driver_ctx *	dctx,
+	struct slbt_exec_ctx *		ectx)
+{
+	/* awaiting submission */
+	return slbt_create_default_object_wrapper(dctx,ectx);
+}
+
+int  slbt_create_object_wrapper(
+	const struct slbt_driver_ctx *	dctx,
+	struct slbt_exec_ctx *		ectx)
+{
+	if (dctx->cctx->drvflags & SLBT_DRIVER_LEGABITS)
+		return slbt_create_compatible_object_wrapper(dctx,ectx);
+	else
+		return slbt_create_default_object_wrapper(dctx,ectx);
+}
diff --git a/src/logic/slbt_exec_compile.c b/src/logic/slbt_exec_compile.c
index 4a75270..90df731 100644
--- a/src/logic/slbt_exec_compile.c
+++ b/src/logic/slbt_exec_compile.c
@@ -13,6 +13,7 @@
 #include <slibtool/slibtool.h>
 #include "slibtool_spawn_impl.h"
 #include "slibtool_mkdir_impl.h"
+#include "slibtool_metafile_impl.h"
 
 static int slbt_exec_compile_remove_file(
 	const struct slbt_driver_ctx *	dctx,
@@ -36,9 +37,7 @@ int  slbt_exec_compile(
 	struct slbt_exec_ctx *		ectx)
 {
 	int			ret;
-	FILE *			fout;
 	struct slbt_exec_ctx *	actx = 0;
-	const struct slbt_source_version * verinfo;
 
 	/* dry run */
 	if (dctx->cctx->drvflags & SLBT_DRIVER_DRY_RUN)
@@ -133,35 +132,8 @@ int  slbt_exec_compile(
 		}
 	}
 
-	/* libtool object */
-	if (!(fout = fopen(ectx->ltobjname,"w"))) {
-		slbt_free_exec_ctx(actx);
-		return -1;
-	}
-
-	verinfo = slbt_source_version();
-
-	ret = fprintf(fout,
-		"# libtool compatible object wrapper\n"
-		"# Generated by %s (slibtool %d.%d.%d)\n"
-		"# [commit reference: %s]\n\n"
-
-		"pic_object='%s'\n"
-		"non_pic_object='%s'\n",
-
-		dctx->program,
-		verinfo->major,verinfo->minor,verinfo->revision,
-		verinfo->commit,
-
-		(dctx->cctx->drvflags & SLBT_DRIVER_SHARED)
-			? ectx->lobjname
-			: "none",
-		(dctx->cctx->drvflags & SLBT_DRIVER_STATIC)
-			? ectx->aobjname
-			: "none");
-
-	fclose(fout);
+	ret = slbt_create_object_wrapper(dctx,ectx);
 	slbt_free_exec_ctx(actx);
 
-	return (ret > 0) ? 0 : -1;
+	return ret;
 }