[lld] r194754 - Move DOS stub data to PECOFFLinkingContext for /stub option.

Rui Ueyama ruiu at google.com
Thu Nov 14 21:23:37 PST 2013


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/6fa809ad/attachment.html>


More information about the llvm-commits mailing list