libraries are ordered collections of computer software functions that enable more than one software program to use the functions . by making the same functions available to multiple software programs , less memory is used to store instructions . at least as important , if a function needs to be modified , the modification can be done in one software module , i . e ., the library , instead of many software modules , i . e ., the programs . a function in a library is referred to as a “ library function .” typically , each library functions &# 39 ; computer instructions and a reference to each functions &# 39 ; computer instructions are placed in a library . before a library function &# 39 ; s computer instructions can be executed by , for example , an application , the library containing the library function must be located , loaded , and initialized . initialization usually involves executing instructions that prepare , for example , data structures used by the library functions . normally , a software module in an operating system called a “ loader ” provides the library location , loading , and initialization . often , a first library function in a first library calls a second library function in a second library . in such a situation , the first library depends on the second library . that is , the first library is a dependent library of the second library . stated conversely , the second library supports the first library . that is , the second library is a supporting library of the first library . for example , an application may depend on a library a that depends on a library b which depends on a library c . in the example , library c supports library b which support library a and all three libraries , directly or indirectly , support the application . the dependency relationships described above can be represented in a tree structure , i . e ., a library dependency tree or library tree . in a library tree , a node is inserted for each library . each dependency relationship is represented by a link between the dependent library and the supporting library . in order to load and initialize the application , libraries a , b , and c must be loaded and initialized in the proper order . the application and its libraries are typically loaded in the order that the application and libraries are discovered , i . e . in top down order . for example , the application is loaded first , then library a , then library b , etc . the application and its libraries are typically are initialized in bottom up order . during loading , a library is parsed . if , during the parsing of the library , no supporting libraries are discovered , i . e ., the library does not depend on other libraries , the loading of the library continues until the loading of the library is completed . if , during the parsing of the library , one or more dependencies are discovered , the loading of the library is paused and supporting libraries are loaded . after the supporting libraries are loaded , the library continues until the loading of the library is completed . during the loading stage , as each library is parsed , a dependency tree is assembled . for each supporting library , a node is inserted in the dependency tree linked beneath the library that the supporting library supports . as soon as a library &# 39 ; s supporting libraries are loaded , the library can be snapped . the loader uses the dependency tree to determine the snapping order starting with the nodes at the bottom of the dependency tree . hence , the snapping stage proceeds bottom - up , i . e ., from the bottom of the dependency tree to the top of the dependency tree . as soon as a library is snapped and library &# 39 ; s supporting libraries are initialized , the library can be initialized . the loader uses the dependency tree to determine the initialization order starting with the nodes at the bottom of the dependency tree . hence , the initialization stage proceeds bottom - up . the order in which the libraries are loaded and initialized , described above , prevents the functions in the libraries from being called before the libraries are properly prepared . if a function in a library is called before the library containing the function is properly prepared , the function and / or the data used by the function may be in an indeterminate state . a function and / or data that is in an indeterminate state can cause , for example , the function to overwrite random memory locations that , in turn , can cause further malfunctions that are often difficult to detect . unfortunately , it is also possible for libraries to be co - dependent . for example , if library b depends on library c and library c depends on library b , libraries b and c are co - dependent . that is , there are two links between libraries b and c , which creates a cycle . a cycle is produced if , directly or indirectly , a supporting library for another library is also a dependent library . an indirect cycle is created if , for example , library a depends on library b which depends on library c and library c also depends on library a . in this situation , an indirect cycle is created because library a indirectly depends on library c and library c depends on library a . in the case of a cycle , it is difficult to determine the appropriate initialization order for the libraries , which can lead to an indeterminate state . note that while the state is indeterminate , the state is legal , i . e ., allowable because it may be safe to initialize library a before library c if the initialization functions inside library a do not invoke functions in library c and it may be safe to initialize library c before library a if the initialization functions inside library c do not invoke functions in library a . unfortunately , it is not possible for an operating system to determine which initialization path is safe when a cyclical dependency exists . a traditional way to resolve the above - described loading problem is to arbitrarily choose one of the libraries to load first . often , this has been an adequate solution because library developers have written libraries so that the libraries can be loaded in any order due to the inherent non - determinism in the traditional scheme . this places severe restrictions on developers . for example , library developers must carefully examine the documentation , and code if it is available , of each library to ensure that no dependencies are built into a new library . often , to eliminate the dependencies , much functionality must be given up . indeed , in certain cases , designing libraries that can be loaded in any order may not be possible . it is better to resolve cycles in a deterministic fashion that enables operating systems to determine the appropriate loading order for libraries supporting applications . the dynamic library cycle resolution described below provides deterministic cycle resolution . fig1 is a block diagram that illustrates an exemplary computing device 100 suitable for performing dynamic library cycle resolution . computing devices capable of running an operating system such as the exemplary computing device 100 include , but are not limited to , desktop computers , servers , laptop computers , cellular telephones , electronic game consoles , microwave ovens , flight control computers , computer driven kiosks , and so on . the computing device 100 shown in fig1 comprises a basic computing device 106 and various types of peripheral devices with which the basic computing device 106 interacts . the basic computing device 106 comprises a processing unit 102 and a memory unit 104 including system memory , volatile memory , and non - volatile memory . the processing unit 102 may be implemented as one microprocessor , a plurality of microprocessors , a multiple core microprocessor , a plurality of multiple core microprocessors , or other electronic circuitry capable of providing similar computing resources . the memory unit 104 may be implemented by memory devices such as , but not limited to , read - only memory ( rom ), programmable read - only memory ( prom ), electrically programmable read - only memory ( eprom ), electrically erasable and programmable read - only memory ( eeprom ), random - access memory ( ram ), static random - access memory ( sram ), dynamic random - access memory ( dram ), flash memory or a combination of the aforementioned memory devices . the basic computing device 106 may interact with one or more peripheral devices including , but not limited to , removable storage 108 , non - removable storage 110 , output device ( s ) 116 , input device ( s ) 112 , and communication connection ( s ) 114 . removable storage 108 devices include , but are not limited to , removable magnetic disc drives and removable optical disc drives such as compact disc ( cd ) drives and digital video drives ( dvd ). non - removable storage 110 devices include , but are not limited to , magnetic disc drives , optical disc drives , holographic storage units , and so on . output device ( s ) 116 include , but are not limited to , liquid crystal displays ( lcds ), plasma displays , cathode ray tube ( crt ) displays , audio speakers , haptic gloves , haptic seats , digital projectors , and so on . input device ( s ) 112 include , but are not limited to , mice , keyboards , electronic pens , microphones , digital cameras , digital video cameras , and so on . communication connection ( s ) 114 include , but are not limited to , ethernet , token ring , fiber distributed data interface ( fddi ), asynchronous transfer mode ( atm ), firewire connections , and so on . computing devices , such as the exemplary computing device 100 illustrated in fig1 and described above , are often controlled by an operating system . an operating system controlled computing device provides an environment for dynamic library cycle resolution . certain operating systems provide dynamically linked libraries ( dlls ). a dynamically linked library ( dll ) is a library that is able to be loaded and initialized while the applications that use the dll are running . a library tree containing nodes that represent dlls is a dll tree . hence , an implementation of dynamic library cycle resolution is dynamic dll cycle resolution . except where noted , hereinafter the terms “ library ” and “ dll ” may be interchanged and the phrases “ dynamic library cycle resolution ” and “ dynamic dll cycle resolution ” may also be interchanged , it being understood that the disclosed subject matter is not limited to dlls but include other types of linked libraries , including statically loaded libraries . an application or a library usually contains an import table that stores references to the libraries on which the application or library depends . a library tree may be formed using the references from the import tables in the applications and libraries . fig2 is a pictorial diagram of an exemplary import table 200 . the exemplary import table 200 shown in fig2 contains library reference library_a 202 , library reference library_b 204 , and library reference library_c 206 . a library tree may be formed using library references library_a 202 , library_b 204 , and library_c 206 . fig3 is a pictorial diagram of an exemplary dependency tree , i . e ., library tree , illustrating an exemplary dependency relationship of three exemplary libraries such as the libraries whose references are stored in the import table 200 shown in fig2 . the dependency tree shown in fig3 begins with block a 300 , which represents a library such as the library referenced by library reference library_a 202 shown in fig2 . a directed link , represented by an arrow pointing down , connects block a 300 with block b 302 . the directed link indicates that the library represented by block a 300 depends on the library represented by block b 302 . block a 300 connected to block b 302 by a directed link is an example of a directed dependency relationship . similarly , a directed link between block a 300 and block c 304 indicates a directed dependency relationship between block a 300 and block c 304 . that is , the library represented by block a 300 depends on the libraries represented by block b 302 and block c 304 . stated another way , the libraries represented by block b 302 and block c 304 support the library represented by block a 300 . fig4 is a pictorial diagram of two exemplary directed dependency relationships . in the directed dependency relationships shown in fig4 , block a 400 depends on block b 402 which depends on block c 404 . stated another way , block c 404 supports block b 402 which supports block a 400 . fig5 is a pictorial diagram of an exemplary direct cyclic dependency relationship . in a direct cyclic dependency relationship there is a cyclic dependency relationship between two blocks with no other blocks involved . in the direct cyclic dependency relationship shown in fig5 , block a 500 depends on block b 502 which depends on block c 504 . block c 504 also depends on block b 502 . hence , block b 502 supports block c 504 and block c 504 supports block b 502 . the two directed links between block b 502 and block c 504 create a cycle between block b 502 and block c 504 . fig6 is a pictorial diagram of an exemplary indirect cyclic dependency relationship . in an indirect cyclic dependency relationship there is a cyclic dependency relationship between three or more blocks . in the indirect cyclic dependency relationship shown in fig6 , block a 600 depends on block b 602 which depends on block c 604 . also , block c 604 depends on block a 600 . because block a 600 depends on block b 602 which depends on block c 604 , and block c 604 depends on block a 600 , there is an indirect cyclic relationship created . the directed links between block a 600 and block b 602 and block b 602 and block c 604 along with the link between block c 604 to block a 600 creates a cycle . a part of a solution for resolving cycles in a deterministic fashion that enables determining library loading order is categorizing dependency relationships according to when the dependency relationships are effective . for example , a dependency relationship may be effective during the initialization of a library but not during operation of the application using the library ; or , a dependency relationship may not be effective during the initialization of a library but be effective during the operation of the application using the library . an example of the first kind of dependency relationship is one in which a library a depends on a library b because library a needs to call one or more functions in library b during library a &# 39 ; s initialization . an example of the second kind dependency relationship is one in which the library a depends on the library b because library a needs to call one or more functions in library b during the operation of the application using library a but not during library a &# 39 ; s initialization . these two kinds of dependency relationships are called , respectively , hard and soft dependency relationships . a link that represents a hard dependency is a hard link . similarly , a link that represents a soft dependency is a soft link . a hard link indicates that the operating system needs to call the initialization routine for the supporting library before calling the initialization routine of the dependent library . no external calls to the library , i . e ., no calls from an entity that is not the library itself , can be allowed before the library is initialized . a soft link indicates that the operating system does not need to call the initialization routine of the supporting library before calling the initialization routine of the dependent library . an external call to the library , i . e ., a call from an entity that is not the library itself , is allowed during initialization . for example , a soft link from library a to library b indicates that library a &# 39 ; s initialization routine does not require the functions in library b to complete . thus , effectively , library b does not need to be initialized before library a is initialized . fig7 is a pictorial diagram of an exemplary indirect cyclic dependency relationship with hard and soft links . like the dependency relationship shown in fig6 , the dependency relationship in fig7 is also an indirect cyclic dependency relationship . unlike the dependency relationship shown in fig6 , the dependency relationship shown in fig7 depicts a hard link using a heavy line and a soft link using a thinner line . in the dependency relationship shown in fig7 , block a 700 has a hard link , depicted by a thick line , to block b 702 . block b 702 has a soft link to block c 704 . block c 704 has a hard link to block a 700 . as stated above , categorizing dependency relationships according to when the dependency relationships are effective is a part of a solution for resolving cycles in a deterministic fashion to enable determining library loading order . a cycle can be resolved if one or more links comprising the cycle can be removed . a soft link can safely be removed during initialization because a soft link indicates that the dependency relationship between two libraries is not effective during initialization . an example of categorizing dependency relationships according to when the dependency relationships are effective , i . e ., using hard and soft links , to resolve cycles in a deterministic fashion is illustrated in fig8 . fig8 is a pictorial diagram of the exemplary indirect cyclic dependency relationship shown in fig7 which has been converted to a directed dependency relationship by removing , i . e ., breaking , the soft link between block b and block c . in the dependency relationship shown in fig8 , block a 800 has a hard link to block b 802 . there is no link between block b 802 and block c 804 because the soft link has been broken . there is a hard link between block c 804 and block a 800 . hence , the dependency relationship between block a 800 , block b 802 , and block c 804 is a directed dependency relationship . the goal of using hard and soft links to resolve cycles in a deterministic fashion is to ensure that the supporting libraries for a library will be safely initialized before the library itself is initialized . fig9 is a functional flow diagram of an exemplary process for breaking soft links to convert cyclic dependency relationships in a library tree to directed dependency relationships . the process in fig9 begins at block 900 in which the cycles in a dependency tree are identified . at block 902 , the first cycle in the dependency tree is set to the next cycle , i . e ., the next cycle to be processed . in block 904 , the next link , i . e ., the next link to be processed , is set to the first link in the cycle . at block 906 , a test is made to determine if the next link is a soft link . if the next link is a soft link , the control flows to block 908 . at block 908 , the link is broken , and control flows to decision block 918 . if the next link is not a soft link , the control flows to decision block 912 . at decision block 912 , a test is made to determine if all the links in the cycle have been processed . if all the links in the cycle have been processed , the control flows to block 916 . at block 916 , the loader is notified that the cycle consists entirely of hard links and control flows to decision block 918 . using this information , the loader may determine that the cycle cannot be broken and take alternate action . the loader may also have other information that permits the loader to determine that one of the hard links may be broken or that it is somehow safe to break the cycle . if all the links in the cycle have not been processed , the control flows to block 910 . at block 910 , the next link is obtained , and control flows to decision block 906 . at decision block 918 , a test is made to determine if all cycles in the dependency tree have been processed . if all of the cycles in the dependency tree have been processed , the process ends . if all of the cycles in the dependency tree have not been processed , control flows to block 920 . at block 920 , the next cycle is obtained , and control flows to block 904 . while the preferred embodiment of the invention has been illustrated and described , it will be appreciated that various changes can be made therein without departing from the spirit and scope of the invention .