2012-08-24 4 views
3

C 및 x86 어셈블리 코드가 혼합 된 응용 프로그램이 있습니다. 복잡한 이유 때문에 어셈블리 코드는 (의도 된 프로그램 카운터) 값이 C 코드의 개체 코드가있는 영역의 주소인지 여부를 알고 싶어합니다. 이 응용 프로그램은이 이상한 검사를 포함하여 과거에 아주 잘 작동했습니다.Visual Studio : 컴파일 된 코드로 코드 순서/경계 유지

사실 나는 실제로 주소가 신뢰할 수있는 C 코드 영역의 "북 엔드"가 필요합니다. 물론 이것은 컴파일 된 C 코드가 상대적으로 조밀하게로드 이미지에 저장된다고 가정합니다.

나는 현재 더미 함수 LowestAddress() 및 HighestAddress() {}를 정의하고 코드를 포함하는 파일의 처음과 마지막에 배치하여 내 북 엔드를 얻습니다. 어셈블리 코드는 관심있는 값을이 함수의 주소와 비교하여 해당 값이 C 코드 범위에 있는지 확인합니다. 죄송합니다. 두 번째 가정은 함수가 소스 파일 텍스트 순서로 메모리에 정렬된다는 것입니다. 이전 버전의 Visual Studio에서는이 기능이 제대로 적용되었습니다.

아, 더 이상 링크 타임 코드 생성으로 VS2010을 컴파일 할 수 없습니다. (나는 다른 [최적화되지 않은] 설정이 무엇인지 알지 못합니다.) VS2010으로 검사 할 때, 저의 LowestAddress 함수는 분명히 다른 C 함수들을위한 객체 코드의 중간에 있습니다.

어떻게 이러한 북 엔드를 구현할 수 있습니까? 어떤 종류의 세그먼트 컨트롤? VS 2010에서 빌드 할 때 사용할 수있는 옵션은 유용하지 않습니다. (나는 정말로 똑똑한 컴파일러가 콜 그래프에 기반한 캐시 라인 충돌을 최소화하기 위해 실제로 코드를 재 배열 할 수 있다는 것을 이해한다. 실제로 MS가 똑똑한가?). 나는 주문을 정말로 고집하지 않는다. 모두이 지역의 기능은 텍스트 순서에 따른다; 나는 그 지역의 상한선과 하한선을 필요로한다.

는 [I은 [글로벌] 콜 그래프를 구축 할 수있는 유일한 장소입니다 링크 타임 코드 생성, 해제 시도하고있다가 어떤 영향을 볼거야.]

+2

스택 오버플로에 오신 것을 환영합니다! 태그는 키워드가 아닙니다. 즉, stuf- * wait *입니다. 33k 담당자와 새로운 태그'visual'과'studio'를 만들었습니까? 가라, 아이라! ;) – Charles

+0

질문을 입력하고 지금까지는 액세스 권한을 잃어 버렸기 때문에 이상한 브라우저 문제가있었습니다. 나는 아마 그것을 올바르게했을 것입니다. 그러나 항상 유능한 도움을받는 것이 좋습니다. –

+0

내가 생각할 수있는 2 가지 옵션은 링커 옵션/명령으로서 실행 파일에서 함수의 순서를 지정하고 #pragma section을 사용하여 섹션을 지정할 수 있습니다. 그러나 나는 이것을 시도하지 않았다. – Christopher

답변

2

지정할 수 있습니다 /ORDER 컴파일러 매개 변수를 사용하여 함수에 이미지를 배치하는 순서.

+0

그게 효과가 있습니다 !!!! –

관련 문제