diff options
author | Pali Roh?r <pali@kernel.org> | 2024-07-23 08:52:21 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2024-07-23 08:52:21 +0100 |
commit | 91b999864f9831287f2ea6f960e8fa98e7b13ee9 (patch) | |
tree | b390b844dea3b7f0ca42b9b5e7fab6bd18e37720 | |
parent | 85402ee9edae1be4a3efd53b14826ab6b1061ae4 (diff) | |
download | binutils-91b999864f9831287f2ea6f960e8fa98e7b13ee9.zip binutils-91b999864f9831287f2ea6f960e8fa98e7b13ee9.tar.gz binutils-91b999864f9831287f2ea6f960e8fa98e7b13ee9.tar.bz2 |
Improve objdump's display of PE header information.
PR 31953
-rw-r--r-- | bfd/peXXigen.c | 6 | ||||
-rw-r--r-- | binutils/od-pe.c | 93 | ||||
-rw-r--r-- | include/coff/internal.h | 2 | ||||
-rw-r--r-- | include/coff/pe.h | 4 |
4 files changed, 75 insertions, 30 deletions
diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c index 57cb3f5..51b567e 100644 --- a/bfd/peXXigen.c +++ b/bfd/peXXigen.c @@ -492,7 +492,7 @@ _bfd_XXi_swap_aouthdr_in (bfd * abfd, a->MinorImageVersion = H_GET_16 (abfd, src->MinorImageVersion); a->MajorSubsystemVersion = H_GET_16 (abfd, src->MajorSubsystemVersion); a->MinorSubsystemVersion = H_GET_16 (abfd, src->MinorSubsystemVersion); - a->Reserved1 = H_GET_32 (abfd, src->Reserved1); + a->Win32Version = H_GET_32 (abfd, src->Win32Version); a->SizeOfImage = H_GET_32 (abfd, src->SizeOfImage); a->SizeOfHeaders = H_GET_32 (abfd, src->SizeOfHeaders); a->CheckSum = H_GET_32 (abfd, src->CheckSum); @@ -755,7 +755,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out) aouthdr_out->MajorSubsystemVersion); H_PUT_16 (abfd, extra->MinorSubsystemVersion, aouthdr_out->MinorSubsystemVersion); - H_PUT_32 (abfd, extra->Reserved1, aouthdr_out->Reserved1); + H_PUT_32 (abfd, extra->Win32Version, aouthdr_out->Win32Version); H_PUT_32 (abfd, extra->SizeOfImage, aouthdr_out->SizeOfImage); H_PUT_32 (abfd, extra->SizeOfHeaders, aouthdr_out->SizeOfHeaders); H_PUT_32 (abfd, extra->CheckSum, aouthdr_out->CheckSum); @@ -2849,7 +2849,7 @@ _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile) fprintf (file, "MinorImageVersion\t%d\n", i->MinorImageVersion); fprintf (file, "MajorSubsystemVersion\t%d\n", i->MajorSubsystemVersion); fprintf (file, "MinorSubsystemVersion\t%d\n", i->MinorSubsystemVersion); - fprintf (file, "Win32Version\t\t%08x\n", i->Reserved1); + fprintf (file, "Win32Version\t\t%08x\n", i->Win32Version); fprintf (file, "SizeOfImage\t\t%08x\n", i->SizeOfImage); fprintf (file, "SizeOfHeaders\t\t%08x\n", i->SizeOfHeaders); fprintf (file, "CheckSum\t\t%08x\n", i->CheckSum); diff --git a/binutils/od-pe.c b/binutils/od-pe.c index 28bce3b..a0b8a1a 100644 --- a/binutils/od-pe.c +++ b/binutils/od-pe.c @@ -227,6 +227,17 @@ pe_filter (bfd *abfd) return bfd_get_flavour (abfd) == bfd_target_coff_flavour; } +/* Return string representation of the platform id + stored in upper 2 bits of Win32Version field. */ + +static const char * +pe_platform_id_str (unsigned int platform_id) +{ + static const char *const platform_id_str_table[4] = + { "WinNT", "WinCE", "Win32s", "Win9x" }; + return platform_id_str_table[platform_id & 0x3]; +} + /* Display the list of name (from TABLE) for FLAGS, using comma to separate them. A name is displayed if FLAGS & VAL is not 0. */ @@ -424,8 +435,10 @@ dump_pe_file_header (bfd * abfd, printf (_("Magic:\t\t\t\t%x\t\t- %s\n"), data, data == 0x020b ? "PE32+" : _("Unknown")); - printf (_("Version:\t\t\t%x\n"), - (int) bfd_h_get_16 (abfd, xhdr.standard.vstamp)); + printf (_("Linker Version:\t\t\t%x\t\t- %u.%02u\n"), + (int) bfd_h_get_16 (abfd, xhdr.standard.vstamp), + (int) (bfd_h_get_16 (abfd, xhdr.standard.vstamp) & 0xff), + (int) (bfd_h_get_16 (abfd, xhdr.standard.vstamp) >> 8)); printf (_("Text Size:\t\t\t%#lx\n"), (long) bfd_h_get_32 (abfd, xhdr.standard.tsize)); @@ -448,18 +461,33 @@ dump_pe_file_header (bfd * abfd, (long) bfd_h_get_32 (abfd, xhdr.SectionAlignment)); printf (_("File Alignment:\t\t\t%#lx\n"), (long) bfd_h_get_32 (abfd, xhdr.FileAlignment)); - printf (_("Major OS Version:\t\t%d\n"), - (int) bfd_h_get_16 (abfd, xhdr.MajorOperatingSystemVersion)); - printf (_("Minor OS ersion:\t\t%d\n"), - (int) bfd_h_get_16 (abfd, xhdr.MinorOperatingSystemVersion)); - printf (_("Major Image Version:\t\t%d\n"), - (int) bfd_h_get_16 (abfd, xhdr.MajorImageVersion)); - printf (_("Minor Image Version:\t\t%d\n"), + + printf (_("Image Version:\t\t\t%lx\t\t- %u.%02u\n"), + (long) bfd_h_get_32 (abfd, xhdr.MajorImageVersion), + (int) bfd_h_get_16 (abfd, xhdr.MajorImageVersion), (int) bfd_h_get_16 (abfd, xhdr.MinorImageVersion)); - printf (_("Major Subsystem Version:\t%d\n"), - (int) bfd_h_get_16 (abfd, xhdr.MajorSubsystemVersion)); - printf (_("Minor Subsystem Version:\t%d\n"), + + printf (_("Minimal Subsystem Version:\t%lx\t\t- %u.%02u\n"), + (long) bfd_h_get_32 (abfd, xhdr.MajorSubsystemVersion), + (int) bfd_h_get_16 (abfd, xhdr.MajorSubsystemVersion), (int) bfd_h_get_16 (abfd, xhdr.MinorSubsystemVersion)); + + printf (_("Minimal OS Version:\t\t%lx\t\t- %u.%02u\n"), + (long) bfd_h_get_32 (abfd, xhdr.MajorOperatingSystemVersion), + (int) bfd_h_get_16 (abfd, xhdr.MajorOperatingSystemVersion), + (int) bfd_h_get_16 (abfd, xhdr.MinorOperatingSystemVersion)); + + printf (_("Overwrite OS Version:\t\t%lx\t\t- "), + (long) bfd_h_get_32 (abfd, xhdr.Win32Version)); + if (bfd_h_get_32 (abfd, xhdr.Win32Version) == 0) + printf (_("(default)\n")); + else + printf (_("%u.%02u (build %u, platform %s)\n"), + ((int) (bfd_h_get_32 (abfd, xhdr.Win32Version) & 0xff)), + ((int) ((bfd_h_get_32 (abfd, xhdr.Win32Version) >> 8) & 0xff)), + ((int) ((bfd_h_get_32 (abfd, xhdr.Win32Version) >> 16) & 0x3fff)), + pe_platform_id_str ((bfd_h_get_32 (abfd, xhdr.Win32Version) >> 30) & 0x3)); + printf (_("Size Of Image:\t\t\t%#lx\n"), (long) bfd_h_get_32 (abfd, xhdr.SizeOfImage)); printf (_("Size Of Headers:\t\t%#lx\n"), @@ -509,8 +537,10 @@ dump_pe_file_header (bfd * abfd, printf (_("Magic:\t\t\t\t%x\t\t- %s\n"), data, data == 0x010b ? "PE32" : _("Unknown")); - printf (_("Version:\t\t\t%x\n"), - (int) bfd_h_get_16 (abfd, xhdr.standard.vstamp)); + printf (_("Linker Version:\t\t\t%x\t\t- %u.%02u\n"), + (int) bfd_h_get_16 (abfd, xhdr.standard.vstamp), + (int) (bfd_h_get_16 (abfd, xhdr.standard.vstamp) & 0xff), + (int) (bfd_h_get_16 (abfd, xhdr.standard.vstamp) >> 8)); printf (_("Text Size:\t\t\t%#lx\n"), (long) bfd_h_get_32 (abfd, xhdr.standard.tsize)); @@ -544,18 +574,33 @@ dump_pe_file_header (bfd * abfd, (long) bfd_h_get_32 (abfd, xhdr.SectionAlignment)); printf (_("File Alignment:\t\t\t%#lx\n"), (long) bfd_h_get_32 (abfd, xhdr.FileAlignment)); - printf (_("Major OS Version:\t\t%d\n"), - (int) bfd_h_get_16 (abfd, xhdr.MajorOperatingSystemVersion)); - printf (_("Minor OS ersion:\t\t%d\n"), - (int) bfd_h_get_16 (abfd, xhdr.MinorOperatingSystemVersion)); - printf (_("Major Image Version:\t\t%d\n"), - (int) bfd_h_get_16 (abfd, xhdr.MajorImageVersion)); - printf (_("Minor Image Version:\t\t%d\n"), + + printf (_("Image Version:\t\t\t%lx\t\t- %u.%02u\n"), + (long) bfd_h_get_32 (abfd, xhdr.MajorImageVersion), + (int) bfd_h_get_16 (abfd, xhdr.MajorImageVersion), (int) bfd_h_get_16 (abfd, xhdr.MinorImageVersion)); - printf (_("Major Subsystem Version:\t%d\n"), - (int) bfd_h_get_16 (abfd, xhdr.MajorSubsystemVersion)); - printf (_("Minor Subsystem Version:\t%d\n"), + + printf (_("Minimal Subsystem Version:\t%lx\t\t- %u.%02u\n"), + (long) bfd_h_get_32 (abfd, xhdr.MajorSubsystemVersion), + (int) bfd_h_get_16 (abfd, xhdr.MajorSubsystemVersion), (int) bfd_h_get_16 (abfd, xhdr.MinorSubsystemVersion)); + + printf (_("Minimal OS Version:\t\t%lx\t\t- %u.%02u\n"), + (long) bfd_h_get_32 (abfd, xhdr.MajorOperatingSystemVersion), + (int) bfd_h_get_16 (abfd, xhdr.MajorOperatingSystemVersion), + (int) bfd_h_get_16 (abfd, xhdr.MinorOperatingSystemVersion)); + + printf (_("Overwrite OS Version:\t\t%lx\t\t- "), + (long) bfd_h_get_32 (abfd, xhdr.Win32Version)); + if (bfd_h_get_32 (abfd, xhdr.Win32Version) == 0) + printf (_("(default)\n")); + else + printf (_("%u.%02u (build %u, platform %s)\n"), + ((int) (bfd_h_get_32 (abfd, xhdr.Win32Version) & 0xff)), + ((int) ((bfd_h_get_32 (abfd, xhdr.Win32Version) >> 8) & 0xff)), + ((int) ((bfd_h_get_32 (abfd, xhdr.Win32Version) >> 16) & 0x3fff)), + pe_platform_id_str ((bfd_h_get_32 (abfd, xhdr.Win32Version) >> 30) & 0x3)); + printf (_("Size Of Image:\t\t\t%#lx\n"), (long) bfd_h_get_32 (abfd, xhdr.SizeOfImage)); printf (_("Size Of Headers:\t\t%#lx\n"), diff --git a/include/coff/internal.h b/include/coff/internal.h index c96ac58..3ffc118 100644 --- a/include/coff/internal.h +++ b/include/coff/internal.h @@ -215,7 +215,7 @@ struct internal_extra_pe_aouthdr short MinorImageVersion; /* exe or dll being created, default to 0. */ short MajorSubsystemVersion; /* Minimum subsystem version required to */ short MinorSubsystemVersion; /* run exe; default to 3.1. */ - uint32_t Reserved1; /* Seems to be 0. */ + uint32_t Win32Version; /* Set to 0. */ uint32_t SizeOfImage; /* Size of memory to allocate for prog. */ uint32_t SizeOfHeaders; /* Size of PE header and section table. */ uint32_t CheckSum; /* Set to 0. */ diff --git a/include/coff/pe.h b/include/coff/pe.h index ca5c2e5..37446e4 100644 --- a/include/coff/pe.h +++ b/include/coff/pe.h @@ -264,7 +264,7 @@ typedef struct char MinorImageVersion[2]; char MajorSubsystemVersion[2]; char MinorSubsystemVersion[2]; - char Reserved1[4]; + char Win32Version[4]; char SizeOfImage[4]; char SizeOfHeaders[4]; char CheckSum[4]; @@ -303,7 +303,7 @@ typedef struct char MinorImageVersion[2]; char MajorSubsystemVersion[2]; char MinorSubsystemVersion[2]; - char Reserved1[4]; + char Win32Version[4]; char SizeOfImage[4]; char SizeOfHeaders[4]; char CheckSum[4]; |