2017-10-15 61 views
0

gccコンパイラでオブジェクトコード生成に関する疑問があります。gcc cコンパイラのcswtch生成

私のプログラムでは、objdumpはCSWTCHセクションが生成されたことを示しています。

  1. あなたはCのコードで基準がCSWTCHセクション を生成することが必要かを説明できますか?

  2. CSWTCHセクションの割り当てられた出力セクションは.rodataになりますか?

  3. CSWTCHの出力セクションには小さなローマタを割り当てます。

+1

私は[このバグレポート](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49857)から収集したもので、コンパイラが 'switch'ステートメントをルックアップテーブルと '.data'で終わる。 –

+0

あなたは*疑問*を持っていますが、疑問はありません:-) https://english.stackexchange.com/questions/2429/can-doubt-sometimes-mean-question – torek

答えて

0

回答(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など)。しかし、ここでも、コンパイラは、どのような標準でも要求される結果を生成する限り、任意のマシンコードを生成することができます。

+0

あなたの助けに感謝します。私は私のソースコードの1つに問題があります。私はオブジェクトコードだけを持っています。私はルックアップテーブルが生成されて見ることができます。しかし、このルックアップテーブルに適用された.sectionは.srodataです。だから私はそれらのセクションに.srodataがどのように適用されているかを見出そうとしています。上記の例では、いくつかのconst変数が使用されている場合には、case文で事前定義された文字の代わりに使用されます。 .srodataの可能性があります。上記のステートメントが明確でない場合は私を修正してください。 – user210463

+0

GNUリンカースクリプトでは、好きなセクションをキャプチャして好きな方法で扱うことができます。 '.srodata'セクションは、「小さな読み取り専用データ」として意図されています。普通の考え方は、すべての小さなセクションをまとめてショートオフセットアドレス指定命令で扱うように設定することです。それを行います(またはそれを提供するものを使用します)。 – torek

関連する問題