D228 - The eboot does not link the census, and the census says so
The change D227 argued for, made. An eboot compiles with
OBS_CENSUS_LINKED=0 and links
symbols-no-census.txt:
before vendor segment 3,587,232 bytes, 1427 tags, 35,518 symbols from 352 libraries
after vendor segment 104,208 bytes, 75 tags, 204 symbols from 14 libraries
The eboot went from 10.5 MB to 619 KB, and DT_NEEDED
from 352 to 14 - every one of them a library some check calls by
name.
Only the eboot
module and payload still link all 352, and
that is not an oversight. They run under a homebrew loader that loads
what it is told and under emulators that stub everything, where taking
35,518 addresses is a free and faithful measurement. The census is not
wrong; it is wrong for a shape that goes through a system
loader, and that shape is one of four.
What the census reports instead
Not a sheet of absences. With nothing imported every name would test
absent, and a report that parses, counts, and is wrong throughout is
worse than no measurement - so census() returns a skip
naming the reason. That is the same distinction the section's own
control check exists to protect: an absence has to mean one thing before
a count of absences means anything.
What it found on the way
mkmodule refused the first census-free build by
name:
error: 4 imported symbol(s) have no library ...
sceAgcAcbAcquireMem sceGnmDrawIndex sceGnmSubmitCommandBuffers sceGnmSubmitDone
Four symbols that checks call were declared only by
the census. It worked because the census imports every name it lists, so
the association existed - in the wrong file, and only by accident of a
section that exists to not call anything. They are in
src/imports.c now, under the libraries the census itself
names.
That is the gate doing what a gate is for: a latent inconsistency that no loader would have reported, surfaced by removing the thing that was hiding it.
Still to do
This stops the crash; it does not restore the measurement. A census
that loads each library at run time and resolves through it -
sceKernelLoadStartModule, then sceKernelDlsym
- reports a library a title cannot load as a finding,
which is more than linking ever told us and is the thing this program
exists to produce. Both functions are already declared and in the
manifest.