클래스는 오프셋을 기반으로 멤버함수를 호출한다.
클래스를 동적으로 생성하는 경우 크기만큼 스택을 움직이는 것이 아니라, 동적 메모리함수를 불러 결과값을 받아와 저장해서 사용한다.
클래스의 멤버함수는 컴파일시에 주소가 결정되기 때문에 함수를 부르는 형태를 보면 객체의 주소값을 받아와 바로 콜하는 형태를 갖는다.
가상함수가 있는 경우 객체의 가장 앞에 Vtable 포인터가 생성된다.
C++에서 멤버함수를 호출할 때는, 객체의 포인터인 this 변수가 따라간다. 매번 this가 넘어가기 때문에 묵시적이고, 스택이아니라 레지스터를 통해 넘어간다. IDA에서 __this 가 그 의미이다. gcc 컴파일러의 경우 this가 스택으로 넘어간다.
생성자와 소멸자는 선택 가능한 함수이다. 클래스 생성시 가장 먼저 호출된다.
동적으로 생성될때 동적 메모리 할당의 결과값이 유효하면 생성자 호출, 틀리면 0을 삽입한다. 이 때문에 IDA에서 코드블럭을 보면 좌우로 갈라졌다가 다시 합쳐지는 형태를 갖는다. 소멸자도 마찬가지이다.
Vtable은 .rdata 에 저장된다.
클래스를 동적으로 생성하는 경우 크기만큼 스택을 움직이는 것이 아니라, 동적 메모리함수를 불러 결과값을 받아와 저장해서 사용한다.
클래스의 멤버함수는 컴파일시에 주소가 결정되기 때문에 함수를 부르는 형태를 보면 객체의 주소값을 받아와 바로 콜하는 형태를 갖는다.
가상함수가 있는 경우 객체의 가장 앞에 Vtable 포인터가 생성된다.
C++에서 멤버함수를 호출할 때는, 객체의 포인터인 this 변수가 따라간다. 매번 this가 넘어가기 때문에 묵시적이고, 스택이아니라 레지스터를 통해 넘어간다. IDA에서 __this 가 그 의미이다. gcc 컴파일러의 경우 this가 스택으로 넘어간다.
생성자와 소멸자는 선택 가능한 함수이다. 클래스 생성시 가장 먼저 호출된다.
동적으로 생성될때 동적 메모리 할당의 결과값이 유효하면 생성자 호출, 틀리면 0을 삽입한다. 이 때문에 IDA에서 코드블럭을 보면 좌우로 갈라졌다가 다시 합쳐지는 형태를 갖는다. 소멸자도 마찬가지이다.
Vtable은 .rdata 에 저장된다.
댓글
댓글 쓰기