windows - skelne en 32bit fra en 64bit PE objektfil genereret af cl.exe (Visual Studio C ++)

Indlæg af Hanne Mølgaard Plasc

Problem



I betragtning af to PE-objektfiler fra cl.exe, en 32bit og en 64bit, hvordan kan jeg fortælle den ene fra den anden uden til unix-værktøjer, og helst på kommandolinjen (cmd.exe eller powershell )?


C:> "...VCincl.exe" -c test.c           -Fotest32.obj
C:> "...VCinx86\_amd64cl.exe" -c test.c -Fotest64.obj


Hvis jeg installerer msys2, kan værktøjet file ikke give mening: [12]


$ file test*.obj
test32.obj: Intel 80386 COFF object file, not stripped, 3 sections, [...]
test64.obj: data


file --version er 5,28, men den nyere 5.25 gør ikke noget bedre. msys2 tilbyder ikke en objdump.exe, men når den kopieres til Linux, kan den korrekt fortælle disse to filer fra hinanden:


$ objdump -a test64.obj
test64.obj:     file format pe-x86-64
$ objdump -a test32.obj
test32.obj:     file format pe-i386


Noget der gør det bedre end file og er tilgængeligt via msys2 s pacman, kan også være interessant.

Bedste reference


Den mest straight forward måde er at bruge Microsofts DUMPBIN-værktøj, der passerer/HEADERS-indstillingen, for eksempel [13] [14]


dumpbin /HEADERS cl.exe | findstr "machine"


Dette giver følgende output til et 64-bit billede


            8664 machine (x64)


eller følgende for et 32-bit billede


             14C machine (x86)
                   32 bit word machine