Windows DLL 파일을 테스트하여 32비트인지 64비트인지 확인하려면 어떻게 해야 합니까?
특정 디렉토리의 모든 DLL 파일이 특정 빌드 유형이라고 주장하는 테스트 스크립트 또는 프로그램을 작성하려고 합니다.
이를 SDK 빌드 프로세스가 끝날 때 건전성 검사로 사용하여 64비트 버전에 32비트 DLL 파일이 없는지 확인하고 그 반대의 경우도 마찬가지입니다.
DLL 파일을 보고 유형을 쉽게 확인할 수 있는 방법이 있습니까?
이 솔루션은 xp32와 xp64 모두에서 작동해야 합니다.
대략적인 방법은 각 DLL의 Visual Studio 도구에서 헤더 옵션을 사용하여 덤프빈을 호출하고 적절한 출력을 찾는 것입니다.
dumpbin/down my32bit.dll PE 서명을 찾았습니다. 파일 형식: DLL 파일 헤더 값14C 기계(x86)섹션 수 1개45499E0A 날짜 스탬프 2006년 11월 02일 03:28:10기호 테이블에 대한 0 파일 포인터기호 0개선택적 헤더의 E0 크기2102 특성실행 파일32비트 워드머신DLL 선택적 헤더 값10B 매직 # (PE32)
이 출력에서 폴이 언급한 14C 값을 포함하여 32비트 DLL이라는 몇 가지 단서를 볼 수 있습니다.스크립트에서 찾기 쉬울 것입니다.
Cygwin(또는 MobaXTerm, Git Bash for Windows, WSL, 또는...)이 설치되어 있으면 DLL에서 '파일' 유틸리티를 사용할 수 있습니다.
file <filename>
이는 다음과 같은 출력을 제공합니다.
icuuc36.dll: MS-DOS executable PE for MS Windows (DLL) (GUI) Intel 80386 32-bit
코리상세
DLL은 PE 실행 파일 형식을 사용하며, 파일에서 해당 정보를 읽는 것은 그리 까다롭지 않습니다.
개요는 PE 파일 형식에 대한 MSDN 문서를 참조하십시오.MS-DOS 헤더를 읽은 다음 IMAGE_NT_HEADERS 구조를 읽어야 합니다.여기에는 다음 값 중 하나를 포함하는 시스템 멤버에 필요한 정보가 포함된 IMAGE_FILE_HEADER 구조가 포함됩니다.
- IMAGE_FILE_MACHINE_I386(0x014c)
- IMAGE_FILE_MACHINE_IA64(0x0200)
- IMAGE_FILE_MACHINE_AMD64(0x8664)
이 정보는 파일의 고정 오프셋에 있어야 하지만 MS-DOS 헤더와 IMAGE_NT_HEADERS의 서명을 확인하여 나중에 변경될 사항이 있는지 확인하는 것이 좋습니다.
이미지 사용머리글 읽기 도움말...
이미지를 사용할 수도 있습니다.API가 이를 수행하도록 도와줍니다. LoadImage로 DLL을 로드하면 IMAGE_NT_HEADERS 구조에 대한 포인터를 포함하는 LOADDED_IMAGE 구조를 얻을 수 있습니다.ImageUnload를 사용하여 LOADED_IMAGE의 할당을 해제합니다.
...또는 이 거친 Perl 스크립트를 조정합니다.
다음은 작업을 수행하는 대략적인 Perl 스크립트입니다.파일에 DOS 헤더가 있는지 확인한 다음 IMAGE_DOS_HEADER에서 PE 오프셋 60바이트를 파일로 읽어 들입니다.
그런 다음 PE 부분의 시작 부분을 찾고 서명을 읽고 확인한 다음 우리가 관심 있는 값을 추출합니다.
#!/usr/bin/perl
#
# usage: petype <exefile>
#
$exe = $ARGV[0];
open(EXE, $exe) or die "can't open $exe: $!";
binmode(EXE);
if (read(EXE, $doshdr, 64)) {
($magic,$skip,$offset)=unpack('a2a58l', $doshdr);
die("Not an executable") if ($magic ne 'MZ');
seek(EXE,$offset,SEEK_SET);
if (read(EXE, $pehdr, 6)){
($sig,$skip,$machine)=unpack('a2a2v', $pehdr);
die("No a PE Executable") if ($sig ne 'PE');
if ($machine == 0x014c){
print "i386\n";
}
elsif ($machine == 0x0200){
print "IA64\n";
}
elsif ($machine == 0x8664){
print "AMD64\n";
}
else{
printf("Unknown machine type 0x%lx\n", $machine);
}
}
}
close(EXE);
Dependency Walker는 (거의) 모든 것을 말해줍니다.http://www.dependencywalker.com/
"설치"하지 않습니다. 가져오기만 하면 압축을 풀고 Exec을 실행할 수 있습니다.모든 x32 또는 x64 윈도우 모듈/응용 프로그램에 사용할 수 있습니다.
제 기억으로는 dll 모듈과 appl 이후의 모든 종속성을 보는 것은 매우 간단합니다.는 완전한 x64, x32(x86) 또는 각각의 일부인지 확인할 수 있는 종속성의 합입니다.
모듈이 구축된 CPU의 유형은 "CPU" 열에 있습니다.대부분의 64비트 aps는 여전히 32비트 ap/ball x86을 제외하고 각각의 일부입니다.
괴짜/프로그래머들을 위한 아름다운 프로그램이며 무료입니다.
저는 그것을 정확히 수행하는 매우 간단한 도구를 썼습니다 - 그것은 PE 디스트럭터라고 불립니다.
DLL 파일을 로드하고 부팅하기만 하면 됩니다.
위의 예에서 로드된 DLL은 32비트입니다.
여기에서 다운로드할 수 있습니다(64비트 버전의 컴파일된 ATM만 있습니다).
https://files.quickmediasolutions.com/exe/pedeconstructor_0.1_amd64.exe
이전 32비트 버전은 다음 사이트에서 사용할 수 있습니다.
https://dl.dropbox.com/u/31080052/pedeconstructor.zip
언급URL : https://stackoverflow.com/questions/495244/how-can-i-test-a-windows-dll-file-to-determine-if-it-is-32-bit-or-64-bit
'programing' 카테고리의 다른 글
MS SQL Server 2008용 포트를 찾는 방법은 무엇입니까? (0) | 2023.05.21 |
---|---|
process.env란 무엇입니까?Node.js의 포트? (0) | 2023.05.21 |
Xcode 프로젝트에 몇 줄의 코드가 있는지 어떻게 알 수 있습니까? (0) | 2023.05.21 |
ObjectId 함수에 대한 Node.js Mongoose.js 문자열 (0) | 2023.04.01 |
Null이 아닌 속성이 과도 값을 참조함 - 현재 작업 전에 임시 인스턴스를 저장해야 합니다. (0) | 2023.04.01 |