Rui Ueyama via llvm-dev
2017-Oct-16 01:59 UTC
[llvm-dev] LLD COFF not closing mmaps to input files?
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/a3995687/attachment.html>
Andrew Kelley via llvm-dev
2017-Oct-16 02:07 UTC
[llvm-dev] LLD COFF not closing mmaps to input files?
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>
Rui Ueyama via llvm-dev
2017-Oct-16 02:22 UTC
[llvm-dev] LLD COFF not closing mmaps to input files?
lld::coff::LinkerDriver::link is not expected to return, so the patch doesn't make sense unless you have a local patch to make it return, but I'm fine with that change because it is harmless. Please go ahead. On Sun, Oct 15, 2017 at 7:07 PM, Andrew Kelley <superjoe30 at gmail.com> wrote:> 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/d991bc2c/attachment-0001.html>