12

Linuxプラットフォームでアプリケーションを64ビットに移植する作業をしています。このアプリケーションは現在、Linux、Windows、Mac 32ビット、およびWindows64ビットでサポートされています。私たちが頻繁に遭遇する問題の1つは、intのlongの使用であり、その逆も同様です。アプリケーションが現在サポートされているプラ​​ットフォームでは、longとintは交換可能(両方とも4バイト)であるため、これはこれまで問題ではありませんでした。コードベースは巨大なものであり、多くのデータ型に対して#definesを含む多くのレガシーコードがあるため、longのすべての使用法を検索し、適切にin​​tに置き換えるのは面倒です。

  1. 短期的な解決策として、GCCが「long」に8バイトではなく4バイトを使用するようにする方法はありますか?
  2. もしそうなら、私たちが直面する可能性のある問題は何ですか?そうでない場合、longとintの問題を修正する簡単な方法はありますか?
4

3 に答える 3

10

-m3232ビットコードを生成します。

-mx3264ビットコードを生成しますが、32ビットのlongとポインタを使用します。

Intel386およびAMDx86-64オプション

于 2012-10-09T07:22:00.840 に答える
6
  1. いいえ。Linuxx86_64では、ABIはlongが8バイトタイプ(LP64)であることを指定しています。実際、すべてではないにしてもほとんどの64ビットUnixシステム(64ビットOS X、AFAIKを含む)はLP64であるため、これはLinuxに固有のものではありません。

  2. コードを修正するだけでなく、違います。

ポインター値を格納するのに十分な大きさの移植可能な整数型が必要な場合は、intptr_tまたはuintptr_tを使用します(ただし、通常、ポインター値を整数に格納したいということは、何か間違ったことをしていることを意味するので、よく考えてください!)。2つのポインターの差を表すことができる整数型の場合は、ptrdiff_tを使用します。オブジェクトのサイズについては、size_tを使用してください。

于 2012-10-09T07:55:32.100 に答える
3

「64ビットへの移植」の意味によって異なります。

  1. アプリケーションを64ビットLinuxで動作させたいだけです。32ビットでコンパイルでき、32ビットライブラリを提供するほとんどのディストリビューションで互換モードで実行されます。このためには、32ビットバージョンのgcc(gcc:i386Ubuntuのパッケージなど)を使用するか-m32、ネイティブgccバージョンでフラグを使用する必要があります。

  2. プロセッサのロングモード(別名x86_64アーキテクチャ)の恩恵を受けたいが、それでもほとんどの32ビットC規則(long int4バイトを含む)を使用する: gccのフラグを使用してx32 ABI-mx32を使用できます。これには、ディストリビューションが必要です。それを許可します(サポートはカーネルで有効にする必要があり、特定のライブラリが必要です/libx32。私はUbuntu16.04を使用していますが、使用可能なプリコンパイル済みライブラリがはるかに少ないことを除いて、このモードは完全に正常に機能しています。

  3. x86_64アーキテクチャとABIを正確に使用したいが、4バイトの場合:x86_64 ABIでは8バイトであるlong必要があるため、これは不可能です。long

于 2018-03-16T12:14:12.650 に答える