이것이 실제로 유용한 운동인지는 모르지만 실제로 유용한 기능을 수행하는 응용 프로그램은 적어도 두 개의 Windows .DLL을로드하려고합니다. 그러면 아마도 메모리 사용량이 상당히 증가 할 것입니다.
108kb는 측정 한 응용 프로그램을 말할 때 많이 알려주지 않습니다.
메모리 풋 프린트는 Windows 버전에 따라 다릅니다. Windows 7 이상에는 3 개의 핵심 .DLL이 있습니다. ntdll, kernelbase 및 kernel32 이전 버전에는 ntdll 및 kernel32 만 있습니다. 64 비트 Windows에서 32 비트 응용 프로그램을 실행하는 경우 wow64, wow64cpu 및 wow64win이 프로세스에로드됩니다. Windows 2000을 제외한 모든 버전에서 로더는 자동으로 kernel32 및 종속 항목을로드합니다. 각 .DLL에는 피할 수없는 오버 헤드가 있습니다. PEB에로드 된로드 된 .DLL의 링크 된 목록이 있으며 다른 모든 페이지를 다른 프로세스와 공유 할 수있는 경우에도 로더가 각 .DLL (unless은 새로 설치하지 않은 Windows 설치)의 가져 오기 테이블을 수정합니다. 이론적으로
는 정말 "아무것도하지 않는".EXE에 통제권있는 유일한 것은 SizeOfStackCommit
및 SizeOfHeapCommit
optional header의 회원하지만 스택의 기본은 보통 한 페이지입니다이며,이 값은 너무 설정 올림 그들보다 낮은 사람들은 당신에게 아무 것도주지 못할 것입니다. PEB의 크기와 TEB (s)을 제어 할 수 없으며 기본 프로세스 힙 (heap)을 생성하지 않아도된다고 생각하지 않습니다.
대부분의 사람들은 메모리 풋 프린트가 아닌 smaller file size에 집중하는 경향이 있습니다. 만들 수있는 가장 작은 PE EXE 파일은 32 비트 Windows에서 133 bytes입니다. 아무것도 가져 오지 않으면 97 바이트로 내려받을 수 있지만, kernel32에서 가져온 것으로 가정하기 때문에 Windows 2000에서는 실행되지 않습니다. 이 파일들은 해킹되어서 DOS 헤더 등 위에 PE 헤더를 놓습니다.
목표가 108kb 미만일 경우 Windows 95 또는 NT 4에서 97 바이트 EXE 파일을 시험해 봅니다. Windows 95 모든 주요 시스템 .DLL은 모든 프로세스에서 공유됩니다.
어떤 링커를 사용하고 있습니까? 그리고 링커 옵션이 사용 되었습니까? – Anders
이것은 Windows 버전과 매우 관련이 있습니다. 당신의 프로세스에서'ntdll.dll'과'kernel32.dll' (winbase에서 시작하는'kernelbase.dll')을 읽어 들였습니다. 초기화 된 다른 메모리 구조 ..이 ~ 100kb는 작은 exe가 아니라 시스템 dll, PEB, TEB, 스택 등을 실제 문제가 무엇입니까? – RbMm
@ 틈새를 위해, 나는 단지 곧은 그것을 경련으로 맞췄다. nasm을 사용하여 GoLink와 Microsoft의 링커를 사용했습니다. 나는 힙/스택 크기를 가지고 놀았지만 그 최소값을 줄일 수는 없었다. – ChrisD