-
Notifications
You must be signed in to change notification settings - Fork 559
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
cygwin DLL address conflict with version 5.41.6 #22695
Labels
Comments
tonycoz
added a commit
to tonycoz/perl5
that referenced
this issue
Oct 23, 2024
The DLL load addresses are generated by the linker based on the DLL names, and 5.39.10 we're getting a conflict between cygperl5_41_6.dll and Langinfo.dll. As a workaround, statically link Langinfo into cygperl for CI and mention the problem in perldelta for anyone else who might build perl on cygwin Fixes but should not close Perl#22695
tonycoz
added a commit
to tonycoz/perl5
that referenced
this issue
Oct 23, 2024
The DLL load addresses are generated by the linker based on the DLL names, and 5.39.10 we're getting a conflict between cygperl5_41_6.dll and Langinfo.dll. As a workaround, statically link Langinfo into cygperl for CI and mention the problem in perldelta for anyone else who might build perl on cygwin Fixes but should not close Perl#22695
tonycoz
added a commit
that referenced
this issue
Oct 29, 2024
The DLL load addresses are generated by the linker based on the DLL names, and 5.39.10 we're getting a conflict between cygperl5_41_6.dll and Langinfo.dll. As a workaround, statically link Langinfo into cygperl for CI and mention the problem in perldelta for anyone else who might build perl on cygwin Fixes but should not close #22695
tonycoz
added a commit
to tonycoz/perl5
that referenced
this issue
Dec 9, 2024
Cygwin's fork emulation doesn't handle overlapping addresses between different DLLs, since it tries to lay out the address space of the child process to match the parent process, but if there's an address conflict between DLLs, Windows may load those DLLs at different addresses. To avoid having to manually assign addresses to each DLL, since around 5.10 we've used --enable-auto-image-base to assign load addresses for cygperl*.dll and dynamic extension DLLs and this has mostly worked well, but as perl has gotten larger and cygperl*.dll has grown, we've had two cases where there's overlap between the address space for cygperl*.dll and some extension DLL, see Perl#22695 and Perl#22104. This problem occurs because: - cygperl*.dll is large, and with -DDEBUGGING or some other option that increases binary size, even large, occupying more than one of the "slots" that the automatic image base code in ld can assign the DLL to. - unlike the extension DLLs, the name of cygperl*.dll changes with every release, so we roll the dice each release on whether there will be a conflict between cygperl*.dll and some other DLL. Previously I've added an entry to perldelta and updated the CI workflow to workaround the conflict, this change should prevent that particular conflict. The addresses I've chosen here are "just" (for large values of "just") below the base address range used by automatic address space selection. For 64-bit this was done by inspection, examing the output of "rebase -i" on the extension DLLs and looking at the source of ld, in particular: https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=ld/emultempl/pep.em;h=00c4ea9e15a765c29b15b621f53d6bfcb499e5ed;hb=HEAD#l144 Note cygwin builds set move_default_addr_high=1 if you read that code. For 32-bit I just looked at the source: https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=ld/emultempl/pe.em;h=52f59b8b#l173 since I don't have a 32-bit cygwin install any more, since cygwin no longer ship it and it commonly had the fork address conflicts discussed above. I would have liked to make the load address configurable via -Dcygperl_base or similar, but I didn't see a way to get the base address to pass from Configure through to Makefile.SH. Fixes Perl#22695
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Module:
Description
Similar to #22104 we're seeing address conflicts loading LangInfo.dll in CI:
And rebase shows the conflict:
And can be similarly reproduced:
I plan to prepare a fix and perldelta note PR.
Steps to Reproduce
-DDEBUGGING
, there may or may not be a conflict without it./perl -Ilib -MI18N::LangInfo -efork
Expected behavior
No error on fork.
Perl configuration
The text was updated successfully, but these errors were encountered: