[llvm-dev] [lldb-dev] Trying out lld to link windows binaries (using msvc as a compiler)

Zachary Turner via llvm-dev llvm-dev at lists.llvm.org
Fri Jan 26 09:52:42 PST 2018


Hmm, ok.  In that case let me try again without my local changes.  Maybe
they are getting in the way :-/

On Fri, Jan 26, 2018 at 9:51 AM Leonardo Santagada <santagada at gmail.com>
wrote:

> it is identical to me... wierd.
>
> On Fri, Jan 26, 2018 at 6:49 PM, Zachary Turner <zturner at google.com>
> wrote:
>
>> (Ignore the fact that my hashes are 8 byte in the "good" file, this is
>> due to some local changes I've been experimenting with)
>>
>> On Fri, Jan 26, 2018 at 9:48 AM Zachary Turner <zturner at google.com>
>> wrote:
>>
>>> I did this:
>>>
>>> // a.cpp
>>> static int x = 0;
>>> void b(int);
>>> void a(int) {
>>>   if (x)
>>>     b(x);
>>> }
>>> int main(int argc, char **argv) {
>>>   a(argc);
>>>   return x;
>>> }
>>>
>>>
>>> clang-cl /Z7 /c a.cpp /Foa.noghash.obj
>>> clang-cl /Z7 /c a.cpp -mllvm -emit-codeview-ghash-section
>>> /Foa.ghash.good.obj
>>> llvm-objcopy a.noghash.obj a.ghash.bad.obj
>>> obj2yaml a.ghash.good.obj > a.ghash.good.yaml
>>> obj2yaml a.ghash.bad.obj > a.ghash.bad.yaml
>>>
>>> Then open these 2 yaml files up in a diff viewer.  It looks like the
>>> hashes aren't getting emitted at all.  For example, in the good yaml file I
>>> see this:
>>>
>>>   - Name:            '.debug$H'
>>>     Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>>> IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
>>>     Alignment:       4
>>>     SectionData:
>>>  C5C93301000001005549419E78044E3896D45CD7009428758BE4A1E2B3E022BA267DEE221F5C42B17BCA182AF84584814A8B5E7E3FB17B397A9E3DEA75CD5627
>>>     GlobalHashes:
>>>       Version:         0
>>>       HashAlgorithm:   1
>>>       HashValues:
>>>         - 5549419E78044E38
>>>         - 96D45CD700942875
>>>         - 8BE4A1E2B3E022BA
>>>         - 267DEE221F5C42B1
>>>         - 7BCA182AF8458481
>>>         - 4A8B5E7E3FB17B39
>>>         - 7A9E3DEA75CD5627
>>>   - Name:            .pdata
>>>
>>> And in the bad yaml file I see this:
>>>   - Name:            '.debug$H'
>>>     Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
>>> IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
>>>     Alignment:       4
>>>     SectionData:     C5C9330100000000
>>>     GlobalHashes:
>>>       Version:         0
>>>       HashAlgorithm:   0
>>>   - Name:            .pdata
>>>
>>> Don't focus too much on trying to figure out weird linker errors.  Just
>>> get the output of obj2yaml to be identical when run under a diff utility,
>>> then everything should work fine.
>>>
>>> On Fri, Jan 26, 2018 at 7:27 AM Leonardo Santagada <santagada at gmail.com>
>>> wrote:
>>>
>>>> I'm so close I can almost smell it :)
>>>>
>>>> I know how bad the code looks, I don't intend to submit this, but if
>>>> you want to try it out its at:
>>>> https://gist.github.com/santagada/544136b1ee143bf31653b1158ac6829e
>>>>
>>>> I'm seeing: lld-link.exe: error: duplicate symbol:
>>>> "<redacted_unmangled>" (<redacted>) in <internal> and in
>>>> <redacted_filename>.obj, looking at the .yaml dump the symbols are all
>>>> similar to this:
>>>>
>>>> - Name: <redacted>
>>>> Value: 0
>>>> SectionNumber: 0
>>>> SimpleType: IMAGE_SYM_TYPE_NULL
>>>> ComplexType: IMAGE_SYM_DTYPE_FUNCTION
>>>> StorageClass: IMAGE_SYM_CLASS_WEAK_EXTERNAL
>>>> WeakExternal:
>>>> TagIndex: 134
>>>> Characteristics: IMAGE_WEAK_EXTERN_SEARCH_LIBRARY
>>>>
>>>> On Thu, Jan 25, 2018 at 8:01 PM, Zachary Turner <zturner at google.com>
>>>> wrote:
>>>>
>>>>> I haven't really dabbled in this part of the COFF format personally,
>>>>> so hopefully I'm not leading you astray :)
>>>>>
>>>>> But I checked the code for coff2yaml, and I see this:
>>>>>
>>>>>       } else if (Symbol.isSectionDefinition()) {
>>>>>         // This symbol represents a section definition.
>>>>>         assert(Symbol.getNumberOfAuxSymbols() == 1 &&
>>>>>                "Expected a single aux symbol to describe this
>>>>> section!");
>>>>>         const object::coff_aux_section_definition *ObjSD =
>>>>>             reinterpret_cast<const object::coff_aux_section_definition
>>>>> *>(
>>>>>                 AuxData.data());
>>>>>
>>>>> So it looks like you need exactly 1 aux symbol for each section symbol.
>>>>>
>>>>> I then scrolled up in this function to figure out where AuxData comes
>>>>> from, and it comes from COFFObjectFile::getSymbolAuxData.  I think that
>>>>> function holds the clue to what you need to do.  It looks like you need to
>>>>> set coff::symbol::NumberOfAuxSymbols to 1, and then there is a comment in
>>>>> getSymbolAuxData which says:
>>>>>
>>>>>     // AUX data comes immediately after the symbol in COFF
>>>>>     Aux = reinterpret_cast<const uint8_t *>(Symbol.getRawPtr()) +
>>>>> SymbolSize;
>>>>>
>>>>> So I think you just need to write the bytes immediately after the
>>>>> coff::symbol.  The thing you need to write looks like a
>>>>> coff::coff_aux_section_definition structure.
>>>>>
>>>>> For the CheckSum, look at WinCOFFObjectWriter::writeSection.  It looks
>>>>> like its a CRC32 of the actual section contents, which you can generate
>>>>> with a couple of lines of code:
>>>>>
>>>>>   JamCRC JC(/*Init=*/0);
>>>>>   JC.update(DebugHContents);
>>>>>   AuxSymbol.CheckSum = JC.getCRC();
>>>>>
>>>>> Hope this helps
>>>>>
>>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180126/76f12887/attachment-0001.html>


More information about the llvm-dev mailing list