[llvm] r349605 - [llvm-objcopy] Initial COFF support
Kostya Serebryany via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 20 11:59:32 PST 2018
Thanks!
Please make sure to run with ubsan after the fix, there seem to be at least
3 similar instances.
This is what I've done locally:
cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
-DLLVM_USE_SANITIZER=Undefined -DLLVM_ENABLE_ASSERTIONS=YES ~/llvm
ninja check-llvm
I'd recommend using more C++-ish code, e.g. at least
- memcpy(Ptr, S.AuxData.data(), S.AuxData.size());
+ std::copy(S.AuxData.begin(), S.AuxData.end(), Ptr);
On Wed, Dec 19, 2018 at 9:33 AM Kostya Serebryany <kcc at google.com> wrote:
> Hi,
>
> ubsan seems to be unhappy with this change, please fix ASAP
>
>
> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/27463/steps/check-llvm%20ubsan/logs/stdio
>
> b/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-objcopy/COFF/Writer.cpp:228:17: runtime error: null pointer passed as argument 2, which is declared to never be null
> /usr/include/string.h:43:28: note: nonnull attribute specified here
> #0 0x436e89 in llvm::objcopy::coff::COFFWriter::writeSections() /b/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-objcopy/COFF/Writer.cpp:228:5
> #1 0x436f2a in llvm::objcopy::coff::COFFWriter::write(bool) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-objcopy/COFF/Writer.cpp:255:3
> #2 0x432664 in llvm::objcopy::coff::executeObjcopyOnBinary(llvm::objcopy::CopyConfig const&, llvm::object::COFFObjectFile&, llvm::objcopy::Buffer&) /b/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp:35:10
> #3 0x42ef45 in executeObjcopy /b/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-objcopy/llvm-objcopy.cpp:211:7
> #4 0x42ef45 in main /b/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-objcopy/llvm-objcopy.cpp:231
> #5 0x7f702c5862e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)
> #6 0x409c09 in _start (/b/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/bin/llvm-objcopy+0x409c09)
>
>
> --
>
>
> On Tue, Dec 18, 2018 at 11:27 PM Martin Storsjo via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: mstorsjo
>> Date: Tue Dec 18 23:24:38 2018
>> New Revision: 349605
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=349605&view=rev
>> Log:
>> [llvm-objcopy] Initial COFF support
>>
>> This is an initial implementation of no-op passthrough copying of COFF
>> with objcopy.
>>
>> Differential Revision: https://reviews.llvm.org/D54939
>>
>> Added:
>> llvm/trunk/test/tools/llvm-objcopy/COFF/
>> llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/
>> llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/i386-exe.yaml
>> llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/i386-obj.yaml
>> llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/x86_64-exe.yaml
>> llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/x86_64-obj.yaml
>> llvm/trunk/test/tools/llvm-objcopy/COFF/basic-copy.test
>> llvm/trunk/tools/llvm-objcopy/COFF/
>> llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
>> llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.h
>> llvm/trunk/tools/llvm-objcopy/COFF/Object.h
>> llvm/trunk/tools/llvm-objcopy/COFF/Reader.cpp
>> llvm/trunk/tools/llvm-objcopy/COFF/Reader.h
>> llvm/trunk/tools/llvm-objcopy/COFF/Writer.cpp
>> llvm/trunk/tools/llvm-objcopy/COFF/Writer.h
>> Modified:
>> llvm/trunk/include/llvm/Object/COFF.h
>> llvm/trunk/lib/Object/COFFObjectFile.cpp
>> llvm/trunk/tools/llvm-objcopy/CMakeLists.txt
>> llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp
>>
>> Modified: llvm/trunk/include/llvm/Object/COFF.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/COFF.h?rev=349605&r1=349604&r2=349605&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Object/COFF.h (original)
>> +++ llvm/trunk/include/llvm/Object/COFF.h Tue Dec 18 23:24:38 2018
>> @@ -971,6 +971,9 @@ public:
>> return nullptr;
>> return reinterpret_cast<const dos_header *>(base());
>> }
>> + std::error_code getCOFFHeader(const coff_file_header *&Res) const;
>> + std::error_code
>> + getCOFFBigObjHeader(const coff_bigobj_file_header *&Res) const;
>> std::error_code getPE32Header(const pe32_header *&Res) const;
>> std::error_code getPE32PlusHeader(const pe32plus_header *&Res) const;
>> std::error_code getDataDirectory(uint32_t index,
>>
>> Modified: llvm/trunk/lib/Object/COFFObjectFile.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/COFFObjectFile.cpp?rev=349605&r1=349604&r2=349605&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Object/COFFObjectFile.cpp (original)
>> +++ llvm/trunk/lib/Object/COFFObjectFile.cpp Tue Dec 18 23:24:38 2018
>> @@ -938,6 +938,18 @@ iterator_range<base_reloc_iterator> COFF
>> return make_range(base_reloc_begin(), base_reloc_end());
>> }
>>
>> +std::error_code
>> +COFFObjectFile::getCOFFHeader(const coff_file_header *&Res) const {
>> + Res = COFFHeader;
>> + return std::error_code();
>> +}
>> +
>> +std::error_code
>> +COFFObjectFile::getCOFFBigObjHeader(const coff_bigobj_file_header *&Res)
>> const {
>> + Res = COFFBigObjHeader;
>> + return std::error_code();
>> +}
>> +
>> std::error_code COFFObjectFile::getPE32Header(const pe32_header *&Res)
>> const {
>> Res = PE32Header;
>> return std::error_code();
>>
>> Added: llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/i386-exe.yaml
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/i386-exe.yaml?rev=349605&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/i386-exe.yaml (added)
>> +++ llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/i386-exe.yaml Tue Dec
>> 18 23:24:38 2018
>> @@ -0,0 +1,84 @@
>> +--- !COFF
>> +OptionalHeader:
>> + AddressOfEntryPoint: 4144
>> + ImageBase: 4194304
>> + SectionAlignment: 4096
>> + FileAlignment: 512
>> + MajorOperatingSystemVersion: 6
>> + MinorOperatingSystemVersion: 0
>> + MajorImageVersion: 0
>> + MinorImageVersion: 0
>> + MajorSubsystemVersion: 6
>> + MinorSubsystemVersion: 0
>> + Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI
>> + DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE,
>> IMAGE_DLL_CHARACTERISTICS_NX_COMPAT, IMAGE_DLL_CHARACTERISTICS_NO_SEH,
>> IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE ]
>> + SizeOfStackReserve: 1048576
>> + SizeOfStackCommit: 4096
>> + SizeOfHeapReserve: 1048576
>> + SizeOfHeapCommit: 4096
>> + ExportTable:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + ImportTable:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + ResourceTable:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + ExceptionTable:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + CertificateTable:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + BaseRelocationTable:
>> + RelativeVirtualAddress: 12288
>> + Size: 12
>> + Debug:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + Architecture:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + GlobalPtr:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + TlsTable:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + LoadConfigTable:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + BoundImport:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + IAT:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + DelayImportDescriptor:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + ClrRuntimeHeader:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> +header:
>> + Machine: IMAGE_FILE_MACHINE_I386
>> + Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE,
>> IMAGE_FILE_32BIT_MACHINE ]
>> +sections:
>> + - Name: .text
>> + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE,
>> IMAGE_SCN_MEM_READ ]
>> + VirtualAddress: 4096
>> + VirtualSize: 83
>> + SectionData:
>> 5589E5508B45088B0D00204000034D088945FC89C883C4045DC3660F1F4400005589E55DC3662E0F1F840000000000905589E583EC08E8E5FFFFFFC745FC00000000C7042402000000E8B2FFFFFF83C4085DC3
>> + - Name: .data
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
>> + VirtualAddress: 8192
>> + VirtualSize: 4
>> + SectionData: '01000000'
>> + - Name: .reloc
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
>> + VirtualAddress: 12288
>> + VirtualSize: 12
>> + SectionData: 001000000C00000009300000
>> +symbols: []
>> +...
>>
>> Added: llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/i386-obj.yaml
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/i386-obj.yaml?rev=349605&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/i386-obj.yaml (added)
>> +++ llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/i386-obj.yaml Tue Dec
>> 18 23:24:38 2018
>> @@ -0,0 +1,244 @@
>> +--- !COFF
>> +header:
>> + Machine: IMAGE_FILE_MACHINE_I386
>> + Characteristics: [ ]
>> +sections:
>> + - Name: .text
>> + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE,
>> IMAGE_SCN_MEM_READ ]
>> + Alignment: 16
>> + SectionData:
>> 5589E5508B45088B0D00000000034D088945FC89C883C4045DC3660F1F4400005589E55DC3662E0F1F840000000000905589E583EC08E800000000C745FC00000000C7042402000000E80000000083C4085DC3
>> + Relocations:
>> + - VirtualAddress: 9
>> + SymbolName: _x
>> + Type: IMAGE_REL_I386_DIR32
>> + - VirtualAddress: 55
>> + SymbolName: ___main
>> + Type: IMAGE_REL_I386_REL32
>> + - VirtualAddress: 74
>> + SymbolName: _f
>> + Type: IMAGE_REL_I386_REL32
>> + - Name: .data
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
>> + Alignment: 4
>> + SectionData: '01000000'
>> + - Name: .bss
>> + Characteristics: [ IMAGE_SCN_CNT_UNINITIALIZED_DATA,
>> IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
>> + Alignment: 4
>> + SectionData: ''
>> + - Name: .debug_str
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
>> + Alignment: 1
>> + SectionData:
>> 636C616E672076657273696F6E20382E302E3020287472756E6B203334363337382920286C6C766D2F7472756E6B203334363339302900736F757263652E63002F686F6D652F6D617274696E2F636F64652F6C6C766D2F6275696C642F6F626A636F70792D696E707574007800696E740066005F5F6D61696E006D61696E007900
>> + - Name: .debug_abbrev
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
>> + Alignment: 1
>> + SectionData:
>> 011101250E1305030E10171B0E110112060000023400030E49133A0B3B0B02180000032400030E3E0B0B0B0000042E01110112064018030E3A0B3B0B271949133F1900000505000218030E3A0B3B0B49130000062E00110112064018030E3A0B3B0B27193F190000072E00110112064018030E3A0B3B0B49133F19000000
>> + - Name: .debug_info
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
>> + Alignment: 1
>> + SectionData:
>> 850000000400000000000401000000000C003700000000000000400000000000000053000000026B000000370000000101050300000000036D000000050404000000001A000000015571000000010337000000050291087F00000001033700000000062000000005000000015573000000010707300000002300000001557A00000001093700000000
>> + Relocations:
>> + - VirtualAddress: 6
>> + SymbolName: .debug_abbrev
>> + Type: IMAGE_REL_I386_SECREL
>> + - VirtualAddress: 12
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_I386_SECREL
>> + - VirtualAddress: 18
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_I386_SECREL
>> + - VirtualAddress: 22
>> + SymbolName: .debug_line
>> + Type: IMAGE_REL_I386_SECREL
>> + - VirtualAddress: 26
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_I386_SECREL
>> + - VirtualAddress: 30
>> + SymbolName: .text
>> + Type: IMAGE_REL_I386_DIR32
>> + - VirtualAddress: 39
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_I386_SECREL
>> + - VirtualAddress: 51
>> + SymbolName: _x
>> + Type: IMAGE_REL_I386_DIR32
>> + - VirtualAddress: 56
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_I386_SECREL
>> + - VirtualAddress: 63
>> + SymbolName: .text
>> + Type: IMAGE_REL_I386_DIR32
>> + - VirtualAddress: 73
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_I386_SECREL
>> + - VirtualAddress: 87
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_I386_SECREL
>> + - VirtualAddress: 99
>> + SymbolName: .text
>> + Type: IMAGE_REL_I386_DIR32
>> + - VirtualAddress: 109
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_I386_SECREL
>> + - VirtualAddress: 116
>> + SymbolName: .text
>> + Type: IMAGE_REL_I386_DIR32
>> + - VirtualAddress: 126
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_I386_SECREL
>> + - Name: .debug_macinfo
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
>> + Alignment: 1
>> + SectionData: '00'
>> + - Name: .debug_line
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
>> + Alignment: 1
>> + SectionData:
>> 52000000040020000000010101FB0E0D00010101010000000100000100736F757263652E6300000000000005020000000014050A0A75050C0666050366050006CB05010A3D0500C9050A0A0821050306BA0205000101
>> + Relocations:
>> + - VirtualAddress: 45
>> + SymbolName: .text
>> + Type: IMAGE_REL_I386_DIR32
>> + - Name: .llvm_addrsig
>> + Characteristics: [ IMAGE_SCN_LNK_REMOVE ]
>> + Alignment: 1
>> + SectionData: '1314'
>> +symbols:
>> + - Name: .text
>> + Value: 0
>> + SectionNumber: 1
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 83
>> + NumberOfRelocations: 3
>> + NumberOfLinenumbers: 0
>> + CheckSum: 4183332250
>> + Number: 1
>> + - Name: .data
>> + Value: 0
>> + SectionNumber: 2
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 4
>> + NumberOfRelocations: 0
>> + NumberOfLinenumbers: 0
>> + CheckSum: 3099354981
>> + Number: 2
>> + - Name: .bss
>> + Value: 0
>> + SectionNumber: 3
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 0
>> + NumberOfRelocations: 0
>> + NumberOfLinenumbers: 0
>> + CheckSum: 0
>> + Number: 3
>> + - Name: .debug_str
>> + Value: 0
>> + SectionNumber: 4
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 129
>> + NumberOfRelocations: 0
>> + NumberOfLinenumbers: 0
>> + CheckSum: 2876129505
>> + Number: 4
>> + - Name: .debug_abbrev
>> + Value: 0
>> + SectionNumber: 5
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 126
>> + NumberOfRelocations: 0
>> + NumberOfLinenumbers: 0
>> + CheckSum: 2218663305
>> + Number: 5
>> + - Name: .debug_info
>> + Value: 0
>> + SectionNumber: 6
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 137
>> + NumberOfRelocations: 16
>> + NumberOfLinenumbers: 0
>> + CheckSum: 2577207131
>> + Number: 6
>> + - Name: .debug_macinfo
>> + Value: 0
>> + SectionNumber: 7
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 1
>> + NumberOfRelocations: 0
>> + NumberOfLinenumbers: 0
>> + CheckSum: 0
>> + Number: 7
>> + - Name: .debug_line
>> + Value: 0
>> + SectionNumber: 8
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 86
>> + NumberOfRelocations: 1
>> + NumberOfLinenumbers: 0
>> + CheckSum: 2357396799
>> + Number: 8
>> + - Name: .llvm_addrsig
>> + Value: 0
>> + SectionNumber: 9
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 2
>> + NumberOfRelocations: 0
>> + NumberOfLinenumbers: 0
>> + CheckSum: 2067109359
>> + Number: 9
>> + - Name: '@feat.00'
>> + Value: 1
>> + SectionNumber: -1
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + - Name: _f
>> + Value: 0
>> + SectionNumber: 1
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_FUNCTION
>> + StorageClass: IMAGE_SYM_CLASS_EXTERNAL
>> + - Name: _x
>> + Value: 0
>> + SectionNumber: 2
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + - Name: ___main
>> + Value: 32
>> + SectionNumber: 1
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_FUNCTION
>> + StorageClass: IMAGE_SYM_CLASS_EXTERNAL
>> + - Name: _main
>> + Value: 48
>> + SectionNumber: 1
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_FUNCTION
>> + StorageClass: IMAGE_SYM_CLASS_EXTERNAL
>> +...
>>
>> Added: llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/x86_64-exe.yaml
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/x86_64-exe.yaml?rev=349605&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/x86_64-exe.yaml (added)
>> +++ llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/x86_64-exe.yaml Tue
>> Dec 18 23:24:38 2018
>> @@ -0,0 +1,89 @@
>> +--- !COFF
>> +OptionalHeader:
>> + AddressOfEntryPoint: 4144
>> + ImageBase: 1073741824
>> + SectionAlignment: 4096
>> + FileAlignment: 512
>> + MajorOperatingSystemVersion: 6
>> + MinorOperatingSystemVersion: 0
>> + MajorImageVersion: 0
>> + MinorImageVersion: 0
>> + MajorSubsystemVersion: 6
>> + MinorSubsystemVersion: 0
>> + Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI
>> + DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA,
>> IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE,
>> IMAGE_DLL_CHARACTERISTICS_NX_COMPAT,
>> IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE ]
>> + SizeOfStackReserve: 1048576
>> + SizeOfStackCommit: 4096
>> + SizeOfHeapReserve: 1048576
>> + SizeOfHeapCommit: 4096
>> + ExportTable:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + ImportTable:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + ResourceTable:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + ExceptionTable:
>> + RelativeVirtualAddress: 16384
>> + Size: 24
>> + CertificateTable:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + BaseRelocationTable:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + Debug:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + Architecture:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + GlobalPtr:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + TlsTable:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + LoadConfigTable:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + BoundImport:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + IAT:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + DelayImportDescriptor:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> + ClrRuntimeHeader:
>> + RelativeVirtualAddress: 0
>> + Size: 0
>> +header:
>> + Machine: IMAGE_FILE_MACHINE_AMD64
>> + Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE,
>> IMAGE_FILE_LARGE_ADDRESS_AWARE ]
>> +sections:
>> + - Name: .text
>> + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE,
>> IMAGE_SCN_MEM_READ ]
>> + VirtualAddress: 4096
>> + VirtualSize: 87
>> + SectionData:
>> 50894C24048B0DF51F0000034C240489C859C3662E0F1F8400000000000F1F00C3662E0F1F8400000000000F1F440000554883EC30488D6C2430E8E1FFFFFFC745FC00000000B902000000E8B0FFFFFF904883C4305DC3
>> + - Name: .rdata
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_READ ]
>> + VirtualAddress: 8192
>> + VirtualSize: 20
>> + SectionData: 0101010001020000010A03350A03055201500000
>> + - Name: .data
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
>> + VirtualAddress: 12288
>> + VirtualSize: 4
>> + SectionData: '01000000'
>> + - Name: .pdata
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_READ ]
>> + VirtualAddress: 16384
>> + VirtualSize: 24
>> + SectionData: '001000001310000000200000301000005710000008200000'
>> +symbols: []
>> +...
>>
>> Added: llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/x86_64-obj.yaml
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/x86_64-obj.yaml?rev=349605&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/x86_64-obj.yaml (added)
>> +++ llvm/trunk/test/tools/llvm-objcopy/COFF/Inputs/x86_64-obj.yaml Tue
>> Dec 18 23:24:38 2018
>> @@ -0,0 +1,295 @@
>> +--- !COFF
>> +header:
>> + Machine: IMAGE_FILE_MACHINE_AMD64
>> + Characteristics: [ ]
>> +sections:
>> + - Name: .text
>> + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE,
>> IMAGE_SCN_MEM_READ ]
>> + Alignment: 16
>> + SectionData:
>> 50894C24048B0D00000000034C240489C859C3662E0F1F8400000000000F1F00C3662E0F1F8400000000000F1F440000554883EC30488D6C2430E800000000C745FC00000000B902000000E800000000904883C4305DC3
>> + Relocations:
>> + - VirtualAddress: 7
>> + SymbolName: x
>> + Type: IMAGE_REL_AMD64_REL32
>> + - VirtualAddress: 59
>> + SymbolName: __main
>> + Type: IMAGE_REL_AMD64_REL32
>> + - VirtualAddress: 76
>> + SymbolName: f
>> + Type: IMAGE_REL_AMD64_REL32
>> + - Name: .data
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
>> + Alignment: 4
>> + SectionData: '01000000'
>> + - Name: .bss
>> + Characteristics: [ IMAGE_SCN_CNT_UNINITIALIZED_DATA,
>> IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
>> + Alignment: 4
>> + SectionData: ''
>> + - Name: .xdata
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_READ ]
>> + Alignment: 4
>> + SectionData: 0101010001020000010A03350A03055201500000
>> + - Name: .debug_str
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
>> + Alignment: 1
>> + SectionData:
>> 636C616E672076657273696F6E20382E302E3020287472756E6B203334363337382920286C6C766D2F7472756E6B203334363339302900736F757263652E63002F686F6D652F6D617274696E2F636F64652F6C6C766D2F6275696C642F6F626A636F70792D696E707574007800696E740066005F5F6D61696E006D61696E007900
>> + - Name: .debug_abbrev
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
>> + Alignment: 1
>> + SectionData:
>> 011101250E1305030E10171B0E110112060000023400030E49133A0B3B0B02180000032400030E3E0B0B0B0000042E01110112064018030E3A0B3B0B271949133F1900000505000218030E3A0B3B0B49130000062E00110112064018030E3A0B3B0B27193F190000072E00110112064018030E3A0B3B0B49133F19000000
>> + - Name: .debug_info
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
>> + Alignment: 1
>> + SectionData:
>> 990000000400000000000801000000000C00370000000000000040000000000000000000000057000000026B0000003F000000010109030000000000000000036D00000005040400000000000000001300000001577100000001033F000000050291047F00000001033F000000000620000000000000000100000001577300000001070730000000000000002700000001567A00000001093F00000000
>> + Relocations:
>> + - VirtualAddress: 6
>> + SymbolName: .debug_abbrev
>> + Type: IMAGE_REL_AMD64_SECREL
>> + - VirtualAddress: 12
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_AMD64_SECREL
>> + - VirtualAddress: 18
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_AMD64_SECREL
>> + - VirtualAddress: 22
>> + SymbolName: .debug_line
>> + Type: IMAGE_REL_AMD64_SECREL
>> + - VirtualAddress: 26
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_AMD64_SECREL
>> + - VirtualAddress: 30
>> + SymbolName: .text
>> + Type: IMAGE_REL_AMD64_ADDR64
>> + - VirtualAddress: 43
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_AMD64_SECREL
>> + - VirtualAddress: 55
>> + SymbolName: x
>> + Type: IMAGE_REL_AMD64_ADDR64
>> + - VirtualAddress: 64
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_AMD64_SECREL
>> + - VirtualAddress: 71
>> + SymbolName: .text
>> + Type: IMAGE_REL_AMD64_ADDR64
>> + - VirtualAddress: 85
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_AMD64_SECREL
>> + - VirtualAddress: 99
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_AMD64_SECREL
>> + - VirtualAddress: 111
>> + SymbolName: .text
>> + Type: IMAGE_REL_AMD64_ADDR64
>> + - VirtualAddress: 125
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_AMD64_SECREL
>> + - VirtualAddress: 132
>> + SymbolName: .text
>> + Type: IMAGE_REL_AMD64_ADDR64
>> + - VirtualAddress: 146
>> + SymbolName: .debug_str
>> + Type: IMAGE_REL_AMD64_SECREL
>> + - Name: .debug_macinfo
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
>> + Alignment: 1
>> + SectionData: '00'
>> + - Name: .pdata
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_READ ]
>> + Alignment: 4
>> + SectionData: '000000001300000000000000000000002700000008000000'
>> + Relocations:
>> + - VirtualAddress: 0
>> + SymbolName: f
>> + Type: IMAGE_REL_AMD64_ADDR32NB
>> + - VirtualAddress: 4
>> + SymbolName: f
>> + Type: IMAGE_REL_AMD64_ADDR32NB
>> + - VirtualAddress: 8
>> + SymbolName: .xdata
>> + Type: IMAGE_REL_AMD64_ADDR32NB
>> + - VirtualAddress: 12
>> + SymbolName: main
>> + Type: IMAGE_REL_AMD64_ADDR32NB
>> + - VirtualAddress: 16
>> + SymbolName: main
>> + Type: IMAGE_REL_AMD64_ADDR32NB
>> + - VirtualAddress: 20
>> + SymbolName: .xdata
>> + Type: IMAGE_REL_AMD64_ADDR32NB
>> + - Name: .debug_line
>> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>> IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
>> + Alignment: 1
>> + SectionData:
>> 57000000040020000000010101FB0E0D00010101010000000100000100736F757263652E630000000000000902000000000000000014050A0A59050C066605034A050006081505010A130500F3050A0A08590503069E0207000101
>> + Relocations:
>> + - VirtualAddress: 45
>> + SymbolName: .text
>> + Type: IMAGE_REL_AMD64_ADDR64
>> + - Name: .llvm_addrsig
>> + Characteristics: [ IMAGE_SCN_LNK_REMOVE ]
>> + Alignment: 1
>> + SectionData: '1718'
>> +symbols:
>> + - Name: .text
>> + Value: 0
>> + SectionNumber: 1
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 87
>> + NumberOfRelocations: 3
>> + NumberOfLinenumbers: 0
>> + CheckSum: 4237828689
>> + Number: 1
>> + - Name: .data
>> + Value: 0
>> + SectionNumber: 2
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 4
>> + NumberOfRelocations: 0
>> + NumberOfLinenumbers: 0
>> + CheckSum: 3099354981
>> + Number: 2
>> + - Name: .bss
>> + Value: 0
>> + SectionNumber: 3
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 0
>> + NumberOfRelocations: 0
>> + NumberOfLinenumbers: 0
>> + CheckSum: 0
>> + Number: 3
>> + - Name: .xdata
>> + Value: 0
>> + SectionNumber: 4
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 20
>> + NumberOfRelocations: 0
>> + NumberOfLinenumbers: 0
>> + CheckSum: 3415491858
>> + Number: 4
>> + - Name: .debug_str
>> + Value: 0
>> + SectionNumber: 5
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 129
>> + NumberOfRelocations: 0
>> + NumberOfLinenumbers: 0
>> + CheckSum: 2876129505
>> + Number: 5
>> + - Name: .debug_abbrev
>> + Value: 0
>> + SectionNumber: 6
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 126
>> + NumberOfRelocations: 0
>> + NumberOfLinenumbers: 0
>> + CheckSum: 2218663305
>> + Number: 6
>> + - Name: .debug_info
>> + Value: 0
>> + SectionNumber: 7
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 157
>> + NumberOfRelocations: 16
>> + NumberOfLinenumbers: 0
>> + CheckSum: 603506744
>> + Number: 7
>> + - Name: .debug_macinfo
>> + Value: 0
>> + SectionNumber: 8
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 1
>> + NumberOfRelocations: 0
>> + NumberOfLinenumbers: 0
>> + CheckSum: 0
>> + Number: 8
>> + - Name: .pdata
>> + Value: 0
>> + SectionNumber: 9
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 24
>> + NumberOfRelocations: 6
>> + NumberOfLinenumbers: 0
>> + CheckSum: 2036901199
>> + Number: 9
>> + - Name: .debug_line
>> + Value: 0
>> + SectionNumber: 10
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 91
>> + NumberOfRelocations: 1
>> + NumberOfLinenumbers: 0
>> + CheckSum: 633454091
>> + Number: 10
>> + - Name: .llvm_addrsig
>> + Value: 0
>> + SectionNumber: 11
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + SectionDefinition:
>> + Length: 2
>> + NumberOfRelocations: 0
>> + NumberOfLinenumbers: 0
>> + CheckSum: 384769216
>> + Number: 11
>> + - Name: '@feat.00'
>> + Value: 0
>> + SectionNumber: -1
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + - Name: f
>> + Value: 0
>> + SectionNumber: 1
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_FUNCTION
>> + StorageClass: IMAGE_SYM_CLASS_EXTERNAL
>> + - Name: x
>> + Value: 0
>> + SectionNumber: 2
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_NULL
>> + StorageClass: IMAGE_SYM_CLASS_STATIC
>> + - Name: __main
>> + Value: 32
>> + SectionNumber: 1
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_FUNCTION
>> + StorageClass: IMAGE_SYM_CLASS_EXTERNAL
>> + - Name: main
>> + Value: 48
>> + SectionNumber: 1
>> + SimpleType: IMAGE_SYM_TYPE_NULL
>> + ComplexType: IMAGE_SYM_DTYPE_FUNCTION
>> + StorageClass: IMAGE_SYM_CLASS_EXTERNAL
>> +...
>>
>> Added: llvm/trunk/test/tools/llvm-objcopy/COFF/basic-copy.test
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/COFF/basic-copy.test?rev=349605&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-objcopy/COFF/basic-copy.test (added)
>> +++ llvm/trunk/test/tools/llvm-objcopy/COFF/basic-copy.test Tue Dec 18
>> 23:24:38 2018
>> @@ -0,0 +1,42 @@
>> +Test plain passthrough copying with llvm-objcopy, by checking that
>> obj2yaml
>> +produces identical output for both input and output object
>> files/executables.
>> +(Intentionally not comparing to the original input yaml, in case there
>> are
>> +superficial differences like line endings.) In order to have a check of
>> the
>> +whole file and not just individual fields with FileCheck, checking with
>> +obj2yaml+cmp instead of llvm-readobj+cmp, as llvm-readobj also prints
>> file
>> +details that can differ between otherwise equal files (such as file
>> offsets).
>> +
>> +Actual copied object files/executables can differ in, among others, the
>> +following aspects:
>> +- The padding of executable sections (lld uses 0xcc, which is int3 on
>> x86)
>> +- The actual layout of the string table (it can be filled linearly,
>> + strings can be dedupliated, the table can be optimized by sharing tails
>> + of longer strings; different parts in llvm do each of these three
>> options)
>> +- The size indication for an empty/missing string table can either be 4
>> + or left out altogether
>> +- Alignment of section data
>> +- Checksums
>> +
>> +RUN: yaml2obj %p/Inputs/i386-obj.yaml > %t.i386.o
>> +RUN: llvm-objcopy %t.i386.o %t.i386-copy.o
>> +RUN: obj2yaml %t.i386.o > %t.i386.o.yaml
>> +RUN: obj2yaml %t.i386-copy.o > %t.i386-copy.o.yaml
>> +RUN: cmp %t.i386.o.yaml %t.i386-copy.o.yaml
>> +
>> +RUN: yaml2obj %p/Inputs/x86_64-obj.yaml > %t.x86_64.o
>> +RUN: llvm-objcopy %t.x86_64.o %t.x86_64-copy.o
>> +RUN: obj2yaml %t.x86_64.o > %t.x86_64.o.yaml
>> +RUN: obj2yaml %t.x86_64-copy.o > %t.x86_64-copy.o.yaml
>> +RUN: cmp %t.x86_64.o.yaml %t.x86_64-copy.o.yaml
>> +
>> +RUN: yaml2obj %p/Inputs/i386-exe.yaml > %t.i386.exe
>> +RUN: llvm-objcopy %t.i386.exe %t.i386-copy.exe
>> +RUN: obj2yaml %t.i386.exe > %t.i386.exe.yaml
>> +RUN: obj2yaml %t.i386-copy.exe > %t.i386-copy.exe.yaml
>> +RUN: cmp %t.i386.exe.yaml %t.i386-copy.exe.yaml
>> +
>> +RUN: yaml2obj %p/Inputs/x86_64-exe.yaml > %t.x86_64.exe
>> +RUN: llvm-objcopy %t.x86_64.exe %t.x86_64-copy.exe
>> +RUN: obj2yaml %t.x86_64.exe > %t.x86_64.exe.yaml
>> +RUN: obj2yaml %t.x86_64-copy.exe > %t.x86_64-copy.exe.yaml
>> +RUN: cmp %t.x86_64.exe.yaml %t.x86_64-copy.exe.yaml
>>
>> Modified: llvm/trunk/tools/llvm-objcopy/CMakeLists.txt
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/CMakeLists.txt?rev=349605&r1=349604&r2=349605&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/tools/llvm-objcopy/CMakeLists.txt (original)
>> +++ llvm/trunk/tools/llvm-objcopy/CMakeLists.txt Tue Dec 18 23:24:38 2018
>> @@ -17,6 +17,9 @@ add_llvm_tool(llvm-objcopy
>> Buffer.cpp
>> CopyConfig.cpp
>> llvm-objcopy.cpp
>> + COFF/COFFObjcopy.cpp
>> + COFF/Reader.cpp
>> + COFF/Writer.cpp
>> ELF/ELFObjcopy.cpp
>> ELF/Object.cpp
>> DEPENDS
>>
>> Added: llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.cpp?rev=349605&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.cpp (added)
>> +++ llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.cpp Tue Dec 18
>> 23:24:38 2018
>> @@ -0,0 +1,40 @@
>> +//===- COFFObjcopy.cpp
>> ----------------------------------------------------===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "COFFObjcopy.h"
>> +#include "Buffer.h"
>> +#include "CopyConfig.h"
>> +#include "Object.h"
>> +#include "Reader.h"
>> +#include "Writer.h"
>> +#include "llvm-objcopy.h"
>> +
>> +#include "llvm/Object/Binary.h"
>> +#include "llvm/Object/COFF.h"
>> +#include <cassert>
>> +
>> +namespace llvm {
>> +namespace objcopy {
>> +namespace coff {
>> +
>> +using namespace object;
>> +using namespace COFF;
>> +
>> +void executeObjcopyOnBinary(const CopyConfig &Config,
>> + object::COFFObjectFile &In, Buffer &Out) {
>> + COFFReader Reader(In);
>> + std::unique_ptr<Object> Obj = Reader.create();
>> + assert(Obj && "Unable to deserialize COFF object");
>> + COFFWriter Writer(*Obj, Out);
>> + Writer.write();
>> +}
>> +
>> +} // end namespace coff
>> +} // end namespace objcopy
>> +} // end namespace llvm
>>
>> Added: llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.h?rev=349605&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.h (added)
>> +++ llvm/trunk/tools/llvm-objcopy/COFF/COFFObjcopy.h Tue Dec 18 23:24:38
>> 2018
>> @@ -0,0 +1,31 @@
>> +//===- COFFObjcopy.h --------------------------------------------*- C++
>> -*-===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_TOOLS_OBJCOPY_COFFOBJCOPY_H
>> +#define LLVM_TOOLS_OBJCOPY_COFFOBJCOPY_H
>> +
>> +namespace llvm {
>> +
>> +namespace object {
>> +class COFFObjectFile;
>> +} // end namespace object
>> +
>> +namespace objcopy {
>> +struct CopyConfig;
>> +class Buffer;
>> +
>> +namespace coff {
>> +void executeObjcopyOnBinary(const CopyConfig &Config,
>> + object::COFFObjectFile &In, Buffer &Out);
>> +
>> +} // end namespace coff
>> +} // end namespace objcopy
>> +} // end namespace llvm
>> +
>> +#endif // LLVM_TOOLS_OBJCOPY_COFFOBJCOPY_H
>>
>> Added: llvm/trunk/tools/llvm-objcopy/COFF/Object.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/COFF/Object.h?rev=349605&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/tools/llvm-objcopy/COFF/Object.h (added)
>> +++ llvm/trunk/tools/llvm-objcopy/COFF/Object.h Tue Dec 18 23:24:38 2018
>> @@ -0,0 +1,110 @@
>> +//===- Object.h -------------------------------------------------*- C++
>> -*-===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_TOOLS_OBJCOPY_COFF_OBJECT_H
>> +#define LLVM_TOOLS_OBJCOPY_COFF_OBJECT_H
>> +
>> +#include "llvm/ADT/ArrayRef.h"
>> +#include "llvm/ADT/StringRef.h"
>> +#include "llvm/BinaryFormat/COFF.h"
>> +#include "llvm/Object/COFF.h"
>> +#include <cstddef>
>> +#include <cstdint>
>> +#include <vector>
>> +
>> +namespace llvm {
>> +namespace objcopy {
>> +namespace coff {
>> +
>> +struct Section {
>> + object::coff_section Header;
>> + ArrayRef<uint8_t> Contents;
>> + std::vector<object::coff_relocation> Relocs;
>> + StringRef Name;
>> +};
>> +
>> +struct Symbol {
>> + object::coff_symbol32 Sym;
>> + StringRef Name;
>> + ArrayRef<uint8_t> AuxData;
>> +};
>> +
>> +struct Object {
>> + bool IsPE = false;
>> +
>> + object::dos_header DosHeader;
>> + ArrayRef<uint8_t> DosStub;
>> +
>> + object::coff_file_header CoffFileHeader;
>> +
>> + bool Is64 = false;
>> + object::pe32plus_header PeHeader;
>> + uint32_t BaseOfData = 0; // pe32plus_header lacks this field.
>> +
>> + std::vector<object::data_directory> DataDirectories;
>> + std::vector<Section> Sections;
>> + std::vector<Symbol> Symbols;
>> +};
>> +
>> +// Copy between coff_symbol16 and coff_symbol32.
>> +// The source and destination files can use either coff_symbol16 or
>> +// coff_symbol32, while we always store them as coff_symbol32 in the
>> +// intermediate data structure.
>> +template <class Symbol1Ty, class Symbol2Ty>
>> +void copySymbol(Symbol1Ty &Dest, const Symbol2Ty &Src) {
>> + static_assert(sizeof(Dest.Name.ShortName) ==
>> sizeof(Src.Name.ShortName),
>> + "Mismatched name sizes");
>> + memcpy(Dest.Name.ShortName, Src.Name.ShortName,
>> sizeof(Dest.Name.ShortName));
>> + Dest.Value = Src.Value;
>> + Dest.SectionNumber = Src.SectionNumber;
>> + Dest.Type = Src.Type;
>> + Dest.StorageClass = Src.StorageClass;
>> + Dest.NumberOfAuxSymbols = Src.NumberOfAuxSymbols;
>> +}
>> +
>> +// Copy between pe32_header and pe32plus_header.
>> +// We store the intermediate state in a pe32plus_header.
>> +template <class PeHeader1Ty, class PeHeader2Ty>
>> +void copyPeHeader(PeHeader1Ty &Dest, const PeHeader2Ty &Src) {
>> + Dest.Magic = Src.Magic;
>> + Dest.MajorLinkerVersion = Src.MajorLinkerVersion;
>> + Dest.MinorLinkerVersion = Src.MinorLinkerVersion;
>> + Dest.SizeOfCode = Src.SizeOfCode;
>> + Dest.SizeOfInitializedData = Src.SizeOfInitializedData;
>> + Dest.SizeOfUninitializedData = Src.SizeOfUninitializedData;
>> + Dest.AddressOfEntryPoint = Src.AddressOfEntryPoint;
>> + Dest.BaseOfCode = Src.BaseOfCode;
>> + Dest.ImageBase = Src.ImageBase;
>> + Dest.SectionAlignment = Src.SectionAlignment;
>> + Dest.FileAlignment = Src.FileAlignment;
>> + Dest.MajorOperatingSystemVersion = Src.MajorOperatingSystemVersion;
>> + Dest.MinorOperatingSystemVersion = Src.MinorOperatingSystemVersion;
>> + Dest.MajorImageVersion = Src.MajorImageVersion;
>> + Dest.MinorImageVersion = Src.MinorImageVersion;
>> + Dest.MajorSubsystemVersion = Src.MajorSubsystemVersion;
>> + Dest.MinorSubsystemVersion = Src.MinorSubsystemVersion;
>> + Dest.Win32VersionValue = Src.Win32VersionValue;
>> + Dest.SizeOfImage = Src.SizeOfImage;
>> + Dest.SizeOfHeaders = Src.SizeOfHeaders;
>> + Dest.CheckSum = Src.CheckSum;
>> + Dest.Subsystem = Src.Subsystem;
>> + Dest.DLLCharacteristics = Src.DLLCharacteristics;
>> + Dest.SizeOfStackReserve = Src.SizeOfStackReserve;
>> + Dest.SizeOfStackCommit = Src.SizeOfStackCommit;
>> + Dest.SizeOfHeapReserve = Src.SizeOfHeapReserve;
>> + Dest.SizeOfHeapCommit = Src.SizeOfHeapCommit;
>> + Dest.LoaderFlags = Src.LoaderFlags;
>> + Dest.NumberOfRvaAndSize = Src.NumberOfRvaAndSize;
>> +}
>> +
>> +} // end namespace coff
>> +} // end namespace objcopy
>> +} // end namespace llvm
>> +
>> +#endif // LLVM_TOOLS_OBJCOPY_COFF_OBJECT_H
>>
>> Added: llvm/trunk/tools/llvm-objcopy/COFF/Reader.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/COFF/Reader.cpp?rev=349605&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/tools/llvm-objcopy/COFF/Reader.cpp (added)
>> +++ llvm/trunk/tools/llvm-objcopy/COFF/Reader.cpp Tue Dec 18 23:24:38 2018
>> @@ -0,0 +1,141 @@
>> +//===- Reader.cpp
>> ---------------------------------------------------------===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "Reader.h"
>> +#include "Object.h"
>> +#include "llvm-objcopy.h"
>> +#include "llvm/ADT/ArrayRef.h"
>> +#include "llvm/ADT/StringRef.h"
>> +#include "llvm/Object/COFF.h"
>> +#include "llvm/Support/ErrorHandling.h"
>> +#include <cstddef>
>> +#include <cstdint>
>> +
>> +namespace llvm {
>> +namespace objcopy {
>> +namespace coff {
>> +
>> +using namespace object;
>> +
>> +Reader::~Reader() {}
>> +
>> +void COFFReader::readExecutableHeaders(Object &Obj) const {
>> + const dos_header *DH = COFFObj.getDOSHeader();
>> + Obj.Is64 = COFFObj.is64();
>> + if (!DH)
>> + return;
>> +
>> + Obj.IsPE = true;
>> + Obj.DosHeader = *DH;
>> + if (DH->AddressOfNewExeHeader > sizeof(*DH))
>> + Obj.DosStub = ArrayRef<uint8_t>(reinterpret_cast<const uint8_t
>> *>(&DH[1]),
>> + DH->AddressOfNewExeHeader -
>> sizeof(*DH));
>> +
>> + if (COFFObj.is64()) {
>> + const pe32plus_header *PE32Plus = nullptr;
>> + if (auto EC = COFFObj.getPE32PlusHeader(PE32Plus))
>> + reportError(COFFObj.getFileName(), std::move(EC));
>> + Obj.PeHeader = *PE32Plus;
>> + } else {
>> + const pe32_header *PE32 = nullptr;
>> + if (auto EC = COFFObj.getPE32Header(PE32))
>> + reportError(COFFObj.getFileName(), std::move(EC));
>> + copyPeHeader(Obj.PeHeader, *PE32);
>> + // The pe32plus_header (stored in Object) lacks the BaseOfData field.
>> + Obj.BaseOfData = PE32->BaseOfData;
>> + }
>> +
>> + for (size_t I = 0; I < Obj.PeHeader.NumberOfRvaAndSize; I++) {
>> + const data_directory *Dir;
>> + if (auto EC = COFFObj.getDataDirectory(I, Dir))
>> + reportError(COFFObj.getFileName(), std::move(EC));
>> + Obj.DataDirectories.emplace_back(*Dir);
>> + }
>> +}
>> +
>> +void COFFReader::readSections(Object &Obj) const {
>> + // Section indexing starts from 1.
>> + for (size_t I = 1, E = COFFObj.getNumberOfSections(); I <= E; I++) {
>> + const coff_section *Sec;
>> + if (auto EC = COFFObj.getSection(I, Sec))
>> + reportError(COFFObj.getFileName(), std::move(EC));
>> + Obj.Sections.push_back(Section());
>> + Section &S = Obj.Sections.back();
>> + S.Header = *Sec;
>> + if (auto EC = COFFObj.getSectionContents(Sec, S.Contents))
>> + reportError(COFFObj.getFileName(), std::move(EC));
>> + ArrayRef<coff_relocation> Relocs = COFFObj.getRelocations(Sec);
>> + S.Relocs.insert(S.Relocs.end(), Relocs.begin(), Relocs.end());
>> + if (auto EC = COFFObj.getSectionName(Sec, S.Name))
>> + reportError(COFFObj.getFileName(), std::move(EC));
>> + if (Sec->hasExtendedRelocations())
>> + reportError(
>> + COFFObj.getFileName(),
>> + make_error<StringError>("Extended relocations not supported
>> yet",
>> + object_error::parse_failed));
>> + }
>> +}
>> +
>> +void COFFReader::readSymbols(Object &Obj, bool IsBigObj) const {
>> + for (uint32_t I = 0, E = COFFObj.getRawNumberOfSymbols(); I < E;) {
>> + Expected<COFFSymbolRef> SymOrErr = COFFObj.getSymbol(I);
>> + if (!SymOrErr)
>> + reportError(COFFObj.getFileName(), SymOrErr.takeError());
>> + COFFSymbolRef SymRef = *SymOrErr;
>> +
>> + Obj.Symbols.push_back(Symbol());
>> + Symbol &Sym = Obj.Symbols.back();
>> + // Copy symbols from the original form into an intermediate
>> coff_symbol32.
>> + if (IsBigObj)
>> + copySymbol(Sym.Sym,
>> + *reinterpret_cast<const coff_symbol32
>> *>(SymRef.getRawPtr()));
>> + else
>> + copySymbol(Sym.Sym,
>> + *reinterpret_cast<const coff_symbol16
>> *>(SymRef.getRawPtr()));
>> + if (auto EC = COFFObj.getSymbolName(SymRef, Sym.Name))
>> + reportError(COFFObj.getFileName(), std::move(EC));
>> + Sym.AuxData = COFFObj.getSymbolAuxData(SymRef);
>> + assert((Sym.AuxData.size() %
>> + (IsBigObj ? sizeof(coff_symbol32) : sizeof(coff_symbol16)))
>> == 0);
>> + I += 1 + SymRef.getNumberOfAuxSymbols();
>> + }
>> +}
>> +
>> +std::unique_ptr<Object> COFFReader::create() const {
>> + auto Obj = llvm::make_unique<Object>();
>> +
>> + const coff_file_header *CFH = nullptr;
>> + const coff_bigobj_file_header *CBFH = nullptr;
>> + COFFObj.getCOFFHeader(CFH);
>> + COFFObj.getCOFFBigObjHeader(CBFH);
>> + bool IsBigObj = false;
>> + if (CFH) {
>> + Obj->CoffFileHeader = *CFH;
>> + } else {
>> + if (!CBFH)
>> + reportError(COFFObj.getFileName(),
>> + make_error<StringError>("No COFF file header returned",
>> + object_error::parse_failed));
>> + // Only copying the few fields from the bigobj header that we need
>> + // and won't recreate in the end.
>> + Obj->CoffFileHeader.Machine = CBFH->Machine;
>> + Obj->CoffFileHeader.TimeDateStamp = CBFH->TimeDateStamp;
>> + IsBigObj = true;
>> + }
>> +
>> + readExecutableHeaders(*Obj);
>> + readSections(*Obj);
>> + readSymbols(*Obj, IsBigObj);
>> +
>> + return Obj;
>> +}
>> +
>> +} // end namespace coff
>> +} // end namespace objcopy
>> +} // end namespace llvm
>>
>> Added: llvm/trunk/tools/llvm-objcopy/COFF/Reader.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/COFF/Reader.h?rev=349605&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/tools/llvm-objcopy/COFF/Reader.h (added)
>> +++ llvm/trunk/tools/llvm-objcopy/COFF/Reader.h Tue Dec 18 23:24:38 2018
>> @@ -0,0 +1,47 @@
>> +//===- Reader.h -------------------------------------------------*- C++
>> -*-===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_TOOLS_OBJCOPY_COFF_READER_H
>> +#define LLVM_TOOLS_OBJCOPY_COFF_READER_H
>> +
>> +#include "Buffer.h"
>> +#include "llvm/BinaryFormat/COFF.h"
>> +#include "llvm/Object/COFF.h"
>> +
>> +namespace llvm {
>> +namespace objcopy {
>> +namespace coff {
>> +
>> +class Object;
>> +
>> +using object::COFFObjectFile;
>> +
>> +class Reader {
>> +public:
>> + virtual ~Reader();
>> + virtual std::unique_ptr<Object> create() const = 0;
>> +};
>> +
>> +class COFFReader : public Reader {
>> + const COFFObjectFile &COFFObj;
>> +
>> + void readExecutableHeaders(Object &Obj) const;
>> + void readSections(Object &Obj) const;
>> + void readSymbols(Object &Obj, bool IsBigObj) const;
>> +
>> +public:
>> + explicit COFFReader(const COFFObjectFile &O) : COFFObj(O) {}
>> + std::unique_ptr<Object> create() const override;
>> +};
>> +
>> +} // end namespace coff
>> +} // end namespace objcopy
>> +} // end namespace llvm
>> +
>> +#endif // LLVM_TOOLS_OBJCOPY_COFF_READER_H
>>
>> Added: llvm/trunk/tools/llvm-objcopy/COFF/Writer.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/COFF/Writer.cpp?rev=349605&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/tools/llvm-objcopy/COFF/Writer.cpp (added)
>> +++ llvm/trunk/tools/llvm-objcopy/COFF/Writer.cpp Tue Dec 18 23:24:38 2018
>> @@ -0,0 +1,318 @@
>> +//===- Writer.cpp
>> ---------------------------------------------------------===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "Writer.h"
>> +#include "Object.h"
>> +#include "llvm-objcopy.h"
>> +#include "llvm/ADT/ArrayRef.h"
>> +#include "llvm/ADT/StringRef.h"
>> +#include "llvm/BinaryFormat/COFF.h"
>> +#include "llvm/Object/COFF.h"
>> +#include "llvm/Support/ErrorHandling.h"
>> +#include <cstddef>
>> +#include <cstdint>
>> +
>> +namespace llvm {
>> +namespace objcopy {
>> +namespace coff {
>> +
>> +using namespace object;
>> +using namespace COFF;
>> +
>> +Writer::~Writer() {}
>> +
>> +void COFFWriter::layoutSections() {
>> + for (auto &S : Obj.Sections) {
>> + if (S.Header.SizeOfRawData > 0)
>> + S.Header.PointerToRawData = FileSize;
>> + FileSize += S.Header.SizeOfRawData; // For executables, this is
>> already
>> + // aligned to FileAlignment.
>> + if (S.Header.NumberOfRelocations > 0)
>> + S.Header.PointerToRelocations = FileSize;
>> + FileSize += S.Relocs.size() * sizeof(coff_relocation);
>> + FileSize = alignTo(FileSize, FileAlignment);
>> +
>> + if (S.Header.Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA)
>> + SizeOfInitializedData += S.Header.SizeOfRawData;
>> + }
>> +}
>> +
>> +size_t COFFWriter::finalizeStringTable() {
>> + for (auto &S : Obj.Sections)
>> + if (S.Name.size() > COFF::NameSize)
>> + StrTabBuilder.add(S.Name);
>> +
>> + for (const auto &S : Obj.Symbols)
>> + if (S.Name.size() > COFF::NameSize)
>> + StrTabBuilder.add(S.Name);
>> +
>> + StrTabBuilder.finalize();
>> +
>> + for (auto &S : Obj.Sections) {
>> + if (S.Name.size() > COFF::NameSize) {
>> + snprintf(S.Header.Name, sizeof(S.Header.Name), "/%d",
>> + (int)StrTabBuilder.getOffset(S.Name));
>> + } else {
>> + strncpy(S.Header.Name, S.Name.data(), COFF::NameSize);
>> + }
>> + }
>> + for (auto &S : Obj.Symbols) {
>> + if (S.Name.size() > COFF::NameSize) {
>> + S.Sym.Name.Offset.Zeroes = 0;
>> + S.Sym.Name.Offset.Offset = StrTabBuilder.getOffset(S.Name);
>> + } else {
>> + strncpy(S.Sym.Name.ShortName, S.Name.data(), COFF::NameSize);
>> + }
>> + }
>> + return StrTabBuilder.getSize();
>> +}
>> +
>> +template <class SymbolTy>
>> +std::pair<size_t, size_t> COFFWriter::finalizeSymbolTable() {
>> + size_t SymTabSize = Obj.Symbols.size() * sizeof(SymbolTy);
>> + for (const auto &S : Obj.Symbols)
>> + SymTabSize += S.AuxData.size();
>> + return std::make_pair(SymTabSize, sizeof(SymbolTy));
>> +}
>> +
>> +void COFFWriter::finalize(bool IsBigObj) {
>> + size_t SizeOfHeaders = 0;
>> + FileAlignment = 1;
>> + size_t PeHeaderSize = 0;
>> + if (Obj.IsPE) {
>> + Obj.DosHeader.AddressOfNewExeHeader =
>> + sizeof(Obj.DosHeader) + Obj.DosStub.size();
>> + SizeOfHeaders += Obj.DosHeader.AddressOfNewExeHeader +
>> sizeof(PEMagic);
>> +
>> + FileAlignment = Obj.PeHeader.FileAlignment;
>> + Obj.PeHeader.NumberOfRvaAndSize = Obj.DataDirectories.size();
>> +
>> + PeHeaderSize = Obj.Is64 ? sizeof(pe32plus_header) :
>> sizeof(pe32_header);
>> + SizeOfHeaders +=
>> + PeHeaderSize + sizeof(data_directory) *
>> Obj.DataDirectories.size();
>> + }
>> + Obj.CoffFileHeader.NumberOfSections = Obj.Sections.size();
>> + SizeOfHeaders +=
>> + IsBigObj ? sizeof(coff_bigobj_file_header) :
>> sizeof(coff_file_header);
>> + SizeOfHeaders += sizeof(coff_section) * Obj.Sections.size();
>> + SizeOfHeaders = alignTo(SizeOfHeaders, FileAlignment);
>> +
>> + Obj.CoffFileHeader.SizeOfOptionalHeader =
>> + PeHeaderSize + sizeof(data_directory) * Obj.DataDirectories.size();
>> +
>> + FileSize = SizeOfHeaders;
>> + SizeOfInitializedData = 0;
>> +
>> + layoutSections();
>> +
>> + if (Obj.IsPE) {
>> + Obj.PeHeader.SizeOfHeaders = SizeOfHeaders;
>> + Obj.PeHeader.SizeOfInitializedData = SizeOfInitializedData;
>> +
>> + if (!Obj.Sections.empty()) {
>> + const Section &S = Obj.Sections.back();
>> + Obj.PeHeader.SizeOfImage =
>> + alignTo(S.Header.VirtualAddress + S.Header.VirtualSize,
>> + Obj.PeHeader.SectionAlignment);
>> + }
>> +
>> + // If the PE header had a checksum, clear it, since it isn't valid
>> + // any longer. (We don't calculate a new one.)
>> + Obj.PeHeader.CheckSum = 0;
>> + }
>> +
>> + size_t StrTabSize = finalizeStringTable();
>> + size_t SymTabSize, SymbolSize;
>> + std::tie(SymTabSize, SymbolSize) = IsBigObj
>> + ?
>> finalizeSymbolTable<coff_symbol32>()
>> + :
>> finalizeSymbolTable<coff_symbol16>();
>> +
>> + size_t PointerToSymbolTable = FileSize;
>> + // StrTabSize <= 4 is the size of an empty string table, only
>> consisting
>> + // of the length field.
>> + if (SymTabSize == 0 && StrTabSize <= 4) {
>> + // Don't point to the symbol table if empty.
>> + PointerToSymbolTable = 0;
>> + // For executables, skip the length field of an empty string table.
>> + if (Obj.IsPE)
>> + StrTabSize = 0;
>> + }
>> +
>> + size_t NumRawSymbols = SymTabSize / SymbolSize;
>> + Obj.CoffFileHeader.PointerToSymbolTable = PointerToSymbolTable;
>> + Obj.CoffFileHeader.NumberOfSymbols = NumRawSymbols;
>> + FileSize += SymTabSize + StrTabSize;
>> + FileSize = alignTo(FileSize, FileAlignment);
>> +}
>> +
>> +void COFFWriter::writeHeaders(bool IsBigObj) {
>> + uint8_t *Ptr = Buf.getBufferStart();
>> + if (Obj.IsPE) {
>> + memcpy(Ptr, &Obj.DosHeader, sizeof(Obj.DosHeader));
>> + Ptr += sizeof(Obj.DosHeader);
>> + memcpy(Ptr, Obj.DosStub.data(), Obj.DosStub.size());
>> + Ptr += Obj.DosStub.size();
>> + memcpy(Ptr, PEMagic, sizeof(PEMagic));
>> + Ptr += sizeof(PEMagic);
>> + }
>> + if (!IsBigObj) {
>> + memcpy(Ptr, &Obj.CoffFileHeader, sizeof(Obj.CoffFileHeader));
>> + Ptr += sizeof(Obj.CoffFileHeader);
>> + } else {
>> + // Generate a coff_bigobj_file_header, filling it in with the values
>> + // from Obj.CoffFileHeader. All extra fields that don't exist in
>> + // coff_file_header can be set to hardcoded values.
>> + coff_bigobj_file_header BigObjHeader;
>> + BigObjHeader.Sig1 = IMAGE_FILE_MACHINE_UNKNOWN;
>> + BigObjHeader.Sig2 = 0xffff;
>> + BigObjHeader.Version = BigObjHeader::MinBigObjectVersion;
>> + BigObjHeader.Machine = Obj.CoffFileHeader.Machine;
>> + BigObjHeader.TimeDateStamp = Obj.CoffFileHeader.TimeDateStamp;
>> + memcpy(BigObjHeader.UUID, BigObjMagic, sizeof(BigObjMagic));
>> + BigObjHeader.unused1 = 0;
>> + BigObjHeader.unused2 = 0;
>> + BigObjHeader.unused3 = 0;
>> + BigObjHeader.unused4 = 0;
>> + // The value in Obj.CoffFileHeader.NumberOfSections is truncated,
>> thus
>> + // get the original one instead.
>> + BigObjHeader.NumberOfSections = Obj.Sections.size();
>> + BigObjHeader.PointerToSymbolTable =
>> Obj.CoffFileHeader.PointerToSymbolTable;
>> + BigObjHeader.NumberOfSymbols = Obj.CoffFileHeader.NumberOfSymbols;
>> +
>> + memcpy(Ptr, &BigObjHeader, sizeof(BigObjHeader));
>> + Ptr += sizeof(BigObjHeader);
>> + }
>> + if (Obj.IsPE) {
>> + if (Obj.Is64) {
>> + memcpy(Ptr, &Obj.PeHeader, sizeof(Obj.PeHeader));
>> + Ptr += sizeof(Obj.PeHeader);
>> + } else {
>> + pe32_header PeHeader;
>> + copyPeHeader(PeHeader, Obj.PeHeader);
>> + // The pe32plus_header (stored in Object) lacks the BaseOfData
>> field.
>> + PeHeader.BaseOfData = Obj.BaseOfData;
>> +
>> + memcpy(Ptr, &PeHeader, sizeof(PeHeader));
>> + Ptr += sizeof(PeHeader);
>> + }
>> + for (const auto &DD : Obj.DataDirectories) {
>> + memcpy(Ptr, &DD, sizeof(DD));
>> + Ptr += sizeof(DD);
>> + }
>> + }
>> + for (const auto &S : Obj.Sections) {
>> + memcpy(Ptr, &S.Header, sizeof(S.Header));
>> + Ptr += sizeof(S.Header);
>> + }
>> +}
>> +
>> +void COFFWriter::writeSections() {
>> + for (const auto &S : Obj.Sections) {
>> + uint8_t *Ptr = Buf.getBufferStart() + S.Header.PointerToRawData;
>> + memcpy(Ptr, S.Contents.data(), S.Contents.size());
>> +
>> + // For executable sections, pad the remainder of the raw data size
>> with
>> + // 0xcc, which is int3 on x86.
>> + if ((S.Header.Characteristics & IMAGE_SCN_CNT_CODE) &&
>> + S.Header.SizeOfRawData > S.Contents.size())
>> + memset(Ptr + S.Contents.size(), 0xcc,
>> + S.Header.SizeOfRawData - S.Contents.size());
>> +
>> + Ptr += S.Header.SizeOfRawData;
>> + memcpy(Ptr, S.Relocs.data(), S.Relocs.size() *
>> sizeof(coff_relocation));
>> + }
>> +}
>> +
>> +template <class SymbolTy> void COFFWriter::writeSymbolStringTables() {
>> + uint8_t *Ptr = Buf.getBufferStart() +
>> Obj.CoffFileHeader.PointerToSymbolTable;
>> + for (const auto &S : Obj.Symbols) {
>> + // Convert symbols back to the right size, from coff_symbol32.
>> + copySymbol<SymbolTy, coff_symbol32>(*reinterpret_cast<SymbolTy
>> *>(Ptr),
>> + S.Sym);
>> + Ptr += sizeof(SymbolTy);
>> + memcpy(Ptr, S.AuxData.data(), S.AuxData.size());
>> + Ptr += S.AuxData.size();
>> + }
>> + if (StrTabBuilder.getSize() > 4 || !Obj.IsPE) {
>> + // Always write a string table in object files, even an empty one.
>> + StrTabBuilder.write(Ptr);
>> + Ptr += StrTabBuilder.getSize();
>> + }
>> +}
>> +
>> +void COFFWriter::write(bool IsBigObj) {
>> + finalize(IsBigObj);
>> +
>> + Buf.allocate(FileSize);
>> +
>> + writeHeaders(IsBigObj);
>> + writeSections();
>> + if (IsBigObj)
>> + writeSymbolStringTables<coff_symbol32>();
>> + else
>> + writeSymbolStringTables<coff_symbol16>();
>> +
>> + if (Obj.IsPE)
>> + patchDebugDirectory();
>> +
>> + if (auto E = Buf.commit())
>> + reportError(Buf.getName(), errorToErrorCode(std::move(E)));
>> +}
>> +
>> +// Locate which sections contain the debug directories, iterate over all
>> +// the debug_directory structs in there, and set the PointerToRawData
>> field
>> +// in all of them, according to their new physical location in the file.
>> +void COFFWriter::patchDebugDirectory() {
>> + if (Obj.DataDirectories.size() < DEBUG_DIRECTORY)
>> + return;
>> + const data_directory *Dir = &Obj.DataDirectories[DEBUG_DIRECTORY];
>> + if (Dir->Size <= 0)
>> + return;
>> + for (const auto &S : Obj.Sections) {
>> + if (Dir->RelativeVirtualAddress >= S.Header.VirtualAddress &&
>> + Dir->RelativeVirtualAddress <
>> + S.Header.VirtualAddress + S.Header.SizeOfRawData) {
>> + if (Dir->RelativeVirtualAddress + Dir->Size >
>> + S.Header.VirtualAddress + S.Header.SizeOfRawData)
>> + reportError(Buf.getName(),
>> + make_error<StringError>(
>> + "Debug directory extends past end of section",
>> + object_error::parse_failed));
>> +
>> + size_t Offset = Dir->RelativeVirtualAddress -
>> S.Header.VirtualAddress;
>> + uint8_t *Ptr = Buf.getBufferStart() + S.Header.PointerToRawData +
>> Offset;
>> + uint8_t *End = Ptr + Dir->Size;
>> + while (Ptr < End) {
>> + debug_directory *Debug = reinterpret_cast<debug_directory
>> *>(Ptr);
>> + Debug->PointerToRawData =
>> + S.Header.PointerToRawData + Offset + sizeof(debug_directory);
>> + Ptr += sizeof(debug_directory) + Debug->SizeOfData;
>> + Offset += sizeof(debug_directory) + Debug->SizeOfData;
>> + }
>> + // Debug directory found and patched, all done.
>> + return;
>> + }
>> + }
>> + reportError(Buf.getName(),
>> + make_error<StringError>("Debug directory not found",
>> + object_error::parse_failed));
>> +}
>> +
>> +void COFFWriter::write() {
>> + bool IsBigObj = Obj.Sections.size() > MaxNumberOfSections16;
>> + if (IsBigObj && Obj.IsPE)
>> + reportError(Buf.getName(),
>> + make_error<StringError>("Too many sections for
>> executable",
>> + object_error::parse_failed));
>> + write(IsBigObj);
>> +}
>> +
>> +} // end namespace coff
>> +} // end namespace objcopy
>> +} // end namespace llvm
>>
>> Added: llvm/trunk/tools/llvm-objcopy/COFF/Writer.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/COFF/Writer.h?rev=349605&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/tools/llvm-objcopy/COFF/Writer.h (added)
>> +++ llvm/trunk/tools/llvm-objcopy/COFF/Writer.h Tue Dec 18 23:24:38 2018
>> @@ -0,0 +1,68 @@
>> +//===- Writer.h -------------------------------------------------*- C++
>> -*-===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLVM_TOOLS_OBJCOPY_COFF_WRITER_H
>> +#define LLVM_TOOLS_OBJCOPY_COFF_WRITER_H
>> +
>> +#include "Buffer.h"
>> +#include "llvm/MC/StringTableBuilder.h"
>> +#include <cstddef>
>> +#include <utility>
>> +
>> +namespace llvm {
>> +namespace objcopy {
>> +namespace coff {
>> +
>> +class Object;
>> +
>> +class Writer {
>> +protected:
>> + Object &Obj;
>> + Buffer &Buf;
>> +
>> +public:
>> + virtual ~Writer();
>> + virtual void write() = 0;
>> +
>> + Writer(Object &O, Buffer &B) : Obj(O), Buf(B) {}
>> +};
>> +
>> +class COFFWriter : public Writer {
>> + size_t FileSize;
>> + size_t FileAlignment;
>> + size_t SizeOfInitializedData;
>> + StringTableBuilder StrTabBuilder;
>> +
>> + void layoutSections();
>> + size_t finalizeStringTable();
>> + template <class SymbolTy> std::pair<size_t, size_t>
>> finalizeSymbolTable();
>> +
>> + void finalize(bool IsBigObj);
>> +
>> + void writeHeaders(bool IsBigObj);
>> + void writeSections();
>> + template <class SymbolTy> void writeSymbolStringTables();
>> +
>> + void write(bool IsBigObj);
>> +
>> + void patchDebugDirectory();
>> +
>> +public:
>> + virtual ~COFFWriter() {}
>> + void write() override;
>> +
>> + COFFWriter(Object &Obj, Buffer &Buf)
>> + : Writer(Obj, Buf), StrTabBuilder(StringTableBuilder::WinCOFF) {}
>> +};
>> +
>> +} // end namespace coff
>> +} // end namespace objcopy
>> +} // end namespace llvm
>> +
>> +#endif // LLVM_TOOLS_OBJCOPY_COFF_WRITER_H
>>
>> Modified: llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp?rev=349605&r1=349604&r2=349605&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp (original)
>> +++ llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp Tue Dec 18 23:24:38
>> 2018
>> @@ -9,6 +9,7 @@
>>
>> #include "llvm-objcopy.h"
>> #include "Buffer.h"
>> +#include "COFF/COFFObjcopy.h"
>> #include "CopyConfig.h"
>> #include "ELF/ELFObjcopy.h"
>>
>> @@ -19,6 +20,7 @@
>> #include "llvm/Object/Archive.h"
>> #include "llvm/Object/ArchiveWriter.h"
>> #include "llvm/Object/Binary.h"
>> +#include "llvm/Object/COFF.h"
>> #include "llvm/Object/ELFObjectFile.h"
>> #include "llvm/Object/ELFTypes.h"
>> #include "llvm/Object/Error.h"
>> @@ -125,6 +127,8 @@ static void executeObjcopyOnBinary(const
>> Buffer &Out) {
>> if (auto *ELFBinary = dyn_cast<object::ELFObjectFileBase>(&In))
>> return elf::executeObjcopyOnBinary(Config, *ELFBinary, Out);
>> + else if (auto *COFFBinary = dyn_cast<object::COFFObjectFile>(&In))
>> + return coff::executeObjcopyOnBinary(Config, *COFFBinary, Out);
>> else
>> error("Unsupported object file format");
>> }
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181220/75aa6d1b/attachment-0001.html>
More information about the llvm-commits
mailing list