
R=nodir BUG=524256 Review URL: https://codereview.chromium.org/1318503005 Cr-Commit-Position: refs/heads/master@{#345353}
59 lines
2.8 KiB
Markdown
59 lines
2.8 KiB
Markdown
# Handling repeated failures of rebaseall to allow cygwin remaps
|
|
|
|
Sometimes DLLs over which cygwin has no control get mapped into cygwin
|
|
processes at locations that cygwin has chosen for its libraries.
|
|
This has been seen primarily with anti-virus DLLs. When this occurs,
|
|
cygwin must be instructed during the rebase to avoid the area of
|
|
memory where that DLL is mapped.
|
|
|
|
## Background
|
|
|
|
Some background for this is available on
|
|
http://www.dont-panic.cc/capi/2007/10/29/git-svn-fails-with-fatal-error-unable-to-remap/
|
|
|
|
Because of unix fork semantics (presumably), cygwin libraries must be
|
|
mapped in the same location in both parent and child of a fork. All
|
|
cygwin libraries have hints in them as to where they should be mapped
|
|
in a processes address space; if those hints are followed, each
|
|
library will be mapped in the same location in both address spaces.
|
|
However, Windows is perfectly happy mapping a DLL anywhere in the
|
|
address space; the hint is not considered controlling. The remapping
|
|
error occurs when a cygwin process starts and one of its libraries
|
|
cannot be mapped to the location specified by its hint.
|
|
|
|
/usr/bin/rebaseall changes the DLL hints for all of the cygwin
|
|
libraries so that there are no inter-library conflicts; it does this
|
|
by choosing a contiguous but not overlapping library layout starting
|
|
at a base address and working down. This process makes sure there are
|
|
no intra-cygwin conflicts, but cannot deal with conflicts with
|
|
external DLLs that are in cygwin process address spaces
|
|
(e.g. anti-virus DLLs).
|
|
|
|
To handle this case, you need to figure out what the problematic
|
|
non-cygwin library is, where it is in the address space, and do the
|
|
rebase all so that no cygwin hints map libraries to that location.
|
|
|
|
## Details
|
|
|
|
* Download the ListDLLs executable from
|
|
[sysinternals](http://technet.microsoft.com/en-us/sysinternals/bb896656.aspx)
|
|
* Run it as administrator while some cygwin commands are running.
|
|
* Scan the output for the cygwin process (identifiable by the command) and for
|
|
DLLs in that process that do not look like cygwin DLLs (like an AV). Note
|
|
the location of those libraries (there will usually only be the one).
|
|
* Pick an address space location lower than its starting address.
|
|
* Quit all cygwin processes.
|
|
* Run a windows command shell as administrator
|
|
* cd in \cygwin\bin
|
|
* Run `ash /usr/bin/rebaseall -b <base address>` (This command can also take a
|
|
`-v` flag if you want to see the DLL layout.)
|
|
|
|
That should fix the problem.
|
|
|
|
## Failed rebaseall
|
|
|
|
If you pick a base address that is too low, you may end up with a broken cygwin
|
|
install. You can reinstall it by running cygwin's setup.exe again, and on the
|
|
package selection page, clicking the "All" entry to Reinstall. You may have to
|
|
do this twice, as you may get errors on the first reinstall pass.
|