2010-10-26 26 views
4

Est-il possible d'ajouter des sections à un exécutable déjà lié? J'essaie de signer un code exécutable OS X, basé sur le Apple instructions. Ceux-ci comprennent l'instruction pour créer une section appropriée dans le binaire à signer, en ajoutant des arguments aux options de l'éditeur de liens:Comment puis-je ajouter des sections à un exécutable existant (OS X)?

-sectcreate __TEXT __info_plist Info.plist_path 

Mais: L'exécutable que je suis en train de signer est produit en utilisant Racket (un schéma implémentation), qui assemble un exécutable autonome à partir du code Racket/scheme en clonant le "réel" exécutable de la raquette et en éditant le fichier Mach-O directement.

Donc la question est: y a-t-il un moyen de continuer à éditer cet exécutable, pour ajouter la section qui est requise pour la signature de code?

En utilisant ld ne fonctionne pas quand il est utilisé de manière évidente:

% ld -arch i386 -sectcreate __TEXT __info_plist ./hello.txt racket-executable 
ld: in racket-executable, can't link with a main executable 
% 

Cela semble assez juste, je suppose. Libtool n'a aucune option à la recherche probable, et la commande redo_prebinding (qui est au moins une commande pour éditer les exécutables).

Les deux possibilités suggérées par la liste de raquette pertinente étaient (i) d'étendre l'outil de compilation de raquette pour ajuster la chirurgie qui est faite sur l'exécutable (faisable, mais effrayant), ou (ii) pour créer une raquette personnalisée exécutable qui a la section désirée déjà en place. Les deux semblent des solutions de masse-écrou. La liste macosx-dev n'a pas trouvé de suggestions.

Répondre

1

Je pense que c'est infaisable.

Il semble qu'il n'y ait aucune commande de stock qui édite un fichier objet Mach-O (qui inclut des exécutables). La commande otool vous permet d'afficher la structure d'un tel fichier (utilisez otool -l), mais c'est à peu près tout.

La structure d'un fichier objet Mach-O est documentée on the Apple reference site. En résumé, un fichier d'objet de Mach-O a la structure suivante:

  • un en-tête, suivi par
  • une séquence de 'commandes de chargement', suivi par
  • une séquence de 'segments' (une partie des les commandes de chargement sont responsables de pointer vers les décalages des segments dans le fichier)

Les segments contiennent zéro ou plusieurs «sections». Les commandes d'en-tête et de chargement sont réputées être dans le premier segment du fichier, avant toutes les sections de ce segment. Il y a quelques douzaines de commandes de chargement documentées, et d'autres commandes définies dans le fichier d'en-tête correspondant, donc clairement privées. Ajouter une section impliquerait de changer la longueur d'un segment.

À moins que la section soit très petite, cela nécessiterait de pousser le segment suivant plus loin dans le fichier.C'est un non-non, car un lot des commandes de chargement se réfèrent à des données dans le fichier avec des décalages absolus depuis le début du fichier (par opposition, disons, au début du segment ou de la section qui les contient), Déplacer les segments dans un éditeur Mach-O putatif impliquerait de rafistoler un grand nombre de décalages. Cela n'a pas l'air facile.

Il y a un ou deux visionneuses de fichiers Mach-O sur le web, mais aucune qui fait autant de choses que otool, pour autant que je puisse voir (ce n'est pas particulièrement difficile: j'en ai écrit un comprendre le format). Il y a au moins un éditeur Mach-O, mais il n'a pas semblé faire quoi que ce soit que lipo n'a pas fait (appelé 'moatool', mais la source semble avoir disparu de google code).

Oh bien. Il est temps de trouver un plan B, je suppose.

+0

Comment avez-vous réussi à ajouter une nouvelle section à un fichier exécutable existant? Je suis maintenant confronté au même problème = [merci! – Rouki

+0

Je ne l'ai jamais résolu, mais à la fin, j'ai tout simplement esquivé l'exigence (c'est moche mais dans ce contexte supportable simplement appuyer sur le bouton au démarrage qui dit 'oui, permettre à l'application non signée X de s'exécuter'). –

+0

Seamus Brady et Matthew Flatt ont élaboré une procédure qui est décrite dans la liste des utilisateurs de raquettes (https://groups.google.com/forum/#!topic/). raquette-utilisateurs/OQnOlRGTCOM) –