문제

하나의 EXE와 3 개의 DLL이있는 작은 테스트 솔루션을 가지고 있으며, EXE는 3 개의 DLL을 한 번씩 호출합니다. dll1.dll, dll2.dll 및 dll3.dll의 경우 0x41000000, 0x42000000 및 0x43000000으로 빌드 -> 고급> DLL 기본 주소 설정을 설정했습니다. 나는 을 실행합니다

ngen install ConsoleApplication1.exe
.

이는 3 개의 DLL과 함께 응용 프로그램을 성공적으로 NGEN'D로 만들었습니다. 나는 exe를 정말로 원하지 않았지만 지금까지 이것은 모든 결과를 일으킬 수있는 유일한 방법입니다.

런타임에 VMMAP를 사용하여 가상 주소 공간을 모니터링하고 NGEN'D DLL이 일관된 가상 메모리 범위 내에 있음을 알 수 있지만이 범위 내에서 여전히 주위를 점프하고 있으며 약간 다른 주소가마다 적재됩니다. 나는 그들을 달리는 시간. VMMAP는 이미지를로드하려고하는 주소에 할당 된 것이 없으므로이 점프가있는 동작은 주소 충돌로 인해 발생하지 않습니다.

로그를 유지했습니다.

   Dll1       Dll2       Dll3
0x40140000 0x411D0000 0x42810000 
0x40580000 0x41EB0000 0x426B0000 
0x40190000 0x41FB0000 0x42380000 
0x40F30000 0x41FD0000 0x42050000 
0x409B0000 0x41BF0000 0x42910000 
0x408E0000 0x41860000 0x42050000 
0x40B50000 0x41280000 0x42A80000
.

주소의 처음 두 자리는 모든 실행 중 3 개의 DLL 모두에 대해 일관성을 유지합니다.

실제 질문 : 성공의 지표인가요? 나는 DLL이 0x41000000, 0x42000000 및 0x43000000에서 정확하게 앉아있을 것이라고 생각했기 때문에 조금 혼란 스럽습니다. 결과는 그 지역 주위에 매달려 있지만 실제로 내가 앉아서 실제로 앉아 있지 않았습니다. 나의 이해는 DLL이 비싼 리포지션 작업 (DLL이있는 경우 매우 비싼 매우 비싼)을 겪지 않도록 DLL을 정확히로드 할 필요가 있다는 것입니다. ngen'd). 그러나 이것은 정확히 일어나는 일이 아닌가요? 물론, 내 DLL은 특정 지역에서 매달려 있지만, 내가 그들에게 앉아라고 요청한 곳에서 정확하게 앉아 있지 않으므로, 각 런타임에 비싼 리베이징 작업이 기분이 될 것입니까? 이것은 내가 피하고 싶었던 것입니다.

참고 : 재생 및 NGEN에 대한 주장에 관심이 없습니다. 나는 그저 무슨 일이 일어나는지와 그것을 일하는 방법을 알고 싶습니다.

환호 그렇게!

도움이 되었습니까?

해결책

다른 팁

NGEN 도구가 조립품을 만드는 바이너리 이미지의 기본 주소 지정을 제한하지 않습니다.Afaik 당신은 "선호하는 기본 주소"를 어셈블리 자체로 컴파일해야합니다. "Nofollow"> http://msdn.microsoft.com/en-us/magazine/cc163610.aspx.

편집 *

그러나 로더가 원하는 주소에 모듈을 배치 할 수없는 경우 (다른 모듈 또는 이미 데이터 조각과 겹치기 때문에 로드되거나 할당 된), 모듈이 리베이 처리되어 있어야합니다. 다른 주소.이는 모두의 모든 주소를 의미합니다 실행 파일 이미지를 고정해야합니다.

또한 인터넷을 보고이 기능에 대해 많은 개발자가 원하는 것처럼 보이지만 문제는 다른 개발자 어셈블리와 충돌하지 않는 기본 주소를 예약하는 것입니다.다른 DLL이 당신이 예상했던 주소에 어떤 다른 DLL이 앉아 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top