Index: trunk/abdev/BasicCompiler_Common/Intermediate_Step1.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/Intermediate_Step1.cpp	(revision 354)
+++ trunk/abdev/BasicCompiler_Common/Intermediate_Step1.cpp	(revision 355)
@@ -529,4 +529,9 @@
 						temporary[i2]=ESC_CLEARNAMESPACEIMPORTED;
 					}
+					if(lstrcmpi(temporary+i3,"_System_Static_New")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_SYSTEM_STATIC_NEW;
+					}
 					break;
 				case 'a':
Index: trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp	(revision 354)
+++ trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp	(revision 355)
@@ -254,5 +254,5 @@
 
 bool Operator_New_GetType(const char *Parameter,const Type &baseType, Type &resultType ){
-	char TypeName[VN_SIZE],CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE];
+	char TypeName[VN_SIZE],objectSizeStr[VN_SIZE];
 	int i,i2;
 
@@ -268,20 +268,10 @@
 
 	for(i2=0;;i++,i2++){
-		if(Parameter[i]=='('){
+		if(Parameter[i]=='(' || Parameter[i]=='['){
 			TypeName[i2]=0;
-
-			//コンストラクタに渡すパラメータを取得
-			i2=GetStringInPare(CreateParameter,Parameter+i);
-			RemoveStringPare(CreateParameter);
-			i+=i2;
-			if(Parameter[i]!='\0'){
-				SetError(42,NULL,cp);
-				return false;
-			}
 			break;
 		}
 		TypeName[i2]=Parameter[i];
 		if(Parameter[i]=='\0'){
-			CreateParameter[0]=0;
 			break;
 		}
@@ -589,5 +579,5 @@
 	}
 
-	if(expression[0]==1&& expression[1]==ESC_NEW ){
+	if(expression[0]==1&& ( expression[1]==ESC_NEW || expression[1] == ESC_SYSTEM_STATIC_NEW ) ){
 		//New演算子（オブジェクト生成）
 		*pIsLiteralCalculation = false;
Index: trunk/abdev/BasicCompiler_Common/Subroutine.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/Subroutine.cpp	(revision 354)
+++ trunk/abdev/BasicCompiler_Common/Subroutine.cpp	(revision 355)
@@ -513,4 +513,8 @@
 	pSubStaticMethod_System_TypeBase_InitializeUserTypes->CompleteCompile();
 
+	//_System_TypeBase_InitializeUserTypesForBaseTypeは一番最後にコンパイル
+	extern const UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType;
+	pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType->CompleteCompile();
+
 	//_System_InitStaticLocalVariablesは一番最後にコンパイル
 	//※一般関数内の静的変数オブジェクトをすべて収集しなければならない
@@ -544,4 +548,8 @@
 		pSubStaticMethod_System_TypeBase_InitializeUserTypes->KillCompileStatus();
 		CompileBufferInProcedure( *pSubStaticMethod_System_TypeBase_InitializeUserTypes );
+
+		//_System_TypeBase_InitializeUserTypesForBaseTypeは最後のほうでコンパイル
+		pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType->KillCompileStatus();
+		CompileBufferInProcedure( *pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType );
 
 		if( IsNeedProcCompile() ){
Index: trunk/abdev/BasicCompiler_Common/include/Class.h
===================================================================
--- trunk/abdev/BasicCompiler_Common/include/Class.h	(revision 354)
+++ trunk/abdev/BasicCompiler_Common/include/Class.h	(revision 355)
@@ -422,4 +422,16 @@
 		return staticMembers;
 	}
+	
+	const CMember *FindDynamicMember( const char *memberName ) const
+	{
+		BOOST_FOREACH( CMember *pMember, GetDynamicMembers() )
+		{
+			if( pMember->GetName() == memberName )
+			{
+				return pMember;
+			}
+		}
+		return NULL;
+	}
 
 	void EnumDynamicMethodsOrInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const;
@@ -516,4 +528,16 @@
 
 
+	// TypeInfo用
+	mutable int typeInfoDataTableOffset;
+	void SetTypeInfoDataTableOffset( int typeInfoDataTableOffset ) const
+	{
+		this->typeInfoDataTableOffset = typeInfoDataTableOffset;
+	}
+	int GetTypeInfoDataTableOffset() const
+	{
+		return typeInfoDataTableOffset;
+	}
+
+
 	//線形リスト用
 	CClass *pobj_NextClass;
@@ -554,4 +578,5 @@
 	virtual void GetAllClassInfo();
 	virtual void Compile_System_InitializeUserTypes();
+	virtual void Compile_System_InitializeUserTypesForBaseType();
 
 	const CClass *Find( const NamespaceScopes &namespaceScopes, const string &name ) const;
Index: trunk/abdev/BasicCompiler_Common/include/DataTable.h
===================================================================
--- trunk/abdev/BasicCompiler_Common/include/DataTable.h	(revision 354)
+++ trunk/abdev/BasicCompiler_Common/include/DataTable.h	(revision 355)
@@ -4,13 +4,12 @@
 
 //DataTable.cpp
-class DataTable{
+class DataTable
+{
 	char *buffer;
 	int size;
 
-	void Realloc( int size )
-	{
-		this->buffer = (char *)realloc( this->buffer, size + 100 );
-		this->size = size;
-	}
+public:
+	// リンカで解決しなければならないスケジュール
+	Schedules schedules;
 
 	// XMLシリアライズ用
@@ -23,4 +22,5 @@
 		ar & BOOST_SERIALIZATION_NVP( _buffer );
 		ar & BOOST_SERIALIZATION_NVP( size );
+		ar & BOOST_SERIALIZATION_NVP( schedules );
 
 		// 読み込み後の処理
@@ -52,4 +52,12 @@
 		ar & BOOST_SERIALIZATION_NVP( _buffer );
 		ar & BOOST_SERIALIZATION_NVP( size );
+		ar & BOOST_SERIALIZATION_NVP( schedules );
+	}
+
+
+	void Realloc( int size )
+	{
+		this->buffer = (char *)realloc( this->buffer, size + 100 );
+		this->size = size;
 	}
 
@@ -92,8 +100,60 @@
 	void Add( const DataTable &dataTable )
 	{
+		long baseOffset = GetSize();
+
 		AddBinary( dataTable.GetPtr(), dataTable.GetSize() );
+
+		// スケジュールを追加
+		BOOST_FOREACH( const Schedule &schedule, dataTable.schedules )
+		{
+			this->schedules.push_back(
+				Schedule(
+					schedule.GetType(),
+					baseOffset + schedule.GetOffset(),
+					schedule.GetLongPtrValue()
+				)
+			);
+		}
 	}
 
-	const void *GetPtr() const;
-	int GetSize() const;
+	const void *GetPtr() const
+	{
+		return buffer;
+	}
+	int GetSize() const
+	{
+		return size;
+	}
+
+	long GetLong( int pos ) const
+	{
+		return *(long *)( buffer + pos );
+	}
+	_int64 GetInt64( int pos ) const
+	{
+		return *(_int64 *)( buffer + pos );
+	}
+	void Overwrite( int pos, long newLongValue )
+	{
+		*(long *)( buffer + pos ) = newLongValue;
+	}
+	void OverwriteInt64( int pos, _int64 new64Value )
+	{
+		*(_int64 *)( buffer + pos ) = new64Value;
+	}
+
+	bool MakeConstObjectToProcessStaticBuffer( const CClass &objClass, const Jenga::Common::Strings &initMemberValues, int &dataTableOffset );
+	bool MakeConstObjectToProcessStaticBuffer( const char *expression, Type &resultType, int &dataTableOffset );
+	int MakeConstStringObjectToProcessStaticBuffer( const char *str );
+	bool MakeLiteralArrayBuffer( const char *expression, const Type &baseType, int &dataTableOffset );
+
+private:
+	int lastMadeConstObjectDataTableOffset;
+public:
+	int GetLastMadeConstObjectDataTableOffset()
+	{
+		return lastMadeConstObjectDataTableOffset;
+	}
+
+	void ResetDataSectionBaseOffset( long dataSectionBaseOffset );
 };
Index: trunk/abdev/BasicCompiler_Common/include/Linker.h
===================================================================
--- trunk/abdev/BasicCompiler_Common/include/Linker.h	(revision 354)
+++ trunk/abdev/BasicCompiler_Common/include/Linker.h	(revision 355)
@@ -4,4 +4,5 @@
 {
 	NativeCode nativeCode;
+	DataTable dataTable;
 	DWORD imageBase;
 
@@ -15,4 +16,9 @@
 	{
 		return nativeCode;
+	}
+
+	const DataTable &GetDataTable() const
+	{
+		return dataTable;
 	}
 
@@ -37,5 +43,11 @@
 	void ResolveVtblSchedule( long dataSectionBaseOffset );
 
+	// TypeInfoスケジュール
+	void ResolveTypeInfoSchedule( long dataSectionBaseOffset );
+
 	// リンク
 	void Link( ObjectModule &masterObjectModule );
+
+	// データテーブルをセット
+	void SetDataTable( DataTable &dataTable );
 };
Index: trunk/abdev/BasicCompiler_Common/include/NamespaceSupporter.h
===================================================================
--- trunk/abdev/BasicCompiler_Common/include/NamespaceSupporter.h	(revision 354)
+++ trunk/abdev/BasicCompiler_Common/include/NamespaceSupporter.h	(revision 355)
@@ -53,7 +53,5 @@
 
 		while( tempLivingNamespaceScopes.size() ){
-			NamespaceScopes tempNamespaceScopes = tempLivingNamespaceScopes;
-
-			string tempStr = tempNamespaceScopes.ToString() + "." + entryName;
+			string tempStr = tempLivingNamespaceScopes.ToString() + "." + entryName;
 			if( thisStr == tempStr ){
 				return true;
Index: trunk/abdev/BasicCompiler_Common/include/NativeCode.h
===================================================================
--- trunk/abdev/BasicCompiler_Common/include/NativeCode.h	(revision 354)
+++ trunk/abdev/BasicCompiler_Common/include/NativeCode.h	(revision 355)
@@ -24,4 +24,5 @@
 		DllProc,		// DLL関数位置スケジュール
 		Vtbl,			// vtblスケジュール
+		TypeInfo,		// TypeInfoスケジュール
 	};
 
@@ -57,4 +58,5 @@
 			break;
 		case Vtbl:
+		case TypeInfo:
 			ar & boost::serialization::make_nvp("pClass", const_cast<::CClass *&>(pClass));
 			break;
@@ -93,4 +95,10 @@
 	{
 	}
+	Schedule( Type type, const ::CClass *pClass, long offset )
+		: type( type )
+		, pClass( pClass )
+		, offset( offset )
+	{
+	}
 	~Schedule()
 	{
@@ -127,5 +135,5 @@
 	const ::CClass &GetClass() const
 	{
-		if( type != Schedule::Vtbl )
+		if( !( type == Schedule::Vtbl || type == Schedule::TypeInfo ) )
 		{
 			SetError();
Index: trunk/abdev/BasicCompiler_Common/include/ver.h
===================================================================
--- trunk/abdev/BasicCompiler_Common/include/ver.h	(revision 354)
+++ trunk/abdev/BasicCompiler_Common/include/ver.h	(revision 355)
@@ -6,6 +6,6 @@
 // バージョン付加文字列
 #ifdef _AMD64_
-#define VER_INFO		"(x64) (rev.361)"
+#define VER_INFO		"(x64) (rev.367)"
 #else
-#define VER_INFO		"(rev.361)"
+#define VER_INFO		"(rev.367)"
 #endif
Index: trunk/abdev/BasicCompiler_Common/src/Class.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/src/Class.cpp	(revision 354)
+++ trunk/abdev/BasicCompiler_Common/src/Class.cpp	(revision 355)
@@ -1294,4 +1294,11 @@
 		compiler.GetNamespaceSupporter().GetLivingNamespaceScopes() = objClass.GetNamespaceScopes();
 
+		DWORD dwFlags = 0;
+		if( objClass.GetName() == "_System_TypeBase" )
+		{
+			// _System_TypeBaseクラスはグローバル、スタティック領域を初期化するためのクラスなのでここでの初期化は除外する
+			dwFlags |= DIMFLAG_NONCALL_CONSTRACTOR;
+		}
+
 		int i=0;
 		BOOST_FOREACH( CMember *member, objClass.GetStaticMembers() ){
@@ -1304,5 +1311,5 @@
 				member->GetInitializeExpression().c_str(),
 				member->GetConstructParameter().c_str(),
-				0);
+				dwFlags);
 
 			i++;
@@ -1892,5 +1899,5 @@
 			// 未使用のクラスは無視する
 			continue;
-		}
+		}	
 
 		char referenceOffsetsBuffer[1024] = "";
@@ -1911,22 +1918,31 @@
 
 		sprintf( temporary
-			, "Add(%c%c_System_TypeForClass(\"%s\",\"%s\",[%s],%d))"
+			, "Add(%c%c_System_TypeForClass[strNamespace=\"%s\",name=\"%s\",fullName=\"%s\",referenceOffsets=[%s],numOfReference=%d])"
 			, 1
-			, ESC_NEW
-			, ""							// 名前空間 (TODO: 実装)
-			, objClass.GetName().c_str()	// クラス名
-			, referenceOffsetsBuffer		// 参照メンバオフセット配列
-			, numOfReference				// 参照メンバの個数
+			, ESC_SYSTEM_STATIC_NEW
+			, objClass.GetNamespaceScopes().ToString().c_str()		// 名前空間
+			, objClass.GetName().c_str()							// クラス名
+			, objClass.GetFullName().c_str()						// フルネーム
+			, referenceOffsetsBuffer								// 参照メンバオフセット配列
+			, numOfReference										// 参照メンバの個数
 			);
 
 		// コンパイル
 		ChangeOpcode( temporary );
-	}
-
-
+
+		objClass.SetTypeInfoDataTableOffset(
+			compiler.GetObjectModule().dataTable.GetLastMadeConstObjectDataTableOffset()
+		);
+	}
+}
+void Classes::Compile_System_InitializeUserTypesForBaseType()
+{
+	extern int cp;
+	cp = -1;
 	////////////////////////////////////////////////////////////////////
 	// 基底クラスを登録
 	////////////////////////////////////////////////////////////////////
 
+	char temporary[VN_SIZE];
 	sprintf(temporary, "%c%ctempType=Nothing%c%cTypeBaseImpl"
 		, HIBYTE( COM_DIM )
@@ -1950,7 +1966,6 @@
 		if( objClass.HasSuperClass() ){
 			sprintf( temporary
-				, "tempType=Search(\"%s\",\"%s\")"
-				, ""							// 名前空間 (TODO: 実装)
-				, objClass.GetName().c_str()	// クラス名
+				, "tempType=Search(\"%s\")"
+				, objClass.GetFullName().c_str()
 				);
 
@@ -1959,7 +1974,6 @@
 
 			sprintf( temporary
-				, "tempType.SetBaseType(Search(\"%s\",\"%s\"))"
-				, ""								// 名前空間 (TODO: 実装)
-				, objClass.GetSuperClass().GetName().c_str()	// 基底クラス名
+				, "tempType.SetBaseType(Search(\"%s\"))"
+				, objClass.GetSuperClass().GetFullName().c_str()
 				);
 
Index: trunk/abdev/BasicCompiler_Common/src/DataTable.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/src/DataTable.cpp	(revision 354)
+++ trunk/abdev/BasicCompiler_Common/src/DataTable.cpp	(revision 355)
@@ -71,10 +71,249 @@
 }
 
-const void *DataTable::GetPtr() const
-{
-	return buffer;
-}
-int DataTable::GetSize() const
-{
-	return size;
-}
+bool DataTable::MakeConstObjectToProcessStaticBuffer( const CClass &objClass, const Jenga::Common::Strings &initMemberValues, int &dataTableOffset )
+{
+	// クラスに必要なバッファサイズを取得
+	int size = objClass.GetSize();
+
+	// クラスのバッファイメージを作成
+	BYTE *buffer = (BYTE *)calloc( size, 1 );
+
+	// クラスのバッファイメージをデータ領域へ追加
+	dataTableOffset = this->AddBinary( buffer, size );
+
+	this->lastMadeConstObjectDataTableOffset = dataTableOffset;
+
+	// vtblスケジュール
+	this->schedules.push_back( Schedule( &objClass, dataTableOffset ) );
+
+	// TypeInfoスケジュール
+	int offsetForTypeInfo = objClass.GetMemberOffset( "typeInfo" );
+	//this->schedules.push_back( Schedule( Schedule::TypeInfo, &objClass, dataTableOffset + offsetForTypeInfo ) );
+
+	BOOST_FOREACH( const std::string &initMemberValue, initMemberValues )
+	{
+		int i = 0;
+
+		// メンバ名
+		char memberName[VN_SIZE];
+		for( i=0; ; i++ )
+		{
+			if( initMemberValue[i] == '\0' )
+			{
+				// エラー
+				SetError();
+				return false;
+			}
+			if( initMemberValue[i] == '=' )
+			{
+				memberName[i] = 0;
+				break;
+			}
+			memberName[i] = initMemberValue[i];
+		}
+
+		// 初期値
+		const char *initValue = initMemberValue.c_str() + i + 1;
+
+		// メンバを取得
+		const CMember *member = objClass.FindDynamicMember( memberName );
+
+		// メンバオフセットを取得
+		int memberOffset = objClass.GetMemberOffset( member->GetName().c_str() );
+
+		if( member->GetType().IsPointer() && initValue[0] == '[' )
+		{
+			// ポインタ型でバッファ指定のとき
+			int memberDataTableOffset;
+			if( !this->MakeLiteralArrayBuffer( initValue, member->GetType(),memberDataTableOffset ) )
+			{
+				return false;
+			}
+
+			this->Overwrite( dataTableOffset + memberOffset, memberDataTableOffset );
+			this->schedules.push_back( Schedule( Schedule::DataTable, dataTableOffset + memberOffset ) );
+		}
+		else if( member->GetType().IsWhole() )
+		{
+			// 整数
+			Type resultType;
+			_int64 i64data;
+			if( !StaticCalculation( true, initValue, member->GetType().GetBasicType(), &i64data, resultType ) ){
+				return false;
+			}
+
+			this->Overwrite( dataTableOffset + memberOffset, static_cast<long>(i64data) );
+		}
+		else if( member->GetType().IsStringClass() )
+		{
+			// 文字列型
+			char temporary[VN_SIZE];
+			lstrcpy( temporary, initValue );
+			RemoveStringQuotes( temporary );
+			int memberDataTableOffset = MakeConstStringObjectToProcessStaticBuffer( temporary );
+			this->Overwrite( dataTableOffset + memberOffset, memberDataTableOffset );
+			this->schedules.push_back( Schedule( Schedule::DataTable, dataTableOffset + memberOffset ) );
+		}
+	}
+
+	return true;
+}
+bool DataTable::MakeConstObjectToProcessStaticBuffer( const char *expression, Type &resultType, int &dataTableOffset )
+{
+	char CreateParameter[VN_SIZE];
+	int i,i2;
+
+	i=0;
+
+	// クラス名を取得
+	char typeName[VN_SIZE];
+	for(i2=0;;i++,i2++){
+		if(expression[i]=='['){
+			typeName[i2]=0;
+
+			// メンバの初期値を取得
+			i2=GetStringInBracket(CreateParameter,expression+i);
+			RemoveStringBracket(CreateParameter);
+			i+=i2;
+			if(expression[i]!='\0'){
+				SetError(42,NULL,cp);
+				return false;
+			}
+			break;
+		}
+		typeName[i2]=expression[i];
+		if(expression[i]=='\0'){
+			CreateParameter[0]=0;
+			break;
+		}
+	}
+
+	// パラメータを取得
+	Jenga::Common::Strings initMemberValues;
+	SplitParameter( CreateParameter, initMemberValues );
+
+	if( !compiler.StringToType( typeName, resultType ) ){
+		SetError(3,typeName,cp);
+		return false;
+	}
+
+	if( !resultType.IsObject() ){
+		////////////////////////
+		// 通常のデータ型の場合
+		////////////////////////
+
+		SetError(121,NULL,cp);
+		return false;
+	}
+
+	return MakeConstObjectToProcessStaticBuffer( resultType.GetClass(), initMemberValues, dataTableOffset );
+}
+
+int DataTable::MakeConstStringObjectToProcessStaticBuffer( const char *str )
+{
+	const CClass &strClass = *compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
+	const CClass &objClass = strClass.GetSuperClass();
+
+	// クラスに必要なバッファサイズを取得
+	int size = strClass.GetSize();
+
+	// メンバ位置を取得
+	int offsetForTypeInfo = strClass.GetMemberOffset( "typeInfo" );
+	int offsetForLength = strClass.GetMemberOffset( "m_Length" );
+	int offsetForChars = strClass.GetMemberOffset( "Chars" );
+
+	// 現在のデータ領域のヘッダ位置を取得
+	int headOffset = this->GetSize();
+
+	// クラスのバッファイメージを作成
+	BYTE *buffer = (BYTE *)calloc( size, 1 );
+	*(long *)(buffer + offsetForLength) = lstrlen( str );
+	*(LONG_PTR *)(buffer + offsetForChars) = headOffset + size;
+
+	// クラスのバッファイメージをデータ領域へ追加
+	int dataTableOffset = this->AddBinary( buffer, size );
+
+	// スケジューリング
+	this->schedules.push_back( Schedule( &strClass, headOffset ) );
+	this->schedules.push_back( Schedule( Schedule::TypeInfo, &strClass, headOffset + offsetForTypeInfo ) );
+	this->schedules.push_back( Schedule( Schedule::DataTable, headOffset + offsetForChars ) );
+
+	// 文字列バッファをデータ領域へ追加
+	this->AddString( str );
+
+	return dataTableOffset;
+}
+
+bool DataTable::MakeLiteralArrayBuffer( const char *expression, const Type &baseType, int &dataTableOffset )
+{
+	if( !baseType.IsPointer() ){
+		SetError(1,NULL,cp);
+		return false;
+	}
+	Type tempBaseType( baseType );
+	tempBaseType.PtrLevelDown();
+
+	char *buffer = (char *)malloc( lstrlen( expression ) + 1 );
+	lstrcpy( buffer, expression );
+	RemoveStringBracket( buffer );
+
+	void *binary = malloc( 1 );
+	int num = 0;
+
+	int i = 0;
+	bool isSuccessful = true;
+	while( buffer[i] ){
+		char temporary[1024];
+
+		i = GetOneParameter( buffer, i, temporary );
+		if( buffer[i] == ',' ){
+			i++;
+		}
+
+		Type resultType;
+		_int64 i64data;
+		if( !StaticCalculation( true, temporary, tempBaseType.GetBasicType(), &i64data, resultType ) ){
+			isSuccessful = false;
+			break;
+		}
+		if( !resultType.IsWhole() ){
+			// TODO: 実数に未対応
+			SetError();
+			isSuccessful = false;
+			break;
+		}
+
+		binary = realloc( binary, ( num + 1 ) * tempBaseType.GetSize() );
+		memcpy( (char *)binary + (num * tempBaseType.GetSize()), &i64data, tempBaseType.GetSize() );
+		num++;
+	}
+
+	free( buffer );
+
+	dataTableOffset = this->AddBinary( binary, num * tempBaseType.GetSize() );
+
+	free( binary );
+
+	return isSuccessful;
+}
+
+void DataTable::ResetDataSectionBaseOffset( long dataSectionBaseOffset )
+{
+	BOOST_FOREACH( const Schedule &schedule, schedules )
+	{
+		if( schedule.GetType() == Schedule::DataTable )
+		{
+#ifdef _WIN64
+			OverwriteInt64(
+				schedule.GetOffset(),
+				GetInt64( schedule.GetOffset() ) + dataSectionBaseOffset
+			);
+#else
+			Overwrite(
+				schedule.GetOffset(),
+				GetLong( schedule.GetOffset() ) + dataSectionBaseOffset
+			);
+#endif
+		}
+	}
+}
Index: trunk/abdev/BasicCompiler_Common/src/Linker.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/src/Linker.cpp	(revision 354)
+++ trunk/abdev/BasicCompiler_Common/src/Linker.cpp	(revision 355)
@@ -17,4 +17,22 @@
 		}
 	}
+
+	BOOST_FOREACH( const Schedule &schedule, dataTable.schedules )
+	{
+		if( schedule.GetType() == Schedule::DataTable )
+		{
+#ifdef _WIN64
+			dataTable.OverwriteInt64(
+				schedule.GetOffset(),
+				dataTable.GetInt64( schedule.GetOffset() ) + imageBase + dataSectionBaseOffset
+			);
+#else
+			dataTable.Overwrite(
+				schedule.GetOffset(),
+				dataTable.GetLong( schedule.GetOffset() ) + imageBase + dataSectionBaseOffset
+			);
+#endif
+		}
+	}
 }
 
@@ -116,4 +134,47 @@
 		}
 	}
+
+	BOOST_FOREACH( const Schedule &schedule, dataTable.schedules )
+	{
+		if( schedule.GetType() == Schedule::Vtbl )
+		{
+			LONG_PTR vtblMasterListOffset = schedule.GetClass().GetVtblMasterListOffset();
+
+#ifdef _WIN64
+			dataTable.OverwriteInt64(
+				schedule.GetOffset(),
+				vtblMasterListOffset + imageBase + dataSectionBaseOffset
+			);
+#else
+			dataTable.Overwrite(
+				schedule.GetOffset(),
+				vtblMasterListOffset + imageBase + dataSectionBaseOffset
+			);
+#endif
+		}
+	}
+}
+
+void Linker::ResolveTypeInfoSchedule( long dataSectionBaseOffset )
+{
+	BOOST_FOREACH( const Schedule &schedule, dataTable.schedules )
+	{
+		if( schedule.GetType() == Schedule::TypeInfo )
+		{
+			LONG_PTR typeInfoDataTableOffset = schedule.GetClass().GetTypeInfoDataTableOffset();
+
+#ifdef _WIN64
+			dataTable.OverwriteInt64(
+				schedule.GetOffset(),
+				typeInfoDataTableOffset + imageBase + dataSectionBaseOffset
+			);
+#else
+			dataTable.Overwrite(
+				schedule.GetOffset(),
+				typeInfoDataTableOffset + imageBase + dataSectionBaseOffset
+			);
+#endif
+		}
+	}
 }
 
@@ -143,2 +204,7 @@
 	}
 }
+
+void Linker::SetDataTable( DataTable &dataTable )
+{
+	this->dataTable.Add( dataTable );
+}
Index: trunk/abdev/BasicCompiler_Common/src/ObjectModule.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/src/ObjectModule.cpp	(revision 354)
+++ trunk/abdev/BasicCompiler_Common/src/ObjectModule.cpp	(revision 355)
@@ -26,4 +26,5 @@
 
 	// データテーブルを結合
+	objectModule.dataTable.ResetDataSectionBaseOffset( dataSectionBaseOffset );
 	dataTable.Add( objectModule.dataTable );
 
