문제

내 프로젝트 중 하나(Visual Studio 6)에 /TSAWARE 링커 플래그를 추가한 후 PE 파일(.idata)에서 새 섹션을 발견하고 놀랐습니다.플래그를 설정하지 않으면 가져오기가 .rdata로 병합됩니다.

"문제"를 설명하기 위해 간단한 콘솔 프로그램으로 시작합니다.

#include <stdio.h>
int main() 
{
    printf("hello world\n");
    return 0;
}

다음으로 컴파일합니다. cl /Og /O1 /GF /WX /c main.c

그런 다음

  • link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:a.exe main.obj
  • link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:b.exe /TSAWARE main.obj

dumpbin 출력을 비교해 보겠습니다.

Dump of file a.exe

File Type: EXECUTABLE IMAGE

  Summary

        4000 .data
        1000 .rdata
        5000 .text

Dump of file b.exe

File Type: EXECUTABLE IMAGE

  Summary

        4000 .data
        1000 .idata
        1000 .rdata
        5000 .text

따라서 어떤 이유로 링커는 가져오기를 병합할 수 없다고 결정합니다.

하지만 우리가 달리면 editbin /TSAWARE a.exe PE 선택적 헤더의 DLL 특성 필드만 변경됩니다.

누구든지 나에게 이것을 설명해 줄 수 있습니까?이것은 링커의 버그입니까, 아니면 editbin에 의해 변경된 실행 파일이 결국 특정 시스템에서 작동하지 않을 수 있습니까?

도움이 되었습니까?

해결책

단지 추측 : 터미널 서버 시스템에서는 이미지에 가능한 몇 페이지를 작성하기를 원합니다. 이미지에 해당하는 메모리 페이지가 수정되지 않은 경우, 물리적 RAM의 단일 페이지를 해당 이미지를 사용하는 EASH 세션에 매핑 할 수 있습니다. 이미지의 페이지가 수정되면 시스템은 모든 세션간에 페이지의 각 인스턴스에 대해 사본-쓰기 작업을 수행하고 각 세션에서 다른 물리적 메모리 블록을 사용하여 각 세션의 페이지를 나타냅니다.

가져온 DLL을 재배치 해야하는 경우 이미지의 가져 오기가 종종 수정되어야하므로, 수입을 보유하는 페이지는 종종 수정되어 세션간에 공유에 참여할 수 없습니다. 링커가 일반적으로 수정되지 않은 다른 데이터와 가져 오면 불필요하게 복사 페이지의 수를 증가시킬 수 있습니다.

이것은 세션에서 복사 된 페이지 수를 줄이는 데 도움이되는 일종의 최적화 일 수 있습니다.

내가 말했듯이 - 이것은 순전히 추측입니다.

다른 팁

@WarrenP의 의견이 정확합니다.에 따르면 MSDN 문서:

/tsaware 옵션은 image_optional_header dllcharacteristics 필드에서 플래그를 프로그램 이미지의 옵션 헤더에 설정합니다.이 플래그가 설정되면 터미널 서버는 응용 프로그램을 특정 변경하지 않습니다.

응용 프로그램이 터미널 서버 인식 (레거시 애플리케이션이라고도 함)이 아닌 경우 터미널 서버는 레거시 애플리케이션을 수정하여 다중 사용자 환경에서 올바르게 작동하도록합니다.예를 들어, Terminal Server는 가상 Windows 폴더를 만들어 각 사용자가 시스템의 Windows 디렉토리를 가져 오지 않고 Windows 폴더를 가져옵니다.이를 통해 사용자는 자신의 INI 파일에 액세스 할 수 있습니다.또한 터미널 서버는 레거시 애플리케이션을 위해 레지스트리를 조정합니다.이러한 수정으로 인해 터미널 서버에서 레거시 응용 프로그램의로드가 느려집니다.

응용 프로그램이 터미널 서버 인식 인 경우 설정 중에 INI 파일에 의존하거나 HKEY_CURRENT_USER 레지스트리에 쓰지 않아야합니다.

/tsaware를 사용하고 응용 프로그램이 여전히 INI 파일을 사용하는 경우 파일은 시스템의 모든 사용자가 공유합니다.그것이 허용되는 경우에도 신청서를 /tsaware와 연결할 수 있습니다.그렇지 않으면 /TSAWARE:NO를 사용해야 합니다.

여기서 암시되는 한 가지는 TS를 인식하지 않는 프로세스에 대해서만 섀도우 키가 활성화된다는 것입니다.

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