2009-12-23 2 views
0

stub이라는 네임 스페이스에 몇 가지 기능이 있습니다. 적어도 네임 스페이스의 정확한 시작 주소와 최종 주소를 결정해야합니다.이 주소는 메모리의 네임 스페이스 크기 이상이어야합니다. 이 동안 네임 스페이스의 끝에메모리의 함수/스텁/네임 스페이스 크기 결정

void stub_end() { }

을 추가하고 스텁의 크기를 결정하기 위해

size_t size = reinterpret_cast<ULONG_PTR>(stub_end) - reinterpret_cast<ULONG_PTR>(stub_start);

를 사용하여 2008 Visual C++에서 완벽했다.

Visual C++는 .cpp 파일에있는 것처럼 함수 순서를 보존했기 때문에이 작업이 효과적 이었지만 Visual C++ 2010에서는 그렇지 않습니다.

어떻게하면 pragma 지시문, 컴파일러/링커 기능 또는 유사 기능을 사용하여 함수 또는 전체 네임 스페이스/스텁의 크기를 알 수 있습니까?

+1

네임 스페이스는 포함 된 유형 및 기능에 대한 저장소를 의미하지는 않으며 구문 도구입니다. –

+0

나도 알아, 근본적으로 질문은 어떤 종류의 함수 다. (예제에서와 같이 마지막 함수도 비어있을 수있는 첫 번째 함수와 마지막 함수가 주어진다.) –

+1

컴파일러는 코드를 주문할 필요가 없다. 선언의 순서대로 그리고 최적화가 가능 해지 자마자 분명히하지 않을 것입니다. –

답변

1

요즘엔 새로운 힙합 (힙 무작위 화, layout randomization 등 ..)이 훨씬 더 어려울 것이라고 생각합니다. 결국 각 기능을 개별적으로 복사해야 할 수도 있습니다.

0

당신이 시도하고 다른 섹션에서 각 기능을 놓고 VC++ 해당하는 GCC의 속성 ((절 ("name")))을 http://www.delorie.com/gnu/docs/gcc/gcc_62.html를 사용하여 다음 기술을 사용하거나 다른 각각의 기능을 배치 할 수 있습니다 소스 파일.

0

C++ 언어는 네임 스페이스의 주소 또는 크기를 찾는 데 대한 보장을 제공하지 않습니다. 즉, 어셈블리 언어와 링커 지침을 참고하십시오.

많은 어셈블리 언어에는 특정 주소에 코드를 배치하는 opcode 또는 니모닉이 있습니다. 이렇게하면 레이블을 설정하여 메모리 영역의 시작을 나타낼 수 있습니다. 일부 링커에는 세그먼트 시작 주소 및 크기를 얻기위한 변수가 있습니다. 이들은 사용자 정의 논리 주소입니다.

요약하면 어셈블리 및 링커 도구를 사용하여 네임 스페이스 시작 및 길이에 대한 공용 기호 또는 선택적으로 세그먼트 끝을 정의 할 수 있습니다. C++ 프로그램에서 이러한 레이블은 extern으로 액세스하십시오.

+0

Visual C++에서 지시문에 대한 예제를 제공 할 수 있습니까? –