gcc 컴파일러에서 객체 코드 생성에 대한 의문점이 있습니다.gcc c 컴파일러에서의 cswtch 생성
내 프로그램에서 objdump는 CSWTCH
섹션이 생성되었음을 보여줍니다.
당신은 C 코드의 기준이
CSWTCH
섹션 생성 할 필요가 무엇인지 설명 할 수 있을까요?CSWTCH
섹션에 할당 된 출력 섹션은.rodata
입니다.CSWTCH
의 출력 섹션으로 작은 막대기를 할당 할 조건.
gcc 컴파일러에서 객체 코드 생성에 대한 의문점이 있습니다.gcc c 컴파일러에서의 cswtch 생성
내 프로그램에서 objdump는 CSWTCH
섹션이 생성되었음을 보여줍니다.
당신은 C 코드의 기준이 CSWTCH
섹션 생성 할 필요가 무엇인지 설명 할 수 있을까요?
CSWTCH
섹션에 할당 된 출력 섹션은 .rodata
입니다.
CSWTCH
의 출력 섹션으로 작은 막대기를 할당 할 조건.
대답은 (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 등). 그러나 여기에서도 컴파일러는 모든 표준이 요구하는 결과를 산출하는 한 임의의 기계 코드를 생성 할 수 있습니다.
도움을 주셔서 감사합니다. 내 소스 코드 중 하나에서 문제가있어. 글쎄 개체 코드가 있습니다. 조회 테이블이 생성 된 것을 볼 수 있습니다.하지만이 조회 테이블에 적용된 섹션은 .srodata입니다. 그래서 그 .section에 .srodata가 어떻게 적용되는지 찾으려고 노력 중입니다. 또한 위의 예에서 일부 const 변수가 사용되는 경우 case 문에서 미리 정의 된 문자 대신에. .srodata의 기회가있을 수 있습니다. 위의 문장이 명확하지 않으면 수정하십시오. – user210463
GNU 링커 스크립트에서 원하는 부분을 캡처하여 원하는 방식으로 처리 할 수 있습니다. '.srodata' 섹션은 "작은 읽기 전용 데이터"로되어 있습니다 : 일반적인 아이디어는 모든 작은 섹션을 모아서 짧은 오프셋 주소 지정 명령어로 해결하도록 설정하는 것입니다. 그래서 링커 스크립트를 작성해야합니다. 그것 (또는 그것을하는 제공 한 것을 사용하십시오)을하십시오. – torek
[이 버그 리포트] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49857)에서 수집 한 것부터 컴파일러가 'switch'문을 a로 매핑 할 때 생성됩니다 룩업 테이블에 저장되며 결국'.data '로 끝납니다. –
* 질문 *, 의심 * * :-)이 없습니다. https://english.stackexchange.com/questions/2429/can-doubt-sometimes-mean-question – torek