D157 - The runtime census exists, and its first run settled what the address census could not
D149 argued that "present" meaning a symbol address resolved
is close to worthless on a loader that stub-resolves whatever it cannot
find, and that sceKernelLoadStartModule asks a question
with a real answer instead. Both calls were already declared and neither
had ever been used. 110-modules/load and
110-modules/symbol now use them.
One run of shadPS4 makes the case better than the argument did. Same loader, same run:
| instrument | what it reported |
|---|---|
| address census | 373 of 373 symbols present |
| module load | 0x80020002 for all five paths |
0x8002_0002 is the vendor scheme established this
morning - 0x8002_0000 | errno - so that is ENOENT:
no such module, five times, specifically. The loader says it
has no modules at all while the census on the same run says it has
everything.
Only one of those is a measurement. A resolved address is the loader's opinion and there is no way for the guest to tell a stub from an implementation by looking at one; an error code came from the platform being asked a question it had to answer.
What is recorded, and what is not
Nothing states an expectation. This program does not know which
modules a given firmware ships, and a list of "should be present" would
be a guess where the report should carry a fact - the same reasoning
130-layout and 140-oracle rest on. Each
attempt emits a measure record with the code, and the
verdict is only about whether the mechanism answered at all.
Zero modules loaded is a real answer, not a failure: a
firmwareless loader has none to give and said so five times.
110-modules/symbol skips when nothing loaded, because
asking a handle nobody obtained is not a question. On a console it
becomes the other half - a handle says a module exists, and resolving a
name through it says the module carries that symbol, which is precisely
what the address census claims and cannot substantiate.
Five paths, not five hundred
Every one is a name this project has already seen in a loader
diagnostic from its own runs - libc.prx and
libSceFios2.prx are the two shadPS4 names when it refuses
the corpus build (D149). Naming a module is free; the cost is that a
call which starts a module runs its initialiser. Five known
names establishes whether the instrument answers, and widening it is a
decision to make once it has - which it now has.