wine_anon_mmap MAP_FIXED patch
weigand at immd1.informatik.uni-erlangen.de
Wed Nov 14 20:03:02 CST 2001
Bang Jun-Young <junyoung at mogua.com> wrote:
> Why this is necessary is because most Win32 binaries expect itself
> to be loaded at fixed address (0x400000). GCC and M$ compilers seem
> to strip relocation info on .exe by default, so we need to ensure
> that on some OS, i.e. NetBSD. Refer to NetBSD/FreeBSD mmap(2) manpage
> on MAP_FIXED flag. On Linux, it shouldn't do any harm.
On Linux and Solaris, MAP_FIXED has a different meaning: it will
*replace* any pre-existing mapping at the given address, typically
causing corruption. I'm not sure what the BSD behaviour is; are
you sure they handle MAP_FIXED differently?
On Linux, this is not a problem because *without* MAP_FIXED, it
will always use the specified address unless there is a conflict
with existing mappings. On Solaris, we've implemented a hack
that emulates the Linux behaviour in this respect (look at the
routine solaris_try_mmap, which is called from wine_anon_mmap).
I guess the proper fix would be to implement a similiar BSD
specific workaround inside wine_anon_mmap. The Solaris version
will probably not work unchanged on BSD, however. If you are
correct in your interpretation of the semantics of MAP_FIXED
on BSD, a workaround could look like this: first, try mapping
with MAP_FIXED; if this fails, repeat without.
Dr. Ulrich Weigand
weigand at informatik.uni-erlangen.de
More information about the wine-devel