While working on changing how the loader opens and reads plugin files on the DS this weekend, I noticed that the “.plg” files produced in my builds were significantly smaller than expected (as in under a hundred kilobytes).
So I looked through verbose build output to investigate what the problem could be. The plugin linking output included all the necessary object files, so I knew the problem wasn’t there and decided to look closer at the plugin flags.
Last week when I added the PLUGIN_LDFLAGS into the ds/arm9/makefile, I copied over the regular LD_FLAGS to make sure all the special DS optimizations that occur when linking the main executable would be used for the plugin files as well (stuff like “-mthumb-interwork”). One of these flags was “–gc-sections” which I believe is meant to garbage collect sections full of unused functions and/or data. Since both the main executable and the plugin files were using this flag (but plugins aren’t truly linked in to the main executable until run-time), functions and data in the main executable and the plugins that point to each other and nowhere else were mistakenly garbage-collected. After removing the “–gc-sections” flag from LDFLAGS and PLUGIN_LDFLAGS, plugins are a much more reasonable size. Unfortunately, this means the main executable is a bit more bloated than before, which runs counter to the goal of using as little memory as possible on the RAM-starved DS…
But for now, I’ll be moving on to reworking the loader to use “Common::SeekableReadStream” to read plugin files.
~Tony