Что ж, это было какое-то время, так что прости меня, если я совершенно не прав, но это, по сути, означало бы, что код внутри .so можно перемещать.
.so - это, по сути, DLL, которая может использоваться многими приложениями, но загружается только один раз в память. .O должен быть связан с приложением, чтобы функциональность кода была доступна.
Это называется статическим связыванием (.o) против динамического связывания (.so)
См. IBM Developer Works или Университет Калгари или IECC для получения дополнительной информации
Надеюсь, что это отвечает на ваши вопросы (и я надеюсь, что мои объяснения верны!)