Informations sur une application

juillet 2007 modifié dans API AppKit #1
Bonjour,

Je cherche à  récupérer l'architecture ainsi que le "format" (? 32 ou 64bits) d'une application (qui n'est pas la mienne). Cependant je ne vois pas comment faire.
Je dispose donc simplement du path de l'application

Merci d'avance,
Louka.

Réponses

  • schlumschlum Membre
    20:43 modifié #2
    lipo -detailed_info /Applications/iTunes.app/Contents/MacOS/iTunes
    
  • AliGatorAliGator Membre, Modérateur
    20:43 modifié #3
    La vache il est en retard le flux RSS je viens d'avoir le message et je voulais me précipiter pour répondre "lipo" (genre "réponse courte et conscise à  la schlum" :P) et je me suis fait "griller"... si on peut, dire, vu que ça fait qd mm 1h déjà  (et que la réponse de schlum n'est pas dans le RSS).
    Il est réactualisé tous les combien, le RSS ?

    PS : Pour plus d'infos Louka regarde aussi la page man de "arch" en plus de celle de "lipo", y'a la liste des types d'archis, etc)
  • schlumschlum Membre
    20:43 modifié #4
    La notification par mail fonctionne bien en tout cas  :P
  • 20:43 modifié #5
    Merci pour vos réponses XD

    C'est génial on a même la taille de l'Application ? Quoi que non, c'est seulement l'executable ça... il compte pas le poids des fichiers resources..

    Et pour 32 et 64 bits c'est nfat_arch ? 2 (pour iTunes) signifiant 32 & 64bits ?  :o
  • schlumschlum Membre
    20:43 modifié #6
    Non, comme t'as dit Aligator, toutes les infos sont dans "man 3 arch"...

    x86 64 bits -> x86_64
    ppc 64 bits -> ppc64

    schlum$ gcc -arch ppc -o test test.c &amp;&amp; lipo -info test<br />Non-fat file: test is architecture: ppc<br /><br />schlum$ gcc -arch i386 -o test test.c &amp;&amp; lipo -info test<br />Non-fat file: test is architecture: i386<br /><br />schlum$ gcc -arch ppc -m64 -o test test.c &amp;&amp; lipo -info test<br />Non-fat file: test is architecture: ppc64<br /><br />schlum$ gcc -arch i386 -m64 -o test test.c &amp;&amp; lipo -info test<br />Non-fat file: test is architecture: x86_64
    


    Pour les tailles, c'est effectivement les tailles des exécutables...
  • 20:43 modifié #7
    Je comprend pas comment tu fais..

    En tout cas j'ai un problème pour certaines applications.
    Si je prend ToolsX3 par exemple, voici ce que me retourne le terminal :

    lipo: can't figure out the architecture type of: /Users/Loulou/Applications/ToolsX3.app/Contents/MacOS/ToolsX3


    Bon soit, je met une petite pipe sur mon NSTask en standardError. ducoup on me retourne bien ça comme erreur au final, et je m'occupe de faire le trie des applications "bonnes" et "fausses"
    Le problème est que, à  cause de ça j'obtiens toujours :

    Exception raised during posting of notification.  Ignored.  exception: *** -[NSCFDictionary setObject:forKey:]: attempt to insert nil value


    Alors que je n'ai AUCUN NSDictionary et nul part je fais de setObject:forKey:...
    Donc là  je suis vraiment perdu.

    <br />NSTask *task = [[[NSTask alloc] init] autorelease];<br />NSPipe *pipe = [[[NSPipe alloc] init] autorelease];<br />NSPipe *pipeError = [[[NSPipe alloc] init] autorelease];<br />[task setLaunchPath:@&quot;/usr/bin/env&quot;];<br />[task setArguments:[NSArray arrayWithObjects:@&quot;lipo&quot;, @&quot;-detailed_info&quot;, pathExecutable, nil]];<br />[task setStandardOutput:pipe];<br />[task setStandardError:pipeError];<br />NSFileHandle *handle = [pipe fileHandleForReading];<br />NSFileHandle *handleError = [pipeError fileHandleForReading];<br />[task launch];<br />NSString* standardErrorString = [[[NSString alloc] initWithData:[handleError readDataToEndOfFile] encoding:NSUTF8StringEncoding] autorelease];<br />NSString* outputString = [[[NSString alloc] initWithData:[handle readDataToEndOfFile] encoding:NSUTF8StringEncoding] autorelease];<br />
    
  • schlumschlum Membre
    20:43 modifié #8
    Ton "exe" ToolsX3, t'es sûr que c'est pas un script ?

    sinon, c'est bizarre, pourquoi "/usr/bin/env" pour le LaunchPath ?
  • 20:43 modifié #9
    J'y connais rien au terminal  :o Je me suis servi d'un exemple sur le net qui permettait de monter des images disques
  • schlumschlum Membre
    juillet 2007 modifié #10
    Ah... En même temps, NSTask n'est qu'un wrapper sur "popen"  :P

    [code supprimé, car faux...]
  • schlumschlum Membre
    juillet 2007 modifié #11
    Ca ça fonctionne mieux (testé) :

    char rep[1024];<br />NSString *cmd = [NSString stringWithFormat:@&quot;/usr/bin/lipo -detailed_info &#092;&quot;%@&#092;&quot;&quot;,pathExecutable];<br />FILE *fp = popen([cmd cStringUsingEncoding:NSUTF8StringEncoding],&quot;r&quot;);<br />NSMutableString *res = [NSMutableString string];<br />fgets(rep,1024,fp);<br />while(!feof(fp)) {<br />	[res appendString:[NSString stringWithCString:rep encoding:NSUTF8StringEncoding]];<br />	fgets(rep,1024,fp);<br />}<br />pclose(fp);
    


    [Edit] guillemets
  • 20:43 modifié #12
    Merciiii Schlum ! Je t'aime !  o:) o:)
  • 20:43 modifié #13
    Zarb j'ai pleins de :

    /usr/bin/lipo: can't open input file: /Applications/Jeux/Mac (No such file or directory)


    et aussi :

    /usr/bin/lipo: unknown flag: -


    et même :

    /usr/bin/lipo: Can't map input file: /Users/Loulou/Boulot/programmation/Programmes/Sources ((os/kern) invalid argument)


    (Note que je passe au peigne fin chaque applications - j'ai exclu les applications contenues dans le dossier System)

  • schlumschlum Membre
    20:43 modifié #14
    Ah oui... Normal...

    NSString *cmd = [NSString stringWithFormat:@&quot;/usr/bin/lipo -detailed_info &#092;&quot;%@&#092;&quot;&quot;,pathExecutable];
    


    Il faut soit mettre des quotes, soit échapper les espaces en shell.
  • juillet 2007 modifié #15
    Autant pour moi, je le savais en plus  :o
    Merci

    Edit : vala ça a l'air de marcher. Merci encore Schlum :p
  • 20:43 modifié #16
    Par contre je reviens maintenant sur le format de l'application, j'ai pas trop compris comment me servir de la commande  ???
  • schlumschlum Membre
    20:43 modifié #17
    dans 1183545286:

    Par contre je reviens maintenant sur le format de l'application, j'ai pas trop compris comment me servir de la commande  ???


    Comment ça ?
  • 20:43 modifié #18
    Je sais pas si "format" est le terme exact (ça m'échappe)... en fait je parle de la commande pour récupérer ce "format" d'une application (32 ou 64 bits) que je n'ai pas très bien compris
  • schlumschlum Membre
    20:43 modifié #19
    dans 1183550802:

    Je sais pas si "format" est le terme exact (ça m'échappe)... en fait je parle de la commande pour récupérer ce "format" d'une application (32 ou 64 bits) que je n'ai pas très bien compris


    Ben... C'est ce dont on parle depuis tout à  l'heure... lipo...
  • 20:43 modifié #20

    Non, comme t'as dit Aligator, toutes les infos sont dans "man 3 arch"...
    .....


    En fait j'arrive pas à  reproduire ce que tu as fait juste ne dessous de cette phrase
  • schlumschlum Membre
    20:43 modifié #21
    Ahhh !
    Ben c'est juste faire joujou avec les options de compilation de gcc...
    "-m64" -> 64 bits
    "-arch ..." -> choix de l'architecture
  • AliGatorAliGator Membre, Modérateur
    20:43 modifié #22
    Il a juste compilé un projet bidon en PPC 32 bits, Intel 32 bits, PPC 64 bits, Intel 64 bits.
    Et sur chacun de ces 4 essais, il a executé la commande lipo pour avoir les infos sur l'executable généré.
    "lipo" lui a donc répondu en disant que, pour chacun de ces 4 executables, ce n'était pas un FAT file (donc c'est un binaire qui n'a qu'une architecture, pas comme une appli Universal Binary), et que le format des executables était "ppc" (PPC 32 bits), "i386" (Intel 32 bits), "ppc64" (PPC 64 bits) et "x86_64" (Intel 64 bits), respectivement.

    Bien sûr sur certaines applis notamment les UB, lipo te dira que c'est une "FAT file" et te listera alors les 2 (ou plus) architectures qui le composent, comme "ppc" et "i386" par exemple.

    A toi de traiter tous les cas.
  • 20:43 modifié #23
    Voilà  je reviens pour vous dire que tout marche enfin nickel
    J'utilise "lipo -info cheminDeLexecutable"
    Au final, si une appli est par exemple PPC uniquement et 32-64 bits, le term me retourne :
    ...... architecture are : ppc ppc64

    Donc en fait beaucoup plus simple à  analyser xD

    Merci encore à  vous 2
Connectez-vous ou Inscrivez-vous pour répondre.