Les segments sont essentiellement une construction de mémoire virtuelle: ils sont généralement alignés sur les limites de la page, de sorte qu'ils peuvent finir par inclure un peu plus que le code de votre application. Étant donné que le segment __TEXT
commence généralement au début d'un fichier Mach-O, cela inclut généralement les en-têtes Mach-O. Sous OS X 10.3 et versions antérieures, la pré-reliaison peut affecter le segment __TEXT
(décrit en détail here). Dans les versions ultérieures, la signature de code peut également modifier le segment __TEXT
.
Vous pouvez étudier le mécanisme de signature de code intégré d'OS X (la cause et la solution de votre problème?). Quelques références recommandées:
Vous pouvez trouver macholib utile dans l'exploration. (Il est inclus avec les versions récentes d'OS X pour supporter py2app.) Voici un script simple que j'ai utilisé pour extraire un segment __TEXT
.
from macholib.MachO import MachO
m = MachO('foo')
__TEXT = (cmd for load_cmd, cmd, data in m.headers[0].commands
if getattr(cmd, 'segname', '').rstrip('\0') == '__TEXT').next()
print '__TEXT segment: offset %x size %x' % (__TEXT.fileoff, __TEXT.filesize)
f = open('foo', 'rb')
f.seek(__TEXT.fileoff)
open('foo__TEXT', 'wb').write(f.read(__TEXT.filesize))
Bien sûr, vous pouvez également utiliser otool -lv
, mais la sortie est un peu désordonné et difficile à analyser.
Merci Nicholas, c'est une réponse très documentée! Je vais enquêter tout ça dès que je serai de retour au travail. –
Oui, la signature de code se produit, se produit essentiellement chaque fois que vous téléchargez une application et cliquez sur "Autoriser" sur le pop-up vous demandant si cela est sûr, est une cause fréquente de __TEXT changer. –