* Ensure we don't reallocate during 2GB address space block
* Use std::string_view and std::from_chars to avoid allocations
* Use MAP_FIXED instead of MAP_FIXED_NOREPLACE
* Use raw syscalls and stack buffer
* Use exit(1)
`TlsGetValue` disambiguates 0 and an error by relying on `GetLastError`. Depending on the program state, `GetLastError` could be non-0, even though `TlsGetValue` succeeded. Resolve this by always setting `wibo::lastError`. This matches the behavior described by the documentation.
Additionally, when reading resources, later versions of mwcc and mwld call `GetModuleHandleA` with the program path, and then call `LoadStringA` on that handle. Support this behavior by _actually_ loading the PE at the path passed in to `GetModuleHandleA`, instead of assuming it's the current program.
(This is especially useful because sjiswrap relies on overriding `GetModuleFileNameA`, so the wrapped program reads its own resources, rather than sjiswrap's.)
Other small changes:
- Add ms-win-crt `exit` & run atexit funcs
- Implements vcruntime `memmove`
- Implements kernel32 `GetModuleFileNameA`
* GetLocaleInfoW for ee-as.exe 991111b
* Try to do it the right way
* 3rd time's the charm?
* round 4
* it doesn't matter now what happens i will never give up the fight
* comments
* fin
* 3 funcs needed for some mwcc compilers
* some PR feedback
* lots more via pair programming with Simon
* cleanup, add test dir as an include dir for tests
* bugfix
* Fix cmake install command
PROGRAMS specifies executable files, while TARGETS specifies cmake
targets. This install command happened to work when doing an in-tree
build (build dir == source dir) but will otherwise fail.
* Explicitly link std::filesystem as needed
On some older compilers, std::filesystem is provided as a separate
library from the C++ standard library. For example, on GCC 8, one must
explicitly link with -lstdc++fs.
We can use a drop-in https://github.com/vector-of-bool/CMakeCM module to
automate detection of and linking against this auxiliary library when needed.
* Add missing include
std::min is in <algorithm> header
This is transitively included in libstdc++ (GCC)
but not in libc++ (Clang)
(Encountered when testing -lc++fs auxiliary library linking in Clang 7)
Improves mwldeppc performance significantly.
Before:
real 0m30.322s
user 0m7.800s
sys 0m22.495s
After:
real 0m16.679s
user 0m4.693s
sys 0m11.965s
Wine (for comparison):
real 0m24.625s
user 0m0.048s
sys 0m0.034s