We manage a large Solaris network containing several large shared program repositories, each containing up to 1000 programs apiece. Several times in the last two years we have inadvertently and unpredictably broken user programs and network services during routine upgrades of dynamic libraries. Library dependencies that load libraries from NFS-mounted partitions have also been responsible for random boot-time failures of daemons, because a daemon cannot access its libraries when it needs to load them. Lastly, we can never be sure that a dynamic library is not in use by any program, so we can never delete a dynamic library safely.
In this paper we describe a very simple technique for avoiding such anomalies through ``in vivo'' global analysis of library dependencies. A Perl script constructs a library dependency database from a user's-eye-view of a system and generates an `inverted' report, for each dynamic library, of all of the programs that will attempt to load it. Using this report, one can easily spot problems such as those mentioned above.