8

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
}
4

2 に答える 2

3

パディングは、セグメントのマージによって削除できます

例えば

#pragma data_seg(".foo_begin")
#pragma data_seg(".foo_data")
#pragma data_seg(".foo_end")

#pragma comment( linker, "/merge:.foo_begin=.foo" )
#pragma comment( linker, "/merge:.foo_data=.foo" )
#pragma comment( linker, "/merge:.foo_end=.foo" )

__declspec(allocate(".foo_begin")) int foo_begin_marker;
__declspec(allocate(".foo_end")) int foo_end_marker;

__declspec(allocate(".foo_data")) int foo_data;
于 2011-08-06T21:35:57.440 に答える
1

追加のセグメントを作成します (これらはアルファベット順にメモリに配置されます)。

#pragma data_seg("MY_DATA_FOO__a")
#pragma data_seg("MY_DATA_FOO__z")
#pragma data_seg("MY_DATA_FOO__m")

__declspec(allocate("MY_DATA_FOO__a")) int fooFirst;
__declspec(allocate("MY_DATA_FOO__z")) int fooLast;
__declspec(allocate("MY_DATA_FOO__m")) int foo1;
__declspec(allocate("MY_DATA_FOO__m")) int foo2;

次に、&fooFirst と &fooLast の間のすべてをコピーします。

于 2010-07-07T08:40:35.277 に答える