web-dev-qa-db-fra.com

Comment les programmes du répertoire / bin sont-ils compilés dans un format non lisible?

J'ai remarqué que la plupart de mes commandes/programmes du répertoire/bin sont compilés. Je souhaite dupliquer ce format de code non lisible moi-même. Quelqu'un peut-il me dire pourquoi et/ou comment ces programmes fonctionnent de cette manière?

[bonus timbre vert]: N'y a-t-il pas une commande bash pour imprimer tout le texte "lisible par l'homme" à partir d'un fichier?

7
surgemcgee

Les commandes/programmes dans /bin ne sont pas non lisibles, mais ils sont, comme vous le dites, compilés. Cela signifie qu'ils ont été initialement écrits en C (ou dans un autre langage de programmation) et ont été compilés en code machine (binaire) afin que le processeur puisse exécuter le code. Pour faire la même chose, écrivez simplement le programme dont vous avez besoin en C et exécutez la commande gcc pour produire un fichier exécutable.

Pour imprimer un texte lisible par l'homme dans un fichier, utilisez strings < /bin/file,

14
StarNamer

Introduction

Lorsqu'un programme est compilé à partir d'un code source dit C ou C++, un compilateur tel que gcc (voir ci-dessous) traduit ce code dans le langage binaire natif de la CPU, afin que le programme puisse être exécuté. Ainsi le matériel lisible par l'homme (code source) est transformé en un format non lisible par l'homme (code binaire lisible par une machine).

Binaires et système de fichiers

Si vous entrez echo $PATH, vous verrez l'emplacement de tous les exécutables du système, binaires et scripts compilés:

/home/mike/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Dans la hiérarchie du système de fichiers, des outils système clés tels que cat et getty sont présents dans /bin et /sbin, ainsi que d'autres outils tels que dpkg et chroot sont présents dans /usr/bin et /usr/sbin respectivement. Si vous compilez un programme en téléchargeant le code source, en configurant la construction et en l'installant, votre programme devrait par défaut aller dans /usr/local/bin et ses autres fichiers dans la hiérarchie /usr/local.

Compilateurs

L'un des outils les plus connus utilisé pour compiler les fichiers binaires est gcc, connu sous le nom de GNU Collection de compilateur et plus tôt en tant que GNU C compilateur; la version livrée avec Ubuntu 12.04 est gcc 4.6.3. Comme il est noté dans le GNUofficiel _ manual ,

GCC is an integrated distribution of compilers for several major programming 
languages. These languages currently include C, C++, Objective-C, Objective-C++, 
Java, Fortran, Ada, and Go.

Compiler un binaire

Les trois commandes ./configure, make et Sudo make install (ou Sudo checkinstall) sont souvent utilisées ensemble pour compiler un programme.

Lancer ./configure, entre autres, vérifie la version de gcc installée et prépare l'environnement de construction. La makefile est l’un des éléments les plus importants générés par l’exécution de ./configure car elle dirige la construction lorsque make est exécuté. Le GNU make manual détaille le processus en profondeur. En résumé, les règles de la variable makefile déterminent l’objectif principal (créer un exécutable) afin que les fichiers du code source .c soient transformés en fichiers compilés (fichiers .o) afin de: générer le fichier exécutable cible.

Ressources

Ces guides de compilation Ubuntu sont deux excellentes ressources here et here , ==, qui contiennent des informations et des conseils utiles à ceux qui débutent en compilation. D'autres ressources telles que le manuel GNU gcc et le manuel make que j'ai déjà mentionnées. Pour plus d'informations sur le C et la création d'un petit programme simple, voir le chapitre 22 de Rute et le chapitre 24 de la Ligne de commande Linux .

12
user76204

ne option: Si vous voulez voir le contenu des programmes compilés, utilisez un outil comme objdump pour vider le code de l'objet, par exemple:

objdump -d /bin/ls | less
1
Colin Ian King

Pour compiler des programmes Bash en fichiers binaires (je suppose que vous vous interrogez sur Bash parce que votre question est marquée bash), vous devez utiliser le programme Shc. Vous pouvez le télécharger à partir de ici . Après avoir décompressé l'archive, compilez et installez shc avec cd shc-3.8.9;make;Sudo make install. Maintenant, exécutez shc -f filename, où nom_fichier est le chemin du fichier que vous souhaitez convertir en un code non lisible. Shc créera deux fichiers: nomfichier.x.c et nomfichier.x . Vous pouvez vous débarrasser de nomfichier.x.c , nomfichier est le fichier non lisible.

1
Aaron Hill

Il y a 10 sortes de personnes différentes. Devinez que vous appartenez au deuxième groupe ...: P

Le répertoire bin contient uniquement des fichiers binaires (Binaires = Programmes dans le code binaire, uniquement 1 et 0)

Ils sont compilés pour être lisibles par une machine. Les machines connaissent 1 et 0 ou encore et encore, vrai ou faux, rien d’autre.

Ceci est fait par un compilateur. Il y a plus d'un compilateur. Je peux penser au compilateur Gnucc, ou au compilateur Java, ou à un compilateur Delphi ... Différents compilateurs pour différents langages de programmation.

Essayez grep. Bonne chance!

0
mondjunge