programing

& & in void *p = &&는 무엇을 의미합니까?

sourcejob 2022. 11. 24. 21:39
반응형

& & in void *p = &&는 무엇을 의미합니까?

우연히 암호 하나를 발견했어void *p = &&abc;의 의의는 무엇입니까?&&여기서요? rvalue references에 대해 알고 있습니다만, 제 생각엔&&이 컨텍스트에서 사용되는 것은 다릅니다.무엇인가.&&에 나타내다.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 파일을 로드한 후 "loader"라고 불리는 운영체제 컴포넌트(Windows에는 "PE Loader", Linux에는 "ELF Loader" 또는 커널에 컴파일된 경우 다른 컴포넌트도 포함)를 실행하여 해당 프로그램을 "가상화"하여 프로세스로 변환합니다.

이 프로세스에서는 RAM 내의 유일한 것으로 간주되어 RAM 전체에 액세스 할 수 있습니다(32비트머신에서는 0x000000-0xFFFFFF).

(위 내용은 무슨 일이 일어나고 있는지 간략히 설명하겠습니다.완전히 이해하려면 조립을 배울 필요가 있으니 조금만 참아주세요)

소스 코드의 라벨은 기본적으로 주소입니다."goto label;"은 해당 주소로 점프하는 것 외에는 아무것도 하지 않습니다(어셈블리 내의 명령 포인터에 대해 생각해 보십시오).이 라벨에는 이 RAM 주소가 저장되어 있습니다.이렇게 하면, 그 주소를 알 수 있습니다.

ASM을 학습한 후, 그 주소가 다음 명령어를 가리키고 있음을 알게 될 것입니다..text실행 파일의 섹션입니다..textsection은 실행할 프로그램의 (실행되는) 코드를 보관하는 섹션입니다.

이것은, 다음의 방법으로 검사할 수 있습니다.

objdump -x a.out

실제적인 예

GCC에서 설명한 바와 같이 이를 사용하여 점프 테이블을 초기화할 수 있습니다.re2c와 같은 스캐너 제너레이터도 있습니다( 참조).-g파라미터)를 사용하여 보다 콤팩트한 스캐너를 생성합니다.어쩌면 같은 기술을 사용하는 파서 발생기도 있을지도 몰라

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

반응형