2 votes

Différence entre /usr/bin/strings et gstrings de binutils ?

Je tourne sous MacOS BigSur 11.6.5 (20G527) et j'ai installé binutils avec homebrew qui fournit une version gnu de strings .

Il produit des résultats différents pour le même fichier, par exemple /bin/ls

%> strings /bin/ls | head
I9H0
J8I9H8
H9J0
O8H9J8
I9H
J(I9H(
H9J
O(H9J(
I9H@
JHI9HH

%> gstrings /bin/ls | head
__PAGEZERO
__TEXT
__text
__TEXT
__stubs
__TEXT
__stub_helper
__TEXT
__const
__TEXT

Je me demande comment fonctionnent les mac strings ? Pourquoi les résultats sont-ils différents ?

3voto

Jan Steinman Points 299

Différentes versions de strings ont existé. La plupart d'entre eux recherchent simplement un certain nombre (quatre ou plus) de caractères ASCII imprimables et décident, sans contexte, qu'ils ont trouvé une "chaîne" lisible par l'homme. C'est ce qui semble se produire avec le programme strings commande.

GNU gstrings semble être beaucoup plus intelligent. Je n'ai pas gstrings installé, mais il semble utiliser une heuristique un peu plus intelligente que la simple recherche de caractères ASCII imprimables. (Il y a 40 ans, dans un cours de programmation en C que j'ai suivi, l'un de nos devoirs était d'écrire une meilleure version de strings . Ce n'était pas très difficile !)

Pour mieux comprendre l'écart, je vous suggère d'utiliser un autre utilitaire, hexdump .

hexdump -C /bin/ls vous montrera les codes hexadécimaux dans un tableau pour chaque octet du fichier, avec les interprétations ASCII à la fin de chaque ligne :

00000000  cf fa ed fe 07 00 00 01  03 00 00 00 02 00 00 00  |................|
00000010  13 00 00 00 10 07 00 00  85 00 20 00 00 00 00 00  |.......... .....|
00000020  19 00 00 00 48 00 00 00  5f 5f 50 41 47 45 5a 45  |....H...__PAGEZE|
00000030  52 4f 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |RO..............|
00000040  00 00 00 00 01 00 00 00  00 00 00 00 00 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000060  00 00 00 00 00 00 00 00  19 00 00 00 28 02 00 00  |............(...|
00000070  5f 5f 54 45 58 54 00 00  00 00 00 00 00 00 00 00  |__TEXT..........|
00000080  00 00 00 00 01 00 00 00  00 50 00 00 00 00 00 00  |.........P......|
00000090  00 00 00 00 00 00 00 00  00 50 00 00 00 00 00 00  |.........P......|

Comme vous pouvez le constater, les mêmes "vraies" chaînes de caractères lisibles par l'homme que celles présentées à droite se trouvent également dans le fichier gstrings de la production.

La réponse est donc simple : GNU strings fait un meilleur travail que la version par défaut de BSD strings .

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X