J'ai une application Cocoa qui utilise otool pour trouver les bibliothèques partagées requises pour qu'une application fonctionne correctement. Par exemple, disons que je lance otool -L sur une application qui utilise QTKit.framework. Je reçois une liste des bibliothèques partagées utilisées par le programme (y compris les cadres de base comme Cocoa.framework et AppKit.framework):Utilisation d'otool (récursivement) pour trouver les bibliothèques partagées nécessaires à une application
/System/Library/Frameworks/QTKit.framework/Versions/A/QTKit (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 476.0.0)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 949.0.0)
..... and so on for a bunch of other frameworks
Ce qui montre que l'application utilise QTKit.framework. Toutefois, si je l'utilise « otool -L » à nouveau sur le binaire pour QTKit.framework (/System/Library/Frameworks/QTKit.framework/Versions/A/QTKit) Je reçois ceci:
/System/Library/Frameworks/QTKit.framework/Versions/A/QTKit (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox (compatibility version 1.0.0, current version 1.0.0)
/System/Library/PrivateFrameworks/CoreMedia.framework/Versions/A/CoreMedia (compatibility version 1.0.0, current version 1.0.0)
/System/Library/PrivateFrameworks/MediaToolbox.framework/Versions/A/MediaToolbox (compatibility version 1.0.0, current version 1.0.0)
/System/Library/PrivateFrameworks/VideoToolbox.framework/Versions/A/VideoToolbox (compatibility version 1.0.0, current version 1.0.0)
/System/Library/PrivateFrameworks/CoreMediaIOServices.framework/Versions/A/CoreMediaIOServices (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 751.0.0)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1038.0.0)
/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
/System/Library/Frameworks/QuickTime.framework/Versions/A/QuickTime (compatibility version 1.0.0, current version 1584.0.0)
/System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore (compatibility version 1.2.0, current version 1.6.0)
/System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox (compatibility version 1.0.0, current version 435.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 123.0.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 44.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 550.0.0)
/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 38.0.0)
/System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo (compatibility version 1.2.0, current version 1.6.0)
Cela montre une charge plus de cadres que la sortie originale otool sur le binaire de l'application a montré. Existe-t-il un moyen de lancer récursivement otool, c'est-à-dire saisir les frameworks dont l'application a besoin, puis entrer et rechercher des dépendances dans chacun de ces frameworks?
Je pense en cours d'exécution, il aurait à plusieurs reprises sans doute le mieux. Quelle serait une manière logique de faire cela? Le faire passer à travers tout le ferait passer à une boucle infinie ... – indragie
Deux ensembles (NSMutableSet) devraient le faire: un ensemble pour les chemins que vous avez déjà traités, et un ensemble pour les chemins que vous devez traiter. D'abord peupler le deuxième ensemble en exécutant otool sur l'application. Faites ensuite une copie du deuxième ensemble, videz-le et exécutez otool sur chaque élément de la copie. N'oubliez pas de canaliser les chemins après avoir résolu @executable_path et avant de les ajouter à un ensemble (vous pouvez utiliser realpath (3)). –
Cette solution fonctionne :-) Merci – indragie