Bang Jun-Young junyoung@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.
Bye, Ulrich