gnu ツールチェーンの ld にリンクされた C プログラムを変換して、visual-studio (2005) プロジェクトとしてコンパイルするのに苦労しています。プログラムは .data-symbols を異なるセグメントに配置し、初期化フェーズ中にセグメント間でデータをコピーします。セグメントの開始と終了へのポインターは、ld リンカー スクリプトで定義されます。
変数を別のユーザー定義セグメントに配置する方法は理解していますが、_start_of_my_segment などのリンカー定数を定義する方法や、Visual Studio のリンカー スクリプトに似たものがあるかどうかはわかりません。
私の目標は、できればリンカー定義のシンボルを参照するソースコードを変更せずに、Visual Studio プロジェクトのデータの独自のカスタム レイアウトを使用して、プログラムをコンパイルできるようにすることです。
以下は、私がやりたいことを示す C コードの例と、gcc/ld とリンクするときに使用される make-script の (簡略化された、おそらく構文が正しくない) バージョンです。
どんなヒントでも大歓迎です!
#pragma data_seg( "MY_DATA_FOO" )
#pragma data_seg( "MY_DATA_BAR" )
#pragma comment(linker, "/section:MY_DATA_BAR,R")
__declspec(allocate("MY_DATA_FOO")) int foo1;
__declspec(allocate("MY_DATA_FOO")) int foo2;
__declspec(allocate("MY_DATA_BAR")) int bar1 = 1;
__declspec(allocate("MY_DATA_BAR")) int bar2 = 2;
#pragma data_seg( )
void test() {
foo1 = bar1;
foo2 = bar2;
// i would rather do this as
//extern unsigned int __start_of_MY_DATA_FOO;
//extern unsigned int __start_of_MY_DATA_BAR;
//extern unsigned int __size_of_MY_DATA_BAR;
//memcpy(__start_of_MY_DATA_FOO, _start_of_MY_DATA_BAR, _size_of_MY_DATA_BAR);
}
疑似リンク スクリプト (Visual Studio に相当するもの
MEMORY
{
foo: org=0x1000, len=0x100
bar: org=0x2000, len=0x100
}
SECTIONS
{
GROUP:
{
MY_DATA_FOO : {}
__start_of_MY_DATA_FOO = ADDR(MY_DATA_FOO);
__end_of_MY_DATA_FOO = .;
__size_of_MY_DATA_FOO = SIZEOF(MY_DATA_FOO);
} > foo
GROUP:
{
MY_DATA_BAR : {}
__start_of_MY_DATA_BAR = ADDR(MY_DATA_BAR);
__end_of_MY_DATA_BAR = .;
__size_of_MY_DATA_BAR = SIZEOF(MY_DATA_BAR);
} > bar
}