On 16 May 2013, at 19:03, Alessandro Pignotti wrote:
On 16 May 2013, at 16:47, Jonas Maebe wrote:
Addendum: he just realised that you may be talking about multiple
base
relocation arrays for a single page (arrays that contain the offsets
of the instructions that need fixing up), which would indeed be
strange. Still, it would be interesting to know which dll it is.
I think it's actually the second case you mentioned. I'm pasting an
excerpt
from 'objdump -x' of the dll. The issue happens with bgm.dll from
the game
"Hotline Miami".
I've found a copy of the dll and gave it to my colleague. His analysis
is that the preferred load address (0x6D740000) does not overlap with
any Windows system dll, and most likely never will because the range
it's in is reserved for very small dll's and they have lots of room
left before they will reach that address. As a result, this dll never
gets relocated under Windows. He constructed a Windows test that
forced it to load the dll at a different address anyway, and then it
also crashes under Windows.
He believes that this was done on purpose to break Wine and other non-
Windows environments. It's an interface to BASS/fmod, and these
libraries supposedly have very strict licensing requirements that
require you to pay per platform you want to support. By constructing
the dll this way it will always (with the caveat mentioned above) run
on Windows, but not under Wine (unless the preferred load address is
available and Wine loads it there, but there are no guarantees for
that; I don't even know whether Wine tries to do this).
As to the best solution: not sure. Current Wine behaviour matches that
of Windows, it's the unavailable preferred load address that triggers
the "problem".
Jonas