diff options
author | Jon TURNEY <jon.turney@dronecode.org.uk> | 2014-04-08 10:59:43 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2014-04-08 10:59:43 +0100 |
commit | 61e2488cd8497d158303a78563ad40f51f5c3f8e (patch) | |
tree | 096a515807bb59268398b4dd879929e93f78fec3 /include | |
parent | ae1d276159c3cfb29caacdf567aea01f433f78b0 (diff) | |
download | gdb-61e2488cd8497d158303a78563ad40f51f5c3f8e.zip gdb-61e2488cd8497d158303a78563ad40f51f5c3f8e.tar.gz gdb-61e2488cd8497d158303a78563ad40f51f5c3f8e.tar.bz2 |
Add support for generating and inserting build IDs into COFF binaries.
* peXXigen.c (pe_print_debugdata): New function: Displays the
contents of the debug directory and decodes codeview entries.
(_bfd_XXi_swap_debugdir_in, _bfd_XXi_swap_debugdir_out)
(_bfd_XXi_slurp_codeview_record, _bfd_XXi_write_codeview_record):
Add functions for reading and writing debugdir and codeview
records.
* libpei.h (_bfd_XXi_swap_debugdir_in, _bfd_XXi_swap_debugdir_out)
(_bfd_XXi_write_codeview_record): Add prototypes and macros.
* libcoff-in.h (pe_tdata): Add build-id data.
* libcoff.h: Regenerate.
* coffcode.h (coff_write_object_contents): Run build_id
after_write_object_contents hook.
* pe.h (external_IMAGE_DEBUG_DIRECTORY, _CV_INFO_PDB70)
(_CV_INFO_PDB20): Add structures and constants for debug directory
and codeview records.
* internal.h (internal_IMAGE_DEBUG_DIRECTORY, CODEVIEW_INFO):
Add structures and constants for internal representation of debug
directory and codeview records.
* emultempl/elf32.em (id_note_section_size, read_hex, write_build_id):
Move code for parsing build-id option and calculating the build-id to...
* ldbuildid.c: New file.
* ldbuildid.h: New file.
* Makefile.am (CFILES, HFILES, OFILES, ld_new_SOURCES): Add new
files.
* Makefile.in: Regenerate.
* ld.texinfo: Update --build-id description to mention COFF
support.
* NEWS: Mention support for COFF build ids.
* emultempl/pe.em (gld${EMULATION_NAME}_handle_option):
(pecoff_checksum_contents, write_build_id, setup_build_id)
(gld_${EMULATION_NAME}_after_open): Handle and implement
build-id option.
* emultempl/pep.em: Likewise.
Diffstat (limited to 'include')
-rw-r--r-- | include/coff/ChangeLog | 9 | ||||
-rw-r--r-- | include/coff/internal.h | 116 | ||||
-rw-r--r-- | include/coff/pe.h | 49 |
3 files changed, 129 insertions, 45 deletions
diff --git a/include/coff/ChangeLog b/include/coff/ChangeLog index 2ee6361..769e9ea 100644 --- a/include/coff/ChangeLog +++ b/include/coff/ChangeLog @@ -1,3 +1,12 @@ +2014-04-08 Jon TURNEY <jon.turney@dronecode.org.uk> + + * pe.h (external_IMAGE_DEBUG_DIRECTORY, _CV_INFO_PDB70) + (_CV_INFO_PDB20): Add structures and constants for debug directory + and codeview records. + * internal.h (internal_IMAGE_DEBUG_DIRECTORY, CODEVIEW_INFO): + Add structures and constants for internal representation of debug + directory and codeview records. + 2014-03-13 Tristan Gingold <gingold@adacore.com> * pe.h (struct external_ANON_OBJECT_HEADER_BIGOBJ): Declare. diff --git a/include/coff/internal.h b/include/coff/internal.h index b34e5c6..47e85d9 100644 --- a/include/coff/internal.h +++ b/include/coff/internal.h @@ -1,18 +1,18 @@ /* Internal format of COFF object file data structures, for GNU BFD. This file is part of BFD, the Binary File Descriptor library. - + Copyright (C) 1999-2014 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, @@ -55,7 +55,7 @@ struct internal_extra_pe_filehdr unsigned short e_res2[10]; /* Reserved words, all 0x0 */ bfd_vma e_lfanew; /* File address of new exe header, 0x80 */ unsigned long dos_message[16]; /* text which always follows dos header */ - bfd_vma nt_signature; /* required NT signature, 0x4550 */ + bfd_vma nt_signature; /* required NT signature, 0x4550 */ }; #define GO32_STUBSIZE 2048 @@ -66,7 +66,7 @@ struct internal_filehdr /* coff-stgo32 EXE stub header before BFD tdata has been allocated. Its data is kept in INTERNAL_FILEHDR.GO32STUB afterwards. - + F_GO32STUB is set iff go32stub contains a valid data. Artifical headers created in BFD have no pre-set go32stub. */ char go32stub[GO32_STUBSIZE]; @@ -109,7 +109,7 @@ struct internal_filehdr #define F_GO32STUB (0x4000) /* Extra structure which is used in the optional header. */ -typedef struct _IMAGE_DATA_DIRECTORY +typedef struct _IMAGE_DATA_DIRECTORY { bfd_vma VirtualAddress; long Size; @@ -132,6 +132,44 @@ typedef struct _IMAGE_DATA_DIRECTORY /* DataDirectory[15] is currently reserved, so no define. */ #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 +/* Extra structure used in debug directory. */ +struct internal_IMAGE_DEBUG_DIRECTORY +{ + unsigned long Characteristics; + unsigned long TimeDateStamp; + unsigned short MajorVersion; + unsigned short MinorVersion; + unsigned long Type; + unsigned long SizeOfData; + unsigned long AddressOfRawData; + unsigned long PointerToRawData; +}; + +#define PE_IMAGE_DEBUG_TYPE_UNKNOWN 0 +#define PE_IMAGE_DEBUG_TYPE_COFF 1 +#define PE_IMAGE_DEBUG_TYPE_CODEVIEW 2 +#define PE_IMAGE_DEBUG_TYPE_FPO 3 +#define PE_IMAGE_DEBUG_TYPE_MISC 4 +#define PE_IMAGE_DEBUG_TYPE_EXCEPTION 5 +#define PE_IMAGE_DEBUG_TYPE_FIXUP 6 +#define PE_IMAGE_DEBUG_TYPE_OMAP_TO_SRC 7 +#define PE_IMAGE_DEBUG_TYPE_OMAP_FROM_SRC 8 +#define PE_IMAGE_DEBUG_TYPE_BORLAND 9 +#define PE_IMAGE_DEBUG_TYPE_RESERVED10 10 +#define PE_IMAGE_DEBUG_TYPE_CLSID 11 + +/* Extra structure for a codeview debug record */ +#define CV_INFO_SIGNATURE_LENGTH 16 + +typedef struct _CODEVIEW_INFO +{ + unsigned long CVSignature; + char Signature[CV_INFO_SIGNATURE_LENGTH]; + unsigned int SignatureLength; + unsigned long Age; + // char PdbFileName[]; +} CODEVIEW_INFO; + /* Default image base for NT. */ #define NT_EXE_IMAGE_BASE 0x400000 #define NT_DLL_IMAGE_BASE 0x10000000 @@ -147,22 +185,22 @@ typedef struct _IMAGE_DATA_DIRECTORY # define PE_DEF_FILE_ALIGNMENT 0x200 #endif -struct internal_extra_pe_aouthdr +struct internal_extra_pe_aouthdr { /* FIXME: The following entries are in AOUTHDR. But they aren't available internally in bfd. We add them here so that objdump can dump them. */ - /* The state of the image file */ + /* The state of the image file. */ short Magic; - /* Linker major version number */ + /* Linker major version number. */ char MajorLinkerVersion; - /* Linker minor version number */ + /* Linker minor version number. */ char MinorLinkerVersion; - /* Total size of all code sections */ + /* Total size of all code sections. */ long SizeOfCode; - /* Total size of all initialized data sections */ + /* Total size of all initialized data sections. */ long SizeOfInitializedData; - /* Total size of all uninitialized data sections */ + /* Total size of all uninitialized data sections. */ long SizeOfUninitializedData; /* Address of entry point relative to image base. */ bfd_vma AddressOfEntryPoint; @@ -170,40 +208,40 @@ struct internal_extra_pe_aouthdr bfd_vma BaseOfCode; /* Address of the first data section relative to image base. */ bfd_vma BaseOfData; - + /* PE stuff */ - bfd_vma ImageBase; /* address of specific location in memory that - file is located, NT default 0x10000 */ - - bfd_vma SectionAlignment; /* section alignment default 0x1000 */ - bfd_vma FileAlignment; /* file alignment default 0x200 */ - short MajorOperatingSystemVersion; /* minimum version of the operating */ - short MinorOperatingSystemVersion; /* system req'd for exe, default to 1*/ - short MajorImageVersion; /* user defineable field to store version of */ - 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 */ - long Reserved1; /* seems to be 0 */ - long SizeOfImage; /* size of memory to allocate for prog */ - long SizeOfHeaders; /* size of PE header and section table */ - long CheckSum; /* set to 0 */ + bfd_vma ImageBase; /* Address of specific location in memory that + file is located, NT default 0x10000. */ + + bfd_vma SectionAlignment; /* Section alignment default 0x1000. */ + bfd_vma FileAlignment; /* File alignment default 0x200. */ + short MajorOperatingSystemVersion; /* Minimum version of the operating. */ + short MinorOperatingSystemVersion; /* System req'd for exe, default to 1. */ + short MajorImageVersion; /* User defineable field to store version of */ + 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. */ + long Reserved1; /* Seems to be 0. */ + long SizeOfImage; /* Size of memory to allocate for prog. */ + long SizeOfHeaders; /* Size of PE header and section table. */ + long CheckSum; /* Set to 0. */ short Subsystem; - /* type of subsystem exe uses for user interface, + /* Type of subsystem exe uses for user interface, possible values: 1 - NATIVE Doesn't require a subsystem 2 - WINDOWS_GUI runs in Windows GUI subsystem 3 - WINDOWS_CUI runs in Windows char sub. (console app) 5 - OS2_CUI runs in OS/2 character subsystem - 7 - POSIX_CUI runs in Posix character subsystem */ - unsigned short DllCharacteristics; /* flags for DLL init */ - bfd_vma SizeOfStackReserve; /* amount of memory to reserve */ - bfd_vma SizeOfStackCommit; /* amount of memory initially committed for - initial thread's stack, default is 0x1000 */ - bfd_vma SizeOfHeapReserve; /* amount of virtual memory to reserve and */ - bfd_vma SizeOfHeapCommit; /* commit, don't know what to defaut it to */ - long LoaderFlags; /* can probably set to 0 */ - long NumberOfRvaAndSizes; /* number of entries in next entry, 16 */ + 7 - POSIX_CUI runs in Posix character subsystem. */ + unsigned short DllCharacteristics; /* flags for DLL init. */ + bfd_vma SizeOfStackReserve; /* Amount of memory to reserve. */ + bfd_vma SizeOfStackCommit; /* Amount of memory initially committed for + initial thread's stack, default is 0x1000. */ + bfd_vma SizeOfHeapReserve; /* Amount of virtual memory to reserve and */ + bfd_vma SizeOfHeapCommit; /* commit, don't know what to defaut it to. */ + long LoaderFlags; /* Can probably set to 0. */ + long NumberOfRvaAndSizes; /* Number of entries in next entry, 16. */ IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; }; diff --git a/include/coff/pe.h b/include/coff/pe.h index 3166531..0ed9dde 100644 --- a/include/coff/pe.h +++ b/include/coff/pe.h @@ -1,4 +1,4 @@ -/* pe.h - PE COFF header information +/* pe.h - PE COFF header information Copyright (C) 1999-2014 Free Software Foundation, Inc. @@ -163,9 +163,9 @@ #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12 #define IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER 13 #define IMAGE_SUBSYSTEM_XBOX 14 - + /* Magic values that are true for all dos/nt implementations. */ -#define DOSMAGIC 0x5a4d +#define DOSMAGIC 0x5a4d #define NT_SIGNATURE 0x00004550 /* NT allows long filenames, we want to accommodate this. @@ -264,7 +264,7 @@ struct external_PEI_filehdr /* 32-bit PE a.out header: */ -typedef struct +typedef struct { AOUTHDR standard; @@ -300,7 +300,7 @@ typedef struct /* Like PEAOUTHDR, except that the "standard" member has no BaseOfData (aka data_start) member and that some of the members are 8 instead of just 4 bytes long. */ -typedef struct +typedef struct { #ifdef AOUTHDRSZ64 AOUTHDR64 standard; @@ -338,7 +338,7 @@ typedef struct #else #define PEPAOUTSZ 240 #endif - + #undef E_FILNMLEN #define E_FILNMLEN 18 /* # characters in a file name. */ @@ -584,4 +584,41 @@ struct external_pex64_scope_entry (PEX64_OFFSET_TO_SCOPE_COUNT(COUNTOFUNWINDCODES) + \ PEX64_SCOPE_ENTRY_SIZE * (IDX)) +/* Extra structure used in debug directory */ +struct external_IMAGE_DEBUG_DIRECTORY { + char Characteristics[4]; + char TimeDateStamp[4]; + char MajorVersion[2]; + char MinorVersion[2]; + char Type[4]; + char SizeOfData[4]; + char AddressOfRawData[4]; + char PointerToRawData[4]; +}; + +/* Extra structures used in codeview debug record */ +/* This is not part of the PE specification */ + +#define CVINFO_PDB70_CVSIGNATURE 0x53445352 // "RSDS" +#define CVINFO_PDB20_CVSIGNATURE 0x3031424e // "NB10" +#define CVINFO_CV50_CVSIGNATURE 0x3131424e // "NB11" +#define CVINFO_CV41_CVSIGNATURE 0x3930424e // âNB09" + +typedef struct _CV_INFO_PDB70 +{ + char CvSignature[4]; + char Signature[16]; + char Age[4]; + char PdbFileName[]; +} CV_INFO_PDB70; + +typedef struct _CV_INFO_PDB20 +{ + char CvHeader[4]; + char Offset[4]; + char Signature[4]; + char Age[4]; + char PdbFileName[]; +} CV_INFO_PDB20; + #endif /* _PE_H */ |