40 votes

Codesign retourné 1 (format de l'objet ifile invalide ou inadapté) bug

Je travaille avec Xcode 4.1 build 4B110f en essayant de préparer mon application iOS pour le téléchargement. Elle passe l'étape Product|Archive sans erreur, demandant deux fois la permission de signer quelque chose. Mais lorsque j'essaie de valider l'archive à partir de l'Organizer, cela échoue :

### Codesigning '/Users/uqrchern/Library/MobileDevice/Provisioning Profiles/70D2381D-3733-4F5D-88B2-4729572C2864.mobileprovision' with 'iPhone Distribution: Ron Chernich'
+ /usr/bin/codesign --force --preserve-metadata --sign iPhone Distribution: Ron Chernich --resource-rules=/var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/Payload/ABRA-D.app/ResourceRules.plist --entitlements /var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/entitlements_plistrZ1Vwko6 /var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/Payload/ABRA-D.app
Program /usr/bin/codesign returned 1 : [/var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/Payload/ABRA-D.app: replacing existing signature
/var/folders/ul/ula1AHKnGpqQ9ftDnUL-l++++TM/-Tmp-/rybczU3EBd/Payload/ABRA-D.app: object file format invalid or unsuitable
]
error: codesign failed with error 1

J'ai examiné tous les problèmes et solutions similaires (dont certains n'ont aucun sens ou s'appliquent à des versions très anciennes des outils). Aucune n'a fait la moindre différence.

J'ai également vérifié 3 fois que verify utilise le certificat "production", tout comme l'étape de codesign qui produit l'archive. J'ai même transformé la sortie ci-dessus en un schell script pour pouvoir essayer tous les certificats manuellement : même résultat à chaque fois.

Peut-être que le fichier .app signé est vraiment inadapté ?

Incidemment, codesign n'a pas de drapeau de version, mais la page de manuel est datée du 1er juin 2006. Le binaire a une date de fichier du 20 novembre 2010.

MISE À JOUR (le jour suivant) :

En poursuivant les recherches sur le problème, nous avons trouvé une référence obscure indiquant que le codesign nécessite l'environnement suivant : var set :

CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate

En utilisant la sortie d'une exécution ratée de Validate, j'ai créé un shell script qui a exporté cette var juste avant l'étape ratée de codesign --force et viola ! Le codesign fonctionne.

Mais cela ne m'aide pas vraiment à préparer mon code pour le téléchargement. Existe-t-il un moyen d'inclure ceci dans le script exécuté par le bouton Validate de l'organisateur ? ?

UN PEU PLUS TARD ENCORE, LA SOLUTION :

Sous la théorie qu'il y a un script quelque part qui génère toutes les commandes exécutées pendant une exécution de Organizer Validate..., j'ai fait quelques recherches avec grep et find. Le script existe en effet et son nom est :

/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication

C'est juste Perl et la solution consiste à ajouter la variable d'environnement requise au tableau associatif %ENV dès le début, disons à la ligne 72 :

$ENV{CODESIGN_ALLOCATE} = '/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate';

Cela résout totalement le problème. Je n'ai aucune idée d'où viennent tous les autres posters sur le web qui pensent l'avoir réparé par des combinaisons de suppression de certificats, de construction propre, d'arrêt et de redémarrage de Xcode, etc, etc. Je vais juste affirmer tranquillement que cette correction favorise la science plutôt que la superstition et qu'elle fonctionne pour moi sous Xcode 4.1 Build 4B110f et son PackageApplication script associé, fonctionnant sous Snow Leopard 10.6.8 avec Perl 5.10.0

8voto

Jon Points 4637

Juste pour que cela soit retiré de la liste des questions sans réponse. Comme vous l'avez dit, vous devez ajouter CODESIGN_ALLOCATE à la $ENV le tableau :

$ENV{CODESIGN_ALLOCATE} = '/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate';

Si tout le monde est d'accord ici, je pense que cette question peut enfin être close.

Lorsque vous utilisez une version plus récente de Xcode, l'emplacement par défaut est :

$ENV{CODESIGN_ALLOCATE} = '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate';

1voto

richardwhiuk Points 36

Au cas où vous auriez ce problème sur une version récente de Xcode, ce que vous voulez en fait est, dans le shell :

export CODESIGN_ALLOCATE=`xcode-select -print-path`/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate

qui utilisera le codesign_allocate de la version de Xcode que vous utilisez.

Vous pouvez mettre à jour la version de Xcode que les outils de la ligne de commande utilisent en exécutant xcode-select -switch

0voto

Dan J Points 7314

J'avais mis en place cette solution de contournement depuis longtemps, mais après la mise à jour vers Xcode 4.3 avec le SDK iOS 5.1, ma signature script (qui appelle codesign ) a cessé de fonctionner avec un cannot find code object on disk erreur :

output/Enterprise/Payload/MyProduct.app/MyProduct: replacing invalid existing signature    
output/Enterprise/Payload/MyProduct.app/MyProduct: cannot find code object on disk     
Code signing failed, not creating .ipa file    

Il semble que cette solution de contournement ne soit pas nécessaire pour les binaires construits avec Xcode 4.3. Pour corriger, j'ai mis à jour mon bash script pour vérifier si l'emplacement existe avant de l'exporter :

  # Only export the environment variable if the location exists,
  # otherwise it breaks the signing process!
  if [ -f "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate" ]
  then
    echo Export environment variable for codesign_allocate location
    export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
  fi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X