C语言动态库互相依赖链接顺序问题

GCC编译时,若A.o 依赖 liba.so, liba.so依赖libb.so

则应该先链接liba.so 后链接 libb.so,反过来则会出错

我学习到的原因是:

编译器会顺序遍历所有的.o.so模块,遇到未定义的符号则放入列表U
顺序遍历所有的.o.so模块的过程中,使用该.o.so中的符号对列表U中的符号进行解释
遍历结束时,若U中仍然存在未定义符号,则报告Undefined symbol错误
那么如果liba.solibb.so互相依赖,理论上需要
-la -lb -la

但实际操作发现,不需要链接liba.so两次

请问:
是我学习到的链接原理有误,还是编译器进行了相关优化?

优化了