[mono] Use unsigned char when computing UTF8 string hashes (#83273)
* [mono] Use `unsigned char` when computing UTF8 string hashes
The C standard does not specify whether `char` is signed or unsigned, it is implementation defined.
Apparently Android aarch64 makes a different choice than other platforms (at least macOS arm64 and Windows x64 give different results).
Mono uses `mono_metadata_str_hash` in the AOT compiler and AOT runtime to optimize class name lookup. As a result, classes whose names include UTF-8 continuation bytes (with the high bit = 1) will hash differently in the AOT compiler and on the device.
Fixes https://github.com/dotnet/runtime/issues/82187
Fixes https://github.com/dotnet/runtime/issues/78638
* [aot] add DEBUG_AOT_NAME_TABLE code for debugging the class names
AOT compiler: Emits a second "class_name_table_debug" symbol that has all the class names and hashes as strings.
AOT runtime: warns if a class is not found in the name cache
* Add regression test