2010-05-22 19 views
4

Je savais que si vous définissiez un tas d'objets NSString @ "" dans le code source sous Mac OS. Ces NSStrings seront stockés dans un segment de la bibliothèque Mach-O.Comment le chargeur Mach-O charge-t-il différents objets NSString?

Section 
sectname __ustring 
segname __TEXT 
    addr 0x000b3b54 
    size 0x000001b7 
    offset 731988 
    align 2^1 (2) 
    reloff 0 
    nreloc 0 
    flags 0x00000000 
reserved1 0 
reserved2 0 

Si je Hexa le binaire, ils sont étroitement alignés l'un par un avec un 0x0000 comme séparateur. Ce que je veux savoir, c'est comment le chargeur de Mac OS X charge-t-il ces NSStrings quand le programme s'exécute? Sont-ils chargés simpily en reconnaissant le séparateur 0x0000 ou il s'agit d'une table de décalage de chaîne ailleurs dans le pointage binaire pour séparer les objets NSString? Merci.

(Ce que je veux vraiment faire est l'augmentation de la longueur de l'un des NSString, donc je dois savoir comment le chargeur reconnaître ces objets distincts)

ajouté: Je sais si vous définissez CStrings comme @ "abc" dans le code va aller au segment cstring. Si c'est une chaîne comme @ "" "" avec des caractères ascii, elle ira à la section ustring selon mes recherches.

+1

telai weiguan lz – ZelluX

Répondre

5

Il existe une section cstring avec toutes les chaînes C constantes. Chaque constante NSString se réfère simplement à l'une de ces chaînes C. La struct C pour une constante NSString ressemble à ceci:

struct NSConstantString { 
    Class isa; 
    char *bytes; 
    int numBytes; 
}; 

Regardez dans la section __DATA__cfstring.

Edit:

Le segment __ustring est l'équivalent du segment de __cstring, sauf avec des chaînes de UTF16. Ainsi, une constante NSString peut faire référence à des données ustring ou cstring.

La seule référence aux données ustring provient probablement de la chaîne cfstr, par laquelle elle est utilisée. Si vous allongez une chaîne, la chaîne cfstring faisant référence à la chaîne suivante fera à la place référence à la queue de la chaîne allongée à moins que vous ne la corrigiez. Vous pouvez peut-être trouver de l'espace libre ailleurs que vous pouvez pointer sur le cfstring.

+0

J'ai ajouté plus de détails dans la question, merci – overboming

+0

Une façon d'interpréter le __cfstring? – overboming

+1

__cfstring est fondamentalement un tableau de NSConstantString. La valeur isa sera la même pour tous. Après c'est le pointeur vers les données de caractères suivies de la longueur. Je ne suis pas sûr si la longueur pour un ustring est des octets ou des caractères. – drawnonward

2

Non. Chaque chaîne a une adresse dans le binaire. Si vous insérez un caractère dans une chaîne, l'adresse augmentera de toutes celles qui se trouvent au-dessus et vous devrez ajuster leurs adresses partout où elles sont référencées dans le fichier binaire, plus si vous augmentez le segment, vous aurez peut-être besoin pour ajuster les emplacements de tous les segments suivants en fonction de combien d'emballage il y avait pour l'alignement du segment. Il est beaucoup plus facile de simplement recompiler le programme et de laisser l'éditeur de liens s'en charger. NB Les NSStrings ne sont pas stockés en interne sous forme de séquences de caractères C. C'est un détail d'implémentation, mais je suspecte que NSStrings utilise une largeur de caractère de 16 bits.

+0

Pouvez-vous me montrer où les additions de la chaîne se trouvent dans le binaire? C'est un peu difficile à expliquer mais je n'ai pas accès au code source, je pense à moins la longueur de la chaîne précédente que je veux éditer et à re-pointer l'adresse sur ma chaîne cible de +1 si je peux trouver une référence. Oui, les chaînes du segment Ustring ont une largeur de 16 bits. – overboming

+0

Désolé, je ne connais pas la réponse à votre question. Drawonward pourrait être en mesure de vous aider plus. – JeremyP