問題タブ [linux-x32-abi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - [u]int_fastN_t 型は、x32 ABI の有無にかかわらず、x86_64 に対してどのように定義する必要がありますか?
x32 ABIは、特に x86_64 アーキテクチャ用に生成されたコードの 32 ビット ポインターを指定します。これは、x86_64 アーキテクチャ (64 ビット CPU レジスタを含む) の利点と、32 ビット ポインターの削減されたオーバーヘッドを組み合わせたものです。
<stdint.h>
ヘッダーは typedef int_fast8_t
、int_fast16_t
、int_fast32_t
、およびint_fast64_t
(および対応する unsigned 型など) を定義します。uint_fast8_t
それぞれは次のとおりです。
少なくとも指定された幅を持つすべての整数型の中で、通常最も高速に動作する整数型
脚注付き:
指定されたタイプは、すべての目的で最速であるとは限りません。ある型を別の型よりも優先して選択する明確な根拠が実装にない場合、実装は単純に、符号と幅の要件を満たす整数型を選択します。
(N1570 C11ドラフトより引用)
問題は、x32 ABI の有無にかかわらず、x86_64 アーキテクチャに対してどのよう[u]int_fast16_t
に[u]int_fast32_t
型を定義する必要があるかということです。これらのタイプを指定する x32 ドキュメントはありますか? それらは 32 ビット x86 定義 (両方とも 32 ビット) と互換性があるべきですか、それとも x32 は 64 ビット CPU レジスタにアクセスできるため、x32 ABI の有無にかかわらず同じサイズである必要がありますか? (x32 ABI が使用されているかどうかに関係なく、x86_64 には 64 ビットのレジスタがあることに注意してください。)
__x86_64__
これはテストプログラムです (gcc 固有のマクロに依存します):
でコンパイルするとgcc -m64
、出力は次のようになります。
でコンパイルするとgcc -mx32
、出力は次のようになります。
(最初の行とは別に、gcc -m32
32 ビット x86 コードを生成する と出力を一致させます)。
これは glibc (<stdint.h>
ヘッダーを定義する) のバグですか、それとも x32 ABI 要件に従っているのでしょうか? x32 ABI ドキュメントまたはx86_64 ABI ドキュメント[u]int_fastN_t
のいずれにもタイプへの参照はありませんが、それを指定する別のものがある可能性があります。
64ビットのレジスタが利用可能であるため、fast16およびfast32タイプはx32またはx32で64ビットにする必要があると主張することができます。それは現在の動作よりも理にかなっていますか?
(x32 ABI についてのみ尋ねた元の質問を大幅に編集しました。この質問では、x32 の有無にかかわらず x86_64 について尋ねています。)
c++ - g++ オブジェクト ファイルの引数の位置が重要であり、正常にコンパイルできないさまざまな結果が得られる
main.cpp の簡単なテスト ファイル (重要でない場合) を用意して、次のようにオブジェクト ファイルをコンパイルして作成します。
オブジェクトファイルが作成されます。その後、次のコマンドで実行可能ファイルの作成とテストを削除します。
しかし、私がするとき:
それは出力します:
最初のコマンドで -c を省略して 1 つのステップでコンパイルを行うと、同じことが起こります。私は何日も立ち往生しています!!! その上で、正常にコンパイルできません。
ld と g++ のバージョンは次のとおりです。