3

Linuxベースのx86_64マシン(ホスト)で実行される32ビット組み込みシステムと通信するプログラムを構築しようとしています。ホストプログラムには、組み込みシステムの同じ構造を反映するいくつかのポインターを含む構造があります。

問題は、ホスト上でポインターがネイティブに64ビットであるため、構造体メンバーのオフセットが組み込みシステムの場合と同じではないことです。したがって、構造を(memcpyとして)コピーすると、コンテンツはホストコピーの間違った場所に配置されてしまいます。

struct {
    float a;
    float b;
    float *p;
    float *q;
} mailbox;
// sizeof(mailbox) is 4*4=16 on the embedded, but 2*4+2*8=24 on the host

幸いなことに、gccにはx86_64マシンで32ビットポインターを生成するためのオプションがあることがわかりました-mx32しかし、これを使おうとすると、次のようなエラーが発生します。

$ gcc -mx32 test.c -o test.e
cc1: error: unrecognized command line option "-mx32"

これは、gccバージョン4.4.3および4.7.0 20120120(実験的)用です。

このオプションが機能しないのはなぜですか?これを回避する方法はありますか?

編集:v4.4.7のマニュアルによると、利用可能な-mx32オプションはありませんでした。これは、v4.6.3まで当てはまります。OTOH、v4.7.0はそのオプションを示しているので、私が使用しているJan-20バージョンが最終バージョンではない可能性がありますか?!

4

2 に答える 2

6

これをしないでください。まず、x32 は独立したアーキテクチャです。単なるコンパイラ スイッチではありません。これを機能させるには、リンクするすべてのライブラリの x32 バージョンが必要です。Linux ディストリビューションはまだ x32 バージョンを作成していないため、静的にリンクするか、独自のライブラリ環境を展開することになります。

もっと広く言えば、それは単にトラブルを求めているだけです。構造体にポインターが含まれている場合、それらはポインターである必要があります。「32ビットアドレス」が含まれている場合、それらは32ビット整数型である必要があります。

于 2012-06-03T14:40:08.380 に答える