Here's another thought:
I examined the address layout of the perl process again, and it struck
me as weird that the base addresses of all the DLLs which get dynamically
loaded by perl are so near together. It looks like the problem is
actually tightened by the order in which the DLLs are rebased by rebaseall,
and the order in which the DLLs are loaded into the running process.
Some perl DLL (Dumper.dll?) allocates additional memory and that's right
after it's own image. That's where Cwd.dll is based to. Cwd.dll gets
rebased and ... poof.
What I did then was to change the offset to rebaseall:
ash$ rebaseall -o 0x20000 (default is 0x10000)
Then I reinstalled /bin/cyggmp-3.dll and reran cygport. This time
it ran fine. This is still w/o ASLR flags.
In this configuration, I can reproduce running cygport successfully
every time.