2017-10-15 5 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'문을 a로 매핑 할 때 생성됩니다 룩업 테이블에 저장되며 결국'.data '로 끝납니다. –

+0

* 질문 *, 의심 * * :-)이 없습니다. https://english.stackexchange.com/questions/2429/can-doubt-sometimes-mean-question – torek

답변

0

대답은 (1) 해당 기준이 없습니다. 이것은 값 테이블을 생성하는 컴파일러의 기술 중 하나입니다. (2) 컴파일러, 어셈블러 및 링커에 달려 있습니다. (3) 컴파일러, 어셈블러 및 링커에 달려 있습니다.

GCC (이상 버전의 gcc 5) 86 여기에 모두 .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: 

가 (필자는 -Os 스위치가 x86에서 조회 테이블을 생산하는 데 필요한 것을 발견 -O으로, I 더 일반적인 점프 테이블을 얻으십시오.)

이 경우 .section 지시문이 적용되어 .rodata 섹션에 테이블이 적용됩니다. 하지만 이것은 하나의 시스템 구현 방법 일뿐입니다. 컴파일러에 대한 요구 사항은 없습니다. 이 변환은 그 시스템의 사용을 가정 (

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

도움을 주셔서 감사합니다. 내 소스 코드 중 하나에서 문제가있어. 글쎄 개체 코드가 있습니다. 조회 테이블이 생성 된 것을 볼 수 있습니다.하지만이 조회 테이블에 적용된 섹션은 .srodata입니다. 그래서 그 .section에 .srodata가 어떻게 적용되는지 찾으려고 노력 중입니다. 또한 위의 예에서 일부 const 변수가 사용되는 경우 case 문에서 미리 정의 된 문자 대신에. .srodata의 기회가있을 수 있습니다. 위의 문장이 명확하지 않으면 수정하십시오. – user210463

+0

GNU 링커 스크립트에서 원하는 부분을 캡처하여 원하는 방식으로 처리 할 수 ​​있습니다. '.srodata' 섹션은 "작은 읽기 전용 데이터"로되어 있습니다 : 일반적인 아이디어는 모든 작은 섹션을 모아서 짧은 오프셋 주소 지정 명령어로 해결하도록 설정하는 것입니다. 그래서 링커 스크립트를 작성해야합니다. 그것 (또는 그것을하는 제공 한 것을 사용하십시오)을하십시오. – torek