2015-01-07 8 views
0

이 경우 응용 프로그램과 dll 모두에 대한 원본이 있습니다.DEP (/ NXCOMPAT)로 인해 LoadLibrary에서 segfault가 발생했습니다 (DllMainCRTStartup에서 아래로)

이 모두/NXCOMPAT없이 컴파일되면 잘 작동합니다. 그러나 /NXCOMPAT으로 컴파일하면 커널 공간에서 segfault가 깊어집니다.

/NXCOMPAT로 dll을 컴파일하고없이 실행 파일을 컴파일하면 제대로 작동합니다. (실행 파일에 대한 DEP 설정이로드 된 dll에 대해 강제 적용되기 때문에 당연한 일입니다.)

이전에 MainCRTStartup 다른 링커 옵션. 그러나이 경우에는 다른 링커 옵션이 설정되어 있지 않으므로 응답이 아닙니다.

누구나 내가 원인을 찾아야한다는 생각을 갖고 있습니까?

편집 : 더 이상합니다. 나는 이것을 VS 2008의 디버거에서 계속 실행했지만, 디버거를 연결하지 않고 실행하면 segfault가 사라집니다. 나는 아직도 모르겠다. 이것은 매우 불만족스러운 해결책이다. 이 일을하는지.

두 번째 편집 : 또한 VS 2013 Express의 디버거에서 실행되는 segfaults.

답변

1

코드가 누락되면 증상에 따라 추측해야합니다. 내 수정 구슬에서 금지 된 LoadLibrary (즉, 내부 DllMainCRTStartup) 내부에서 작업하고 있다고 표시됩니다. 다른 DLL을로드하는 것을 포함하여 LoadLibrary에서 금지되는 매우 긴 목록이 있습니다.

글로벌 개체는 DllMainCRTStartup에서 생성되므로 LoadLibrary 규칙도 준수해야합니다.

+0

DllMainCRTStartup에서 금지 된 작업을하고 있다면 DEP가 활성화되지 않은 상태에서도 충돌이 발생할 것으로 예상됩니다. DEP에 의해 금지 된 것이라 할지라도, 왜 디버거가 붙어서 충돌하는 것일까 요?! _ _ 그것은 저를 정말로 혼란스럽게합니다. – jbcarpen

+0

@jbcarpen : 그건 정의되지 않은 행동의 고전적인 문제입니다. 실패 모드가 일관 적이라면 문제를 쉽게 발견하고 구체적으로보고했을 것입니다. – MSalters