3

私は64ビットのUbuntuオペレーティングシステムを使用しており、32ビットのアセンブリを学習しています。私はこれらの2つのファイルをコンパイルしようとしています:

square.s:

#square.s

.section .text
.globl sqr
.type sqr, @function
sqr:
    pushl %ebp
    movl %esp, %ebp
    movl 8(%ebp), %eax
    imull %eax, %eax
    popl %ebp
    ret

main.c:

//main.c
#include <stdio.h>
extern long sqr(long);
int main(int argc, char* argv[])
{
    long squared = sqr(10);
    printf("%lu\n", squared);
    return 0;
}

32ビット仮想マシンで、このコマンドを使用してコンパイルしました

  gcc main.c square.s -o test

そしてそれはうまくいった。私が抱えている問題は、これらのファイルを64ビットマシンでコンパイルしたいということです。これらのファイルをコンパイルするいくつかの方法を試しましたが、どれもうまくいきませんでした。誰かが私を正しい方向に向けることができますか?これを行うオプションはありますか?-m32を試しましたが、うまくいきませんでした。

私がこれをするとき:

  gcc -m32 -o test main.c square.s

私はこれを手に入れます:

  In file included from /usr/include/stdio.h:28:0,
             from main.c:1:
/usr/include/features.h:323:26: fatal error: bits/predefs.h: No such file or directory
compilation terminated.
4

2 に答える 2

6

64ビットubuntuでの32ビットプログラムのコンパイル/リンクにはgcc-multilibが必要です。次のことを試してください。

sudo apt-get install gcc-multilib libc6-i386 lib6-dev-i386

ただし、他のライブラリをリンクしようとすると、他の問題が発生する可能性があります。

32ビットのchroot環境を使用すると幸運が得られます(つまり、64ビットのubuntuで32ビットのルートを実行します)。

于 2011-12-22T02:51:20.273 に答える
0

あなたの問題は、アセンブリ コードに関係なく、一般的に 32 ビット コンパイルに関連しているようです。おそらく何かが正しく構成されていません。

また、.s ファイルの代わりにインライン アセンブリを使用することを検討しましたか? このように C とアセンブリを統合する方がはるかに簡単で、呼び出し規約の詳細について心配する必要はありません。

于 2011-12-22T11:29:12.090 に答える