Index: src/SynTree/FunctionDecl.cc
===================================================================
--- src/SynTree/FunctionDecl.cc	(revision 0270824d417173d850d0b904d76e8e5873a6ec65)
+++ src/SynTree/FunctionDecl.cc	(revision 981bdc611ba9967f6a7ef2dec163e17a63effb7d)
@@ -23,4 +23,6 @@
 #include "InitTweak/InitTweak.h"
 
+extern bool translation_unit_nomain;
+
 FunctionDecl::FunctionDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Spec linkage, FunctionType *type, CompoundStmt *statements, bool isInline, bool isNoreturn, std::list< Attribute * > attributes )
 		: Parent( name, sc, linkage, attributes ), type( type ), statements( statements ) {
@@ -30,5 +32,5 @@
 	// because we want to replace the main even if it is inside an extern
 	if ( name == "main" ) {
-		set_linkage( LinkageSpec::Cforall );
+		set_linkage( translation_unit_nomain ? LinkageSpec::C : LinkageSpec::Cforall );
 	} // if
 }
Index: src/main.cc
===================================================================
--- src/main.cc	(revision 0270824d417173d850d0b904d76e8e5873a6ec65)
+++ src/main.cc	(revision 981bdc611ba9967f6a7ef2dec163e17a63effb7d)
@@ -66,4 +66,5 @@
 	nopreludep = false,
 	noprotop = false,
+	nomainp = false,
 	parsep = false,
 	resolvep = false,									// used in AlternativeFinder
@@ -79,4 +80,5 @@
 static void dump( list< Declaration * > & translationUnit, ostream & out = cout );
 
+bool translation_unit_nomain = true;
 std::unique_ptr<FunctionDecl> translation_unit_main_signature = nullptr;
 
@@ -157,4 +159,5 @@
 
 	parse_cmdline( argc, argv, filename );				// process command-line arguments
+	translation_unit_nomain = nomainp;
 
 	try {
@@ -375,5 +378,5 @@
 
 	int c;
-	while ( (c = getopt_long( argc, argv, "abBcefglnpqrstTvyzD:F:", long_opts, &long_index )) != -1 ) {
+	while ( (c = getopt_long( argc, argv, "abBcefglmnpqrstTvyzD:F:", long_opts, &long_index )) != -1 ) {
 		switch ( c ) {
 		  case Ast:
@@ -415,4 +418,7 @@
 		  case 'p':										// generate prototypes for preamble functions
 			noprotop = true;
+			break;
+		  case 'm':										// don't replace the main
+		  	nomainp = true;
 			break;
 		  case Parse:
Index: src/prelude/Makefile.am
===================================================================
--- src/prelude/Makefile.am	(revision 0270824d417173d850d0b904d76e8e5873a6ec65)
+++ src/prelude/Makefile.am	(revision 981bdc611ba9967f6a7ef2dec163e17a63effb7d)
@@ -20,5 +20,5 @@
 # put into lib for now
 cfalibdir = ${libdir}
-cfalib_DATA = builtins.cf extras.cf prelude.cf
+cfalib_DATA = builtins.cf extras.cf prelude.cf bootloader.c
 noinst_DATA = ../libcfa/libcfa-prelude.c
 
@@ -45,4 +45,6 @@
 	${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -l prelude.cf $@  # use src/cfa-cpp as not in lib until after install
 
+bootloader.c : bootloader.cf extras.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp
+	${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -tpm bootloader.cf $@  # use src/cfa-cpp as not in lib until after install
 
-MAINTAINERCLEANFILES = builtins.c builtins.cf extras.cf ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}}
+MAINTAINERCLEANFILES = builtins.c builtins.cf extras.cf bootloader.c ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}}
Index: src/prelude/Makefile.in
===================================================================
--- src/prelude/Makefile.in	(revision 0270824d417173d850d0b904d76e8e5873a6ec65)
+++ src/prelude/Makefile.in	(revision 981bdc611ba9967f6a7ef2dec163e17a63effb7d)
@@ -210,7 +210,7 @@
 # put into lib for now
 cfalibdir = ${libdir}
-cfalib_DATA = builtins.cf extras.cf prelude.cf
+cfalib_DATA = builtins.cf extras.cf prelude.cf bootloader.c
 noinst_DATA = ../libcfa/libcfa-prelude.c
-MAINTAINERCLEANFILES = builtins.c builtins.cf extras.cf ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}}
+MAINTAINERCLEANFILES = builtins.c builtins.cf extras.cf bootloader.c ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}}
 all: all-am
 
@@ -441,4 +441,7 @@
 	${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -l prelude.cf $@  # use src/cfa-cpp as not in lib until after install
 
+bootloader.c : bootloader.cf extras.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp
+	${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -tpm bootloader.cf $@  # use src/cfa-cpp as not in lib until after install
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
Index: src/prelude/bootloader.cf
===================================================================
--- src/prelude/bootloader.cf	(revision 981bdc611ba9967f6a7ef2dec163e17a63effb7d)
+++ src/prelude/bootloader.cf	(revision 981bdc611ba9967f6a7ef2dec163e17a63effb7d)
@@ -0,0 +1,5 @@
+extern int invoke_main(int argc, char* argv[], char* envp[]);
+
+int main(int argc, char* argv[], char* envp[]) {
+	return invoke_main(argc, argv, envp);
+}
