Wie werden Systembefehle wie ls erstellt?

19

Ich habe einige Zweifel bezüglich * nix.

  • Ich weiß nicht, um welche Art von ausführbarer Datei es sich handelt ls, ob es sich um eine .sh- oder .ksh-Datei oder um eine andere Art von ausführbarer Systemdatei handelt. Was ist das?

  • Als ich versuchte zu sehen, wie der Quellcode eines lsBefehls aussieht, zeigte er etwas Unlesbares, welche Methode * nix verwendet, um diese Art von unlesbaren Dateien zu erstellen, und kann ich meine Dateien diesen Dateien ähnlich machen (wie ls- unlesbar).

Jeyanthinath
quelle
4
Ich denke, es hängt mehr mit der obigen URL zusammen als mit einem Dup.
slm

Antworten:

31

Mit dem fileBefehl und dem typeBefehl können Sie die Art einer ausführbaren Datei in Unix bestimmen .

Art

So typebestimmen Sie den Speicherort einer ausführbaren Datei auf der Festplatte:

$ type -a ls
ls is /usr/bin/ls
ls is /bin/ls

So weiß ich jetzt, dass lssich das hier auf meinem System an 2 Orten befindet: /usr/bin/ls& /bin/ls. Wenn ich mir die ausführbaren Dateien ansehe, sehe ich, dass sie identisch sind:

$ ls -l /usr/bin/ls /bin/ls
-rwxr-xr-x. 1 root root 120232 Jan 20 05:11 /bin/ls
-rwxr-xr-x. 1 root root 120232 Jan 20 05:11 /usr/bin/ls

HINWEIS: Mit cmpoder können Sie bestätigen, dass sie über ihre Größe hinaus identisch sind diff.

mit diff
$ diff -s /usr/bin/ls /bin/ls
Files /usr/bin/ls and /bin/ls are identical
mit cmp
$ cmp /usr/bin/ls /bin/ls
$ 

Datei verwenden

Wenn ich sie mit dem fileBefehl abfrage:

$ file /usr/bin/ls /bin/ls
/usr/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x303f40e1c9349c4ec83e1f99c511640d48e3670f, stripped
/bin/ls:     ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x303f40e1c9349c4ec83e1f99c511640d48e3670f, stripped

Dies wären also tatsächliche physische Programme, die aus C / C ++ kompiliert wurden. Wenn es sich um Shell-Skripte handelte, würden sie in der Regel folgendermaßen dargestellt file:

$ file somescript.bash 
somescript.bash: POSIX shell script, ASCII text executable

Was ist ELF?

ELF ist ein Dateiformat , es ist die Ausgabe eines Compilers wie gcc, der zum Kompilieren von C / C ++ - Programmen wie verwendet wird ls.

Beim Computing ist das ausführbare und verknüpfbare Format (ELF, ehemals Extensible Linking Format) ein gängiges Standarddateiformat für ausführbare Dateien, Objektcode, gemeinsam genutzte Bibliotheken und Core-Dumps.

Der Dateiname hat normalerweise eine der folgenden Erweiterungen: none, .o, .so, .elf, .prx, .puff, .bin

slm
quelle
@ lgeorget - In diesen Fragen und Antworten finden Sie Tipps zur Verwendung von type vs. which: unix.stackexchange.com/questions/85249/… . Im Allgemeinen ist es am besten, nur dort zu verwenden, typewo Sie in Versuchung sind, whichoder zu verwenden whereis.
SLM
3
Für GNU-Tools ist der Quellcode frei verfügbar. Beginnen Sie Ihre Suche unter gnu.org/software
glenn jackman
Für den identischen Test sollten Sie wirklich so etwas wie md5sumoder verwenden sha1sumund nicht nur Dateigrößen und -zeiten überprüfen.
Bob
@ Bob - Diese identischen Dateien hatten nichts mit dem Q zu tun, also zeigte ich eine einfache Methode. Zum Vergleichen der Dateien hätte ich ein passenderes Tool wie cmp verwendet, das zum Vergleichen von Binärdateien gedacht ist. Wenn Sie auch nachsehen, von welchem ​​Paket sie bereitgestellt werden, können Sie feststellen, ob sie verwandt sind oder nicht. Sie sind beide Teil von coreutils-8.21-13.fc19.x86_64und ich weiß, dass sie seit 20 Jahren mit Red Hat-Releases identisch sind.
SLM
@Bob - siehe Updates für Beispiele zum Vergleichen von Dateien.
SLM
9

Es ist eine ausführbare Binärdatei (kompiliert in Maschinencode, wie der Großteil des Systems). Shell-Skripte sind eher wie "Kleber", um Teile zusammenzufügen, um schnell und flexibel Lösungen aus vorhandenen Dingen zu erstellen. Das ist die Kraft von * nix.

Sie benötigen den Quellcode (c, manchmal c ++, sind die gebräuchlichsten Sprachen auf * nix), nicht nur die kompilierte ausführbare Datei. Da es sich um Open Source handelt, können Sie den Code für alles aus Online-Repositorys abrufen (Kerndienstprogramme stammen normalerweise aus dem Gnu-Projekt). Es ist jedoch etwas knifflig, wenn Sie nicht wissen, wie man Git oder andere Versionsverfolgungssysteme verwendet.

Hier ist die ls.c-Datei, falls sie hilft: http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c

orion
quelle
Oh und um die Frage zu klären, wie man Binäranwendungen erstellt: Wählen Sie aus unzähligen Programmiersprachen (außer einigen, die interpretiert oder teilweise interpretiert werden, wie Python, Java, Javascript, ..., die traditionell keine eigenständige ausführbare Datei produzieren) Binärdatei). Dann lernen Sie, diese Sprache zu benutzen und zu kompilieren.
Orion