Random discovery of the day is that GNU’s linker has different rules to those of MSVC or LLVM - the latter two are happy to resolve linkages at the final executable or library, while ld seems to require that every intermediate object binary be linked up?