[lld] r194754 - Move DOS stub data to PECOFFLinkingContext for /stub option.
Rui Ueyama
ruiu at google.com
Thu Nov 14 21:49:42 PST 2013
Removed the static initializer in r194787.
On Thu, Nov 14, 2013 at 9:23 PM, Rui Ueyama <ruiu at google.com> wrote:
> On Thu, Nov 14, 2013 at 8:54 PM, Sean Silva <silvas at purdue.edu> wrote:
>
>> + // DOS Stub. DOS stub is data located at the beginning of PE/COFF file.
>> + // Windows loader do not really care about DOS stub contents, but it's
>> usually
>> + // a small DOS program that prints out a message "This program requires
>> + // Microsoft Windows." This feature was somewhat useful before Windows
>> 95.
>> + std::vector<uint8_t> _dosStub;
>> + static const std::vector<uint8_t> _defaultDosStub;
>>
>> Why on earth is this using a std::vector? (which adds a static
>> initializer!) Just use ArrayRef or even a const char array.
>>
>
> I realized after writing the previous mail that by "even a const char
> array" you pointed to _defaultDosStub, not to _dosStub. Yeah, that's
> possible and preferable. Thank you for the suggestion.
>
>
>> Also, do we really need to support this feature? Who uses /stub anymore?
>>
>> -- Sean Silva
>>
>>
>> On Thu, Nov 14, 2013 at 6:54 PM, Rui Ueyama <ruiu at google.com> wrote:
>>
>>> Author: ruiu
>>> Date: Thu Nov 14 17:54:24 2013
>>> New Revision: 194754
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=194754&view=rev
>>> Log:
>>> Move DOS stub data to PECOFFLinkingContext for /stub option.
>>>
>>> Modified:
>>> lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h
>>> lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp
>>> lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
>>>
>>> Modified: lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h?rev=194754&r1=194753&r2=194754&view=diff
>>>
>>> ==============================================================================
>>> --- lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h (original)
>>> +++ lld/trunk/include/lld/ReaderWriter/PECOFFLinkingContext.h Thu Nov 14
>>> 17:54:24 2013
>>> @@ -43,7 +43,7 @@ public:
>>> _terminalServerAware(true), _dynamicBaseEnabled(true),
>>> _createManifest(true), _embedManifest(false), _manifestId(1),
>>> _manifestLevel("'asInvoker'"), _manifestUiAccess("'false'"),
>>> - _imageType(ImageType::IMAGE_EXE) {
>>> + _imageType(ImageType::IMAGE_EXE), _dosStub(_defaultDosStub) {
>>> setDeadStripping(true);
>>> }
>>>
>>> @@ -230,6 +230,10 @@ public:
>>> return it == _sectionAttributeMask.end() ? 0 : it->second;
>>> }
>>>
>>> + const std::vector<uint8_t> &getDosStub() const {
>>> + return _dosStub;
>>> + }
>>> +
>>> StringRef allocateString(StringRef ref) const {
>>> char *x = _allocator.Allocate<char>(ref.size() + 1);
>>> memcpy(x, ref.data(), ref.size());
>>> @@ -311,6 +315,13 @@ private:
>>>
>>> // List of files that will be removed on destruction.
>>> std::vector<std::unique_ptr<llvm::FileRemover> > _tempFiles;
>>> +
>>> + // DOS Stub. DOS stub is data located at the beginning of PE/COFF
>>> file.
>>> + // Windows loader do not really care about DOS stub contents, but
>>> it's usually
>>> + // a small DOS program that prints out a message "This program
>>> requires
>>> + // Microsoft Windows." This feature was somewhat useful before
>>> Windows 95.
>>> + std::vector<uint8_t> _dosStub;
>>> + static const std::vector<uint8_t> _defaultDosStub;
>>> };
>>>
>>> } // end namespace lld
>>>
>>> Modified: lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp?rev=194754&r1=194753&r2=194754&view=diff
>>>
>>> ==============================================================================
>>> --- lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp (original)
>>> +++ lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp Thu Nov
>>> 14 17:54:24 2013
>>> @@ -29,6 +29,13 @@
>>>
>>> namespace lld {
>>>
>>> +namespace {
>>> +uint8_t DefaultDosStub[128] = {'M', 'Z'};
>>> +};
>>> +
>>> +const std::vector<uint8_t> PECOFFLinkingContext::_defaultDosStub(
>>> + DefaultDosStub, DefaultDosStub + sizeof(DefaultDosStub));
>>> +
>>> bool PECOFFLinkingContext::validateImpl(raw_ostream &diagnostics) {
>>> if (_stackReserve < _stackCommit) {
>>> diagnostics << "Invalid stack size: reserve size must be equal to
>>> or "
>>>
>>> Modified: lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp?rev=194754&r1=194753&r2=194754&view=diff
>>>
>>> ==============================================================================
>>> --- lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp (original)
>>> +++ lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp Thu Nov 14
>>> 17:54:24 2013
>>> @@ -106,29 +106,19 @@ public:
>>> /// of PE/COFF files.
>>> class DOSStubChunk : public HeaderChunk {
>>> public:
>>> - DOSStubChunk() : HeaderChunk() {
>>> - // Make the DOS stub occupy the first 128 bytes of an exe.
>>> Technically
>>> - // this can be as small as 64 bytes, but GNU binutil's objdump
>>> cannot
>>> - // parse such irregular header.
>>> - _size = 128;
>>> -
>>> - // A DOS stub is usually a small valid DOS program that prints out
>>> a message
>>> - // "This program requires Microsoft Windows" to help user who
>>> accidentally
>>> - // run a Windows executable on DOS. That's not a technical
>>> requirement, so
>>> - // we don't bother to emit such code, at least for now. We simply
>>> fill the
>>> - // DOS stub with null bytes.
>>> - std::memset(&_dosHeader, 0, sizeof(_dosHeader));
>>> -
>>> - _dosHeader.Magic = 'M' | ('Z' << 8);
>>> - _dosHeader.AddressOfNewExeHeader = _size;
>>> + DOSStubChunk(const PECOFFLinkingContext &ctx)
>>> + : HeaderChunk(), _dosStub(ctx.getDosStub()) {
>>> + auto *header = reinterpret_cast<llvm::object::dos_header
>>> *>(&_dosStub[0]);
>>> + header->AddressOfNewExeHeader = _dosStub.size();
>>> + _size = _dosStub.size();
>>> }
>>>
>>> virtual void write(uint8_t *fileBuffer) {
>>> - std::memcpy(fileBuffer, &_dosHeader, sizeof(_dosHeader));
>>> + std::memcpy(fileBuffer, &_dosStub[0], _dosStub.size());
>>> }
>>>
>>> private:
>>> - llvm::object::dos_header _dosHeader;
>>> + std::vector<uint8_t> _dosStub;
>>> };
>>>
>>> /// A PEHeaderChunk represents PE header including COFF header.
>>> @@ -810,7 +800,7 @@ public:
>>> // Create all chunks that consist of the output file.
>>> void build(const File &linkedFile) {
>>> // Create file chunks and add them to the list.
>>> - auto *dosStub = new DOSStubChunk();
>>> + auto *dosStub = new DOSStubChunk(_PECOFFLinkingContext);
>>> auto *peHeader = new PEHeaderChunk(_PECOFFLinkingContext);
>>> auto *dataDirectory = new DataDirectoryChunk(linkedFile);
>>> auto *sectionTable = new SectionHeaderTableChunk();
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131114/e3fbe6a7/attachment.html>
More information about the llvm-commits
mailing list