[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