When a program causes a .so file to be loaded into memory, does is get loaded as a whole, or or does it only load the necessary "chunks"?
No. First the .so file is opened, then
mmap() creates the virtual address space necessary to hold the whole file contents. However, only when something tries to access a particular address in the space will the access cause a page fault, and the kernel will read a (4k) block from the file corresponding to the page's offset into real memory. When it is in actual memory, the access will be restarted. This is demand paging.