Is there any working example of how the pair of .ppu + .o file works in Lazarus.
Sure. Lazarus packages are the best example.
Do the following.
1. Start a new Lazarus Application project. You can open up the Project Inspector and see that the project requires LCL only.
2. Drop SynEdit control on the form. You can bring up the Project Inspect and see that now project requires SynEdit package as well.
3. Lazarus precompiles package (in order to be used by IDE as well as project compilation time boosts). Thus each package is used as a collection of .ppu and .o files
4. Look at compiler options (look at "Show Options" button) to see that a search path for SynEdit component units has been added.
This is done in order for compiler to find SynEdit .ppu and .o files (without using SynEdit .pas files).
Note, that FPC itself has no idea about Lazarus packages, that's why Lazarus adds the search path implicitly.
5. If you look at the folder that has been added to the units search path, you'll find .ppu and .o files there.
So at the point, Lazarus doesn't need to have access to SynEdit sources, just compile units to have the project compiled.
Similar to Delphi needs access to .dcu files only.
Lazarus however will ask for sources in order CodeTools to work, but it's only user experience and has nothing to do with compilation.