Handle indirect calls to functions in external modules
Modified: trunk/reactos/tools/rbuild/testsupportcode.cpp

Modified: trunk/reactos/tools/rbuild/testsupportcode.cpp
--- trunk/reactos/tools/rbuild/testsupportcode.cpp	2005-11-20 09:09:19 UTC (rev 19358)
+++ trunk/reactos/tools/rbuild/testsupportcode.cpp	2005-11-20 13:12:33 UTC (rev 19359)
@@ -139,34 +139,57 @@
 }
 
 string
-GetImportSymbol ( const StubbedSymbol& symbol )
+GetLinkerSymbol ( const StubbedSymbol& symbol )
 {
 	if (symbol.symbol[0] == '@')
+		return symbol.symbol;
+	else
+		return "_" + symbol.symbol;
+}
+
+string
+GetLinkerImportSymbol ( const StubbedSymbol& symbol )
+{
+	if (symbol.symbol[0] == '@')
 		return "__imp_" + symbol.symbol;
 	else
 		return "__imp__" + symbol.symbol;
 }
 
+string
+GetIndirectCallTargetSymbol ( const StubbedSymbol& symbol )
+{
+	return GetLinkerSymbol ( symbol ) + "_";
+}
+
 char*
 TestSupportCode::WriteStubbedSymbolToStubsFile ( char* buffer,
                                                  const StubbedComponent& component,
                                                  const StubbedSymbol& symbol,
                                                  int stubIndex )
 {
-	string importSymbol = GetImportSymbol( symbol );
+	string linkerSymbol = GetLinkerSymbol ( symbol );
+	string linkerImportSymbol = GetLinkerImportSymbol ( symbol );
+	string indirectCallTargetSymbol = GetIndirectCallTargetSymbol ( symbol );
 	buffer = buffer + sprintf ( buffer,
-	                            ".globl _%s\n",
-	                            symbol.symbol.c_str () );
+	                            ".globl %s\n",
+	                            linkerSymbol.c_str () );
 	buffer = buffer + sprintf ( buffer,
 	                            ".globl %s\n",
-	                            importSymbol.c_str () );
+	                            linkerImportSymbol.c_str () );
 	buffer = buffer + sprintf ( buffer,
-	                            "_%s:\n",
-	                            symbol.symbol.c_str () );
+	                            "%s:\n",
+	                            linkerSymbol.c_str () );
 	buffer = buffer + sprintf ( buffer,
 	                            "%s:\n",
-	                            importSymbol.c_str () );
+	                            linkerImportSymbol.c_str () );
 	buffer = buffer + sprintf ( buffer,
+	                            "  .long %s\n",
+	                            indirectCallTargetSymbol.c_str () );
+	buffer = buffer + sprintf ( buffer,
+	                            "%s:\n",
+	                            indirectCallTargetSymbol.c_str () );
+	buffer = buffer + sprintf ( buffer,
 	                            "  pushl $%d\n",
 	                            stubIndex );
 	buffer = buffer + sprintf ( buffer,
@@ -194,7 +217,7 @@
 	char* buf;
 	char* s;
 
-	buf = (char*) malloc ( 50*1024 );
+	buf = (char*) malloc ( 512*1024 );
 	if ( buf == NULL )
 		throw OutOfMemoryException ();