gccコンパイラでオブジェクトコード生成に関する疑問があります。gcc cコンパイラのcswtch生成
私のプログラムでは、objdumpはCSWTCH
セクションが生成されたことを示しています。
あなたはCのコードで基準が
CSWTCH
セクション を生成することが必要かを説明できますか?CSWTCH
セクションの割り当てられた出力セクションは.rodata
になりますか?CSWTCH
の出力セクションには小さなローマタを割り当てます。
gccコンパイラでオブジェクトコード生成に関する疑問があります。gcc cコンパイラのcswtch生成
私のプログラムでは、objdumpはCSWTCH
セクションが生成されたことを示しています。
あなたはCのコードで基準がCSWTCH
セクション を生成することが必要かを説明できますか?
CSWTCH
セクションの割り当てられた出力セクションは.rodata
になりますか?
CSWTCH
の出力セクションには小さなローマタを割り当てます。
回答(1)そのような基準が存在しないれる:これはちょうど値テーブルを生成するための1つのコンパイラの技術です。 (2)それはコンパイラ、アセンブラ、リンカまでです。 (3)コンパイラ、アセンブラ、リンカまでです。
GCC(少なくともGCCバージョン5)ここでのx86の両方の.section
と.type
指令を発する:
$ cat cswitch.c
int sw_2 (char x)
{
switch(x)
{
case '0': return -1;
case '1': return 2;
case '2': return 3;
case '3': return 5;
case '4': return 7;
case '5': return 11;
case '6': return 13;
case '7': return 17;
case '8': return 19;
case '9': return 23;
case 'a':return 29;
case 'A':return 29;
}
return -1;
}
$ gcc -Os -S cswitch.c
$ cat cswitch.s
.file "cswitch.c"
[mass snippage]
.section .rodata
.align 32
.type CSWTCH.1, @object
.size CSWTCH.1, 49
CSWTCH.1:
(Iは-Os
スイッチがx86のルックアップテーブルを生成するために必要とされることを見出し-O
で、I
この場合、.section
指示文が適用され、.rodata
セクションにテーブルが挿入されます。しかし、これはただ1つのシステムの実装方法であり、コンパイラーには厳しい要件はありません。この変換は、そのシステムの用途を想定している(
int sw_3(char x)
{
const char table['a' - '1'] = {
'1' - '1': 2,
'2' - '1': 3,
'3' - '1': 5,
/* ... fill in the remainder as needed */
};
if (x >= '1' && x <= 'A') return table[x - '1'];
return -1;
}
:あなたはそう読み取り専用データ・セクションの表を発するようにコンパイラを取得することですソースの変換を行うことができます
注意ASCIIまたはUTF-8など)。しかし、ここでも、コンパイラは、どのような標準でも要求される結果を生成する限り、任意のマシンコードを生成することができます。
あなたの助けに感謝します。私は私のソースコードの1つに問題があります。私はオブジェクトコードだけを持っています。私はルックアップテーブルが生成されて見ることができます。しかし、このルックアップテーブルに適用された.sectionは.srodataです。だから私はそれらのセクションに.srodataがどのように適用されているかを見出そうとしています。上記の例では、いくつかのconst変数が使用されている場合には、case文で事前定義された文字の代わりに使用されます。 .srodataの可能性があります。上記のステートメントが明確でない場合は私を修正してください。 – user210463
GNUリンカースクリプトでは、好きなセクションをキャプチャして好きな方法で扱うことができます。 '.srodata'セクションは、「小さな読み取り専用データ」として意図されています。普通の考え方は、すべての小さなセクションをまとめてショートオフセットアドレス指定命令で扱うように設定することです。それを行います(またはそれを提供するものを使用します)。 – torek
私は[このバグレポート](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49857)から収集したもので、コンパイラが 'switch'ステートメントをルックアップテーブルと '.data'で終わる。 –
あなたは*疑問*を持っていますが、疑問はありません:-) https://english.stackexchange.com/questions/2429/can-doubt-sometimes-mean-question – torek