Programing

void에서 &&는 무엇을 의미합니까 * p = && abc;

crosscheck 2020. 8. 16. 19:14
반응형

void에서 &&는 무엇을 의미합니까 * p = && abc;


코드 조각을 발견했습니다 void *p = &&abc;. 여기서의 의미는 무엇입니까 &&? rvalue 참조에 대해 알고 있지만 &&이 컨텍스트에서 사용되는 것은 다르다고 생각 합니다. 무엇을 &&의미 void *p = &&abc;합니까?


&&현재 함수에 정의 된 레이블의 주소를 가져 오는 gcc의 확장 입니다.

void *p = &&abc 표준 C99 및 C ++에서는 불법입니다.

이것은 g ++로 컴파일됩니다.


그것을 찾는 방법

이것이 라벨의 주소이며 GCC와 관련된 기능 입니다.

int main(void) {
    void* startp;
s:
    startp = &&s;
    printf("the assignment above starts at address %p\n", startp);
    return 0;
}

테스트를 통해 직접 알아낼 수 있습니다.

int main(void) {
    void* startp;
    int a;
    startp = &&a;
    printf("startp=%p\n", startp);
    return 0;
}

이 경우 GCC는 다음과 같이 말합니다.

오류 : 레이블 'a'가 사용되었지만 정의되지 않았습니다.

후드 아래-조립

이것을 이해하기 위해서는 어셈블러를 알아야하지만 레이블 주소가 무엇을 의미하는지 설명하려고합니다.

OS가 디스크에서 .exe 파일을로드 한 후 "로더"라는 운영 체제의 구성 요소 (윈도우에는 "PE 로더"가 있고, Linux에는 "ELF 로더"가 있습니다. 커널), 해당 프로그램의 "가상화"를 수행하여 프로세스로 전환합니다.

이 프로세스는 이것이 RAM에서 유일한 것으로 간주하고 전체 RAM (즉, 32 비트 시스템에서 0x00000000-0xFFFFFFFF)에 액세스 할 수 있습니다.

(위는 무슨 일이 일어나고 있는지에 대한 짧은 오버 와이트입니다. 당신은 그것을 완전히 이해하기 위해 정말로 어셈블리를 배워야합니다.

이제 소스 코드의 레이블은 기본적으로 주소입니다. "고토 레이블;" 해당 주소로 점프하는 것 외에는 아무것도하지 않습니다 ( 어셈블리 명령어 포인터대해 생각해보십시오 ). 이 레이블은이 RAM 주소를 저장하며, 그 주소를 찾을 수있는 방법입니다.

ASM을 배운 후에는 해당 주소 .text가 실행 파일 섹션 내의 명령어를 가리킴을 알게 될 것 입니다. .text섹션으로 실행될 프로그램 (이진) 코드를 보유하고있는 것입니다.

다음을 사용하여이를 검사 할 수 있습니다.

objdump -x a.out

실용적인 예

GCC에 설명 된대로 이를 사용하여 점프 테이블을 초기화 할 수 있습니다. re2c ( 매개 변수 참조) 와 같은 일부 스캐너 생성기이를 사용하여보다 컴팩트 한 스캐너를 생성합니다. 동일한 기술을 사용 하는 파서 생성기 가있을 수도 있습니다 .-g

참고 URL : https://stackoverflow.com/questions/6106493/what-does-mean-in-void-p-abc

반응형