2013-04-28 1 views

답변

4

어셈블러! 그것은 그것보다 작아 질 수 없다.

+3

코더에 따라 다릅니다. 현대의 c 컴파일러는 99 %의 코더를 능가 할 것입니다. –

+0

어셈블러는 실행되는 프로세서에 의존하지 않습니까? – user2327287

+0

@CaptainSkyhawk : MSVC C++ 컴파일러를 사용하여 C 코드를 컴파일하면 모든 OS 게시물에 공통적 인 DLL이 필요합니다. -XP? – user2327287

2

답변을 찾을 수 없습니다. C와 어셈블리는 찾을 수있는 가장 작은 실행 파일 중 일부를 제공하지만 조심하지 않으면 거대한 실행 파일을 제공 할 수도 있습니다.

모든 최신 컴파일러는 매우 효율적인 실행 파일을 만듭니다.

걱정하지 마십시오. 가장 쉬운 일을하는 언어를 선택하십시오.

+0

개념 증명이기 때문에 실제로 일을 끝내는 것이 아닙니다. – user2327287

2

이것은 사용하는 특정 빌드 도구 (컴파일러 및 링커)와 언어 자체가 아닌 구성 및 내용에 의해 결정됩니다.

일반 C를 사용하고 C 런타임 라이브러리를 제외하면 Visual C++ 2010에서 작은 실행 파일을 생성 할 수 있습니다.

C 런타임 라이브러리를 사용해야하는 경우 Visual C++ 6 (단점 : 지원 중단) 또는 mingw (단점 : 기술적으로 지원되지 않는 실행 파일 생성)를 시도해야 할 수도 있습니다. 둘 다 런타임 라이브러리를 사용합니다. Windows XP 이상에 내장되어 있습니다.

런타임 라이브러리가없는 Visual C++ 2010의 실행 가능 크기는 최대 512 바이트의 코드 및 초기화 된 데이터에 대해 1K입니다. 적어도 하나의 섹션이 있어야하고 최소 섹션 오프셋과 크기가 모두 512 바이트이기 때문에 작업 가능한 Windows 실행 파일만큼 작습니다.

일반적으로 실행 파일 크기는 512 바이트의 오버 헤드와 코드 및 초기화 된 데이터의 크기를 512 바이트의 배수로 반올림 한 것입니다.

Visual Studio 2010에서 런타임 라이브러리를 제외하려면 링커 -> 입력에서 "모든 기본 라이브러리 무시"를 "예"로 설정하고 링커 -> 고급에서 진입 점 (예 : "NoCRTMain")을 설정하십시오. > 코드 생성 -이 구성의 주요 함수의 서명은 또한 "No"로 C에서/C++ "버퍼 보안 검사"로 설정해야 할 수도 있습니다

void __stdcall NoCRTMain() 

입니다. 버퍼 보안 검사 기능은 런타임 라이브러리 기능을 사용합니다.

코드 및 상수 데이터가 512 바이트 미만인 경우 실행 파일 크기는 3K가되며 비정규 데이터를 초기화 한 경우 3.5K가됩니다.

매니페스트를 포함하지 않음으로써 다른 512 바이트를 저장할 수 있습니다 (링커 ​​-> 매니페스트 파일).

이미지를 비 변동 가능하게 만들어 다른 512 바이트를 저장할 수 있습니다. Linker-> Advanced에서 "Randomized Base Address"를 "No"로 설정하고 "Fixed Base Address"를 "Yes"로 설정하십시오.

1K로 낮추려면 코드, 상수 데이터 및 초기화 된 데이터 섹션을 병합해야합니다.이렇게하려면 링커 -> 명령 줄에서 이러한 추가 명령 줄 옵션을 추가 : 보안상의 이유로

/SECTION:.text,ERW /MERGE:".rdata=.text" /MERGE:".data=.text" 

, 당신은 초기화 된 데이터 섹션을 병합 할 것을 선호 할 수 있습니다; 이렇게하면 데이터 실행 방지 (DEP)가 부분적으로 사용되지 않도록 설정됩니다. 그렇다면

/MERGE:".rdata=.text" 

을 사용하거나 동일한 옵션을 링커 -> 고급에서 설정하십시오.

모든 섹션을 병합하지 않은 경우 기본 MS-DOS 스텁을 더 작은 것으로 바꾸어 512 바이트를 저장할 수 있습니다. 전체 헤더 크기가 512 바이트의 최소 맞춤 크기에 맞도록 줄입니다. 이 작업은/STUB 명령 행 옵션 (링커 -> 명령 행)을 추가하고 minimal stub available here을 사용하여 수행 할 수 있습니다. 원하는 경우 Windows 실행 파일의 처음 64 바이트를 추출하여 최소 스텁을 직접 만들 수 있습니다.

관련 문제