2016-08-14 4 views
0

J'utilise otool pour obtenir des informations sur mon binaire. Voici une partie de ma sortie:Comment utiliser otool pour obtenir la taille d'un fichier binaire?

Load command 0 
     cmd LC_SEGMENT_64 
    cmdsize 72 
    segname __PAGEZERO 
    vmaddr 0x0000000000000000 
    vmsize 0x0000000100000000 
    fileoff 0 
filesize 0 
    maxprot 0x00000000 
initprot 0x00000000 
    nsects 0 
    flags 0x0 
Load command 1 
     cmd LC_SEGMENT_64 
    cmdsize 952 
    segname __TEXT 
    vmaddr 0x0000000100000000 
    vmsize 0x0000000000268000 
    fileoff 0 
filesize 2523136 
    maxprot 0x00000005 
initprot 0x00000005 
    nsects 11 
    flags 0x0 

Nous pouvons voir ici que command 1 avec segname __TEXT commence à vmaddr 0x0000000100000000

Le problème est que la taille binaire est 2.3MB et 0x0000000100000000 est de 4 Go!

Je suppose que "un" dans le milieu de l'adresse est liée à l'architecture 64 bits, et 0x0000000100000000 en fait l'adresse 0x00. Je cherchais des informations à ce sujet mais je n'ai rien trouvé d'utile. Quelqu'un peut-il confirmer mes hypothèses et expliquer comment cela fonctionne exactement?

Répondre

1

Il n'y a rien d'étrange.

D'abord un "segment invalide" est réservé dans les 4 Go inférieurs de l'espace d'adressage. C'est comme le 4 Ko invalide ou tout ce qui a été gardé pour que le déréférencement de pointeur NULL plante dans les processus de 32 bits, seulement plus grand (ceci devrait également attraper, par exemple, n'importe quel entier de 32 bits converti en pointeur). Après tout, pourquoi pas? C'est de la mémoire virtuelle, c'est gratuit. Some more details here. Puis, votre texte exécutable est chargé à la limite de 4 Go. Ensuite, votre texte exécutable est chargé à la limite de 4 Go. Rien de mal - gardez à l'esprit que les 4 Go inférieurs ne sont pas cuits par la mémoire réelle, ils sont simplement marqués comme réservés.

En général, il n'est certainement pas étrange d'avoir des éléments chargés à des adresses "élevées" dans un espace d'adresse de 64 bits. La pile, par exemple, est généralement dans la zone juste en dessous des limites de 48 bits. Ce n'est pas comme si le système devait effectivement fournir toute la mémoire au milieu, la mémoire virtuelle fait en sorte que seules les pages qui contiennent quelque chose consomment de la mémoire réelle (RAM ou espace de swap). (En fait, la comptabilité des structures de données des pages comporte un certain coût, mais elle est généralement négligeable)

La taille du binaire est plutôt indiquée dans le champ Taille de la machine virtuelle et dans le champ Taille de fichier (0x268000 = 2523136 ≈ 2,4 Mo) .

+0

Donc, quand mon application sera chargée à la RAM, il atterrira dans les bits inférieurs droite? Si je voudrais décharger memmory de RAM je devrais rechercher la mémoire qui réside entre 0x00 et 0x268000? – Sayaki

+1

Non! Votre binaire sera mappé dans la mémoire virtuelle exactement comme il est écrit dans la sortie 'otool' - à l'adresse 0x0000000100000000, c'est-à-dire juste au-dessus de la limite de 4 Go. Tout l'espace en dessous est réservé à une page "invalide", qui se faufile chaque fois que quelqu'un tente d'y accéder. L'endroit où il atterrit dans la RAM physique est complètement hors de propos (et dépend des caprices du système d'exploitation - il peut effectivement être déplacé de manière transparente, par exemple au cas où il est échangé). –

+0

Ok, je reçois tout maintenant. THX pour l'aide :) – Sayaki