Release builds fold a declared function's address compared with nullptr
to false, so the tables' loops compiled away together with the tables'
references to the exports, and the checks passed without the library
exporting anything. Each test now gets its library's built file from its
add_test line, opens it, looks up every name in its table, and requires
one name the library doesn't export not to resolve. The table entries
are read through a volatile copy, so the test binaries keep importing
them.
A check that a placeholder throws "not implemented" fails as soon as the
export is implemented. The export tables now only require each entry's
address, so they still fail to build when an export goes missing, and an
implementation doesn't break them. The libSceNgs2 calls with real
signatures go into the same kind of table.
Asked for in oneandonlydean's review.
The build fix checks one export per library. Call the rest through
their headers and require std::runtime_error with "<name> not
implemented": 34 more in libSceAgcDriver, 14 more in libSceNgs2.native
plus libSceNgs2's six PendingExports.cpp stubs, 22 more in
libSceNpTrophy2 and 10 more in libSceNpUniversalDataSystem. The 14
libSceAudiodec.native and 2 libSceAvPlayer.native exports had no test,
so each gets a guest executable of its own.