[llvm-dev] LLD COFF not closing mmaps to input files?

Andrew Kelley via llvm-dev llvm-dev at lists.llvm.org
Sun Oct 15 19:07:35 PDT 2017


Thanks Rui, your suggestion solved the problem perfectly.

diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index 8bab1c11..0dabca6e 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -61,6 +61,7 @@ bool link(ArrayRef<const char *> Args, raw_ostream &Diag)
{
       (ErrorOS == &llvm::errs() && Process::StandardErrHasColors());
   Driver = make<LinkerDriver>();
   Driver->link(Args);
+  freeArena();
   return !ErrorCount;
 }

Could we get this patch upstream?

On Sun, Oct 15, 2017 at 9:59 PM, Rui Ueyama <ruiu at google.com> wrote:

> I think you want to call freeArena() before returning from lld::coff::link.
>
> On Sun, Oct 15, 2017 at 6:57 PM, Andrew Kelley via llvm-dev <
> llvm-dev at lists.llvm.org> wrote:
>
>> I believe this line is the culprit:
>>
>> COFF/Driver.cpp:102:
>>   make<std::unique_ptr<MemoryBuffer>>(std::move(MB)); // take ownership
>>
>> Patch forthcoming.
>>
>>
>> On Sun, Oct 15, 2017 at 9:45 PM, Andrew Kelley <superjoe30 at gmail.com>
>> wrote:
>>
>>> I've got a patched LLD 5.0.0 like this:
>>>
>>> diff --git a/deps/lld/COFF/Driver.cpp b/deps/lld/COFF/Driver.cpp
>>> index 854c3e69..8bab1c11 100644
>>> --- a/deps/lld/COFF/Driver.cpp
>>> +++ b/deps/lld/COFF/Driver.cpp
>>> @@ -1030,7 +1030,7 @@ void LinkerDriver::link(ArrayRef<const char *>
>>> ArgsArr) {
>>>    if (!Args.hasArgNoClaim(OPT_INPUT)) {
>>>      fixupExports();
>>>      createImportLibrary(/*AsLib=*/true);
>>> -    exit(0);
>>> +    return;
>>>    }
>>>
>>>    // Handle /delayload
>>> @@ -1172,9 +1172,6 @@ void LinkerDriver::link(ArrayRef<const char *>
>>> ArgsArr) {
>>>
>>>    // Write the result.
>>>    writeResult(&Symtab);
>>> -
>>> -  // Call exit to avoid calling destructors.
>>> -  exit(0);
>>>  }
>>>
>>>  } // namespace coff
>>>
>>>
>>> I'm getting this error from LLVM:
>>> unable to write object file c:\msys64\home\andy\zig\zig-cache\compiler_rt.obj:
>>> The requested operation cannot be performed on a file with a user-mapped
>>> section open.
>>>
>>> The same process calls LLD with this .obj as  a linker input file, then
>>> tries to write to the same .obj file later.
>>>
>>> I believe LLD is mmapping the .obj file and then not cleaning it up.
>>>
>>> Can I have some guidance as to where in the code I could discover this
>>> and clean it up?
>>>
>>> Regards,
>>> Andrew
>>> http://ziglang.org/
>>>
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171015/00369815/attachment.html>


More information about the llvm-dev mailing list