1

Linux 用の x86-64 アセンブリで記述され、GCC でコンパイルされた非常に特殊なファイルがあります。そのコードを Visual Studio プロジェクトに移動する必要があり、mll64.exe はアセンブリ ファイルを Intel 形式にする必要があります。

クロスプラットフォーム DLL をビルドしようとしましたが、うまくいきません:

15:47:19 cpudiag2 > gcc -共有 -o my.dll my.o

/usr/bin/ld: my.o: 再配置 R_X86_64_32S は、共有オブジェクトを作成するときに「ローカル シンボル」に対して使用できません。-fPIC で再コンパイル my.o: シンボルを読み取れませんでした: 不正な値 collect2: ld が 1 つの終了ステータスを返しました

15:47:19 cpudiag2 > gcc -fPIC my.S

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: 関数 `_start' 内: (.text+0x20): 未定義の参照「メイン」collect2 へ: ld は 1 つの終了ステータスを返しました

そこで、GCC にオブジェクト ファイルから Intel 構文に逆コンパイルさせようとしましたが、それもうまくいきません。次の 2 つのコマンドは両方とも、AT&T 構文で逆コンパイルされたアセンブリ コードになります。なんで?

objdump -d -M=intel my.o

gcc -S -masm=intel my.o

4

1 に答える 1

3

そこにはさまざまな混乱が。

  1. ファイルに名前を付けてmy.dllも、その形式は変更されません
  2. Linux と Windows ではライブラリの形式が異なるため、クロスプラットフォームの dll を作成することはできません。
  3. -fPIC魔法のように手書きの asm PIC を作成するわけではなく、コンパイラで生成されたコードに対してのみ機能します。
  4. オブジェクト ファイルを取得するには、-cswitch を渡す必要がありますgcc(ただし、この場合は役に立ちません)。
  5. gcc -Sオブジェクト ファイルを逆アセンブルしません。C コードからアセンブリを生成するためのものです。
  6. objdump -d -M=intel my.o動作するはずですが、それが生成するものはアセンブルには適していません (特に、異なる呼び出し規約を使用するため、Windows では適していません)。

あなたの最善の策は、上記のコードをWindowsオブジェクトファイルにアセンブルし(gcc/を使用gasしてWindowsを対象とする)、それをプロジェクトにバイナリとして含め(リンクするためだけに)、必要に応じて規則変換を呼び出すための小さな接着層を使用することです。ただし、アセンブリ ソースを編集することはできません。

于 2012-10-22T23:30:21.533 に答える