2017-07-15 5 views
1

別のStackoverflow Q/Aにpost that showed how to embed arbitrary data in assembly and reference it in C++がありました。アセンブリを使用してデータを埋め込み、ウィンドウ用のmingw-w64コンパイル(ELFの代わりにCOFF)を使用する場合の「未定義参照」エラー

これはLinuxでも問題ありませんが、Windows用にコンパイルする場合(mingw-w64を使用)、実行可能ファイルがELFではなくCOFF形式を使用しているため、アセンブリが異なる必要があります。 (COFFのために)、以下のようにデータを埋め込むための

私の現在のアセンブリは、次のとおりです。

# data.asm 
    .section .rodata 
    .global data_bin 
    .def data_bin; .scl 2; .type 50; .endef 
    .align 4 
data_bin: 
    .incbin "dataFile" 
data_bin_end: 
    .global data_bin_size 
    .def data_bin_size; .scl 2; .type 15; .endef 
    .align 8 
data_bin_size: 
    .quad data_bin_end - data_bin 

(私は「.scl 2" を使用しているストレージクラス 『2』は、明らかにグローバル/のexternで、私はので、 "50"は "50"を文字の配列の値とし、data_sizeに ".type 15"を使用しています。 "15"は符号なしlongの値です(このすべて

))specified hereとして私はまだデータを参照するために同じヘッダファイルを使用しています10

アセンブリは正常にコンパイルされ、残りの部分も同様にコンパイルされます。リンカーがdata_binおよびdata_bin_sizeを宣言しているにもかかわらず、リンカーがアセンブリコードでそれらを定義していても定義されていない(data_bin 'への未定義参照)問題が発生します。

これを解決する方法に関するすべてのアイデアや解決策はありますか?私は二重チェックして、アセンブリコードをコンパイルして生成されたオブジェクトファイルがリンクステップに含まれています。 data.hpp周り

答えて

0

追加extern "C" { }は(Linuxでは、変数名はマングルされたものではなく、窓には、彼らは)

そしておそらく、あなたはASM内の変数名に「_」前に付ける必要があります。

+0

これは、トリック(externブロックとasmの変数名の前に "_"を付ける)の両方を行いました。本当にありがとう! –

関連する問題