Delphi 컴파일과 빌드는 동일한 프로젝트에서 다른 바이너리를 생성합니다.

StackOverflow https://stackoverflow.com/questions/2013312

문제

새로운 VCL 애플리케이션에서 엮다 그리고 짓다 작업은 동일한 바이너리 및 맵 파일을 생성합니다("프로젝트에 버전 정보 포함" 옵션이 꺼져 있어도 .exe 파일 끝에 약간의 차이가 있음 - 이미 논의됨).맵 파일은 바이트 단위로 동일합니다.하지만 타사 구성 요소를 추가하면 빌드 및 컴파일에서 생성된 바이너리와 맵(!) 파일이 크게 다릅니다!

두 가지 버전의 Delphi에서 테스트되었습니다.
- 버전 7.0 (빌드 8.1)
- CodeGear™ RAD Studio 2007 버전 11.0.2902.10471(+2007년 12월 업데이트)

재현 단계:

  1. 새로운 VCL 애플리케이션을 생성합니다.기본 Delphi 구성 요소를 추가할 수도 있습니다(Standart, 추가, Win32 및 시스템 탭의 모든 구성 요소를 사용해 봅니다).
  2. 프로젝트 옵션의 링커 탭에서 상세 맵 파일을 활성화합니다.
  3. 프로젝트 빌드.
  4. 출력 .exe 및 .map 파일의 이름을 바꿉니다(예:project1.exe를 project1b.exe로, project1.map을 project1b.map으로).
  5. 프로젝트 컴파일.
  6. 출력 .exe 및 .map 파일의 이름을 바꿉니다(예:project1.exe를 project1c.exe로, project1.map을 project1c.map으로).
  7. 4단계와 6단계의 파일을 비교합니다.(나는 Winmerge 2.12.4.0을 사용합니다).

약간 다른 .exe 파일과 완전히 동일한 .map 파일이 있습니다.그런 다음 모든 단계를 다시 반복하고 프로젝트 타사 구성 요소(ODAC, DOA, DevExpress 및 selfmade를 사용해 봅니다)에서 사용하면 더 많은 다른 .exe 및 다른 .map 파일을 얻게 됩니다.

왜?어떤 제안이 있으십니까?

업데이트
내가 이것을 발견한 방법과 그것이 내가 관심을 갖는 이유에 대한 몇 가지 정보:
프로젝트는 MSBuild를 사용하여 간단한 스크립트로 빌드됩니다.프로젝트에 ITE(리소스가 포함된 DLL)를 통해 번역이 추가되었을 때 프로젝트가 빌드될 때(스크립트 또는 IDE에서) 번역된 버전이 잘못 작동하는 것을 발견했습니다. 버튼, 라벨 등에 일부 텍스트가 있습니다.잘못된 위치(말 그대로 다른 버튼, 라벨)에서 왔습니다.IDE에서 프로젝트를 컴파일하면 모든 것이 정상입니다.그래서 빌드와 컴파일 출력을 비교하기 시작합니다.

도움이 되었습니까?

해결책

당신이보고있는 것은 단순히 컴파일러의 내장 제작 논리의 인공물입니다. 빌드를 할 때 컴파일러에게 사용 가능한 모든 소스를 빌드하도록 지시합니다. 따라서 Delphi는 각 소스 파일을 처리하고 소스를 찾는 용도 목록의 각 장치에 대해 해당 파일을 빌드합니다. 이것은 재귀 적으로 수행합니다. 컴파일을 할 때 기존 .dcu 파일 만로드하고 최신 상태 인 경우 아무것도 수행되지 않습니다. 이는 실제로 각 .dcu가 사용 목록을 효과적으로 "평평하게"하기 때문에 장치가 발견되는 다른 순서로 이어질 수 있습니다. 장치가 다른 순서로 발견되고로드되므로 다른 순서로 연결되어 있습니다. 이것이 맵 파일이 너무 다르게 보이는 이유입니다. 동일한 소스가 주어지면 한 번 또는 두 개의 컴파일로 두 개의 빌드를 연속으로 수행하면 맵 파일이 동일해야합니다.

차이의 다른 원인은 더 평범하고 PE 헤더 타임 스탬프 및 기타 비트 패딩 및 정렬과 같은 것들이 포함됩니다.

다른 팁

내가 믿는 이 답변에는 두 부분이 있습니다.

IIRC에서 볼 수 있는 문제 중 하나는 컴파일러가 컴파일/빌드를 수행하기 전에 메모리를 0으로 만들지 않는다는 것입니다.따라서 초기화되지 않은 메모리에 남아 있는 모든 항목은 정렬 목적으로 출력의 필러가 됩니다.

또한 해당 애플리케이션의 pe 헤더 정보에 날짜 타임스탬프가 포함되어 있었던 것으로 기억되는 것 같습니다.그러면 매번 차이가 생길 것입니다.

나는 이것을 확인하는 데 가장 적합한 사람은 아니지만 이것이 과거 토론에서 기억나는 것 같습니다.

Allen Bauer나 Barry Kelly와 같은 사람들은 아마도 이에 대해 더 나은/더 정확한 정보를 제공할 수 있을 것입니다.

프로젝트에서 컴파일러 정의를 사용하고 그 변경을 변경 한 경우 컴파일을 수행하는 경우 DCU 및 결과 모듈 (EXE 또는 DLL)의 변경 사항이 표시되지 않습니다. 전체 재건을 수행하면 컴파일러 정의는 새로 생성 된 DCU 및 모듈에 사용됩니다.

나는 우리가 다른 정의가있는 다른 프로젝트에서 모듈을 사용하는 대형 프로젝트 그룹에서 이것을 보았으며 모든 DCU는 동일한 디렉토리에 저장됩니다.

Ergo : 컴파일러는이 경우 정의에 대한 종속성을 시행하지 않습니다.

아마도 당신은 같은 문제를 보았을 것입니다.

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