Wie werden die Programme im Verzeichnis / bin in ein nicht lesbares Format kompiliert?

7

Ich habe festgestellt, dass die meisten meiner Befehle / Programme im Verzeichnis / bin kompiliert sind. Ich möchte dieses nicht lesbare Codeformat selbst duplizieren. Kann mir jemand sagen warum und / oder wie diese Programme so kommen?

[Bonus für grüne Stempel]: Gibt es nicht einen Bash-Befehl, um den gesamten "von Menschen lesbaren" Text aus einer Datei zu drucken?

surgemcgee
quelle
1
Beachten Sie, dass nicht alle Befehle kompilierte Binärdateien sind. Ihre /binund /usr/bin/Verzeichnisse enthalten auch Befehle , die in Skriptsprachen geschrieben werden , wie sh, bash, perl, python, etc ... Versuchen Sie , file /bin/* | lessin einem Terminal.
Geirha

Antworten:

14

Die Befehle / Programme in /binsind nicht lesbar , aber sie werden, wie Sie sagen, kompiliert. Dies bedeutet, dass sie ursprünglich in C (oder einer anderen Programmiersprache) geschrieben und in Maschinencode (binär) kompiliert wurden, damit der Prozessor den Code ausführen kann. Um dasselbe zu tun, schreiben Sie einfach das gewünschte Programm in C und führen Sie den gccBefehl aus, um eine ausführbare Datei zu erstellen.

Verwenden Sie zum Drucken von lesbarem Text in einer Datei Folgendes strings < /bin/file:

StarNamer
quelle
12

Einführung

Wenn ein Programm beispielsweise aus C- oder C ++ - Quellcode kompiliert wird, übersetzt ein Compiler wie gcc(siehe unten) diesen Code in die native Binärsprache der CPU, damit das Programm ausgeführt werden kann. Somit wird menschlich lesbares Material (Quellcode) in ein nicht menschlich lesbares Format (maschinenlesbarer Binärcode) umgewandelt.

Binärdateien und das Dateisystem

Wenn Sie eingeben echo $PATH, sehen Sie einen Speicherort aller ausführbaren Dateien auf dem System, sowohl kompilierte Binärdateien als auch Skripte:

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

In den Dateisystem - Hierarchieschlüssel Systemprogramme wie catund getty vorhanden sind , in /binund /sbinbzw. und anderen Werkzeugen , wie beispielsweise dpkgund chrootvorhanden sind in , /usr/binund /usr/sbinauf. Wenn Sie ein Programm kompilieren, indem Sie den Quellcode herunterladen, den Build konfigurieren und installieren, sollte Ihr Programm standardmäßig in /usr/local/bindie anderen Dateien in der /usr/localHierarchie aufgenommen werden.

Compiler

Wahrscheinlich ist eines der bekanntesten Tools zum Kompilieren von Binärdateien das gcc, das als GNU Compiler Collection und früher als GNU C Compiler bekannt ist. Die mit Ubuntu 12.04 gelieferte Version ist gcc 4.6.3. Wie im offiziellen GNU- Handbuch vermerkt ,

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.

Eine Binärdatei kompilieren

Die drei Befehle ./configure, makeund sudo make install(oder sudo checkinstall) werden oft gemeinsam verwendet , um ein Programm zu kompilieren.

Beim Ausführen ./configurewird unter anderem die gccinstallierte Version überprüft und die Build-Umgebung vorbereitet. Dies makefileist eines der wichtigsten Dinge, die beim Ausführen generiert werden, ./configureda es den Build beim makeAusführen steuert . Die GNU macht manuelle Details des Prozesses in großer Tiefe. Zusammenfassend makefilebestimmen die Regeln im Hauptziel (Erstellen einer ausführbaren Datei), sodass die Quellcodedateien .czu kompilierten Dateien ( .oDateien) verarbeitet werden, um die ausführbare Zieldatei zu generieren.

Ressourcen

Zwei großartige Ressourcen sind diese Ubuntu-Kompilierungshandbücher hier und hier , die einige großartige Ratschläge und Informationen für diejenigen enthalten, die neu in der Kompilierung sind. Andere Ressourcen wie das GNU- gccHandbuch und das makeHandbuch, das ich bereits erwähnt habe. Weitere Informationen zu C und zum Erstellen eines einfachen kleinen C-Programms finden Sie in Kapitel 22 von Rute und Kapitel 24 der Linux-Befehlszeile .


quelle
1

Um Bash-Programme in Binärdateien zu kompilieren (ich gehe davon aus, dass Sie nach Bash fragen, weil Ihre Frage mit bash markiert ist), sollten Sie das Programm Shc verwenden. Sie können es hier herunterladen . Nachdem Sie das Archiv entpackt haben, kompilieren und installieren Sie shc mit cd shc-3.8.9;make;sudo make install. Führen Sie nun aus shc -f filename, wobei Dateiname der Pfad zu der Datei ist, die Sie in ein nicht lesbares Codeformat umwandeln möchten. Shc erstellt zwei Dateien: Dateiname.xc und Dateiname.x . Sie können filename.xc entfernen , Dateiname ist die nicht lesbare Datei.

Aaron Hill
quelle
Es macht nicht viel Sinn, Bash-Skripte zu kompilieren. mywiki.wooledge.org/GreyCat/CompilingBad
geirha
1

Eine Option : Wenn Sie sehen möchten, was in den kompilierten Programmen enthalten ist, verwenden Sie ein Tool wie objdump, um den Objektcode auszugeben, zum Beispiel:

objdump -d /bin/ls | less
Colin Ian King
quelle
0

Es gibt 10 verschiedene Arten von Menschen. Vermutlich gehören Sie zur zweiten Gruppe ...: P.

Es gibt nur Binärdateien im bin-Verzeichnis (Binaries = Programme im Binärcode, nur 1 und 0)

Sie sind so kompiliert, dass sie maschinenlesbar sind. Maschinen kennen 1 und 0 oder ein und aus, wahr oder falsch, sonst nichts.

Dies wird von einem Compiler durchgeführt. Es gibt mehr als einen Compiler. Ich kann mir den Gnucc-Compiler oder den Java-Compiler oder einen Delphi-Compiler vorstellen ... Verschiedene Compiler für verschiedene Programmiersprachen.

Versuchen Sie es mit grep. Viel Glück!

Mondjunge
quelle
Nicht alle Befehle sind kompilierte Binärdateien ...
Geirha
Richtig, es gibt auch Bash-Skripte und Symlinks im bin-Verzeichnis. Es tut uns leid.
Mondjunge