Jak tworzone są polecenia systemowe, takie jak ls?


19

Mam wątpliwości dotyczące * nix.

  • Nie wiem ls, jaki jest typ pliku wykonywalnego , czy to jest .sh, .ksh, czy jakikolwiek inny systemowy plik wykonywalny, jeśli tak jest, co to jest?

  • kiedy próbowałem zobaczyć ls, jak wygląda kod źródłowy polecenia, pokazuje coś nieczytelnego, jakiej metody używa * nix do tworzenia tego rodzaju nieczytelnych plików i czy mogę sprawić, by moje pliki były podobne do tych plików (np. ls- nieczytelne).



4
Myślę, że to bardziej związane z powyższym adresem URL niż duplikatem.
slm

Odpowiedzi:


31

Możesz określić charakter pliku wykonywalnego w Uniksie za pomocą filepolecenia i typepolecenia.

rodzaj

Służy typedo określania lokalizacji pliku wykonywalnego na dysku w następujący sposób:

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

Teraz wiem, że lsznajduje się tutaj w moim systemie w 2 lokalizacjach: /usr/bin/lsi /bin/ls. Patrząc na te pliki wykonywalne, widzę, że są identyczne:

$ 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

UWAGA: Możesz potwierdzić, że są identyczne poza swoimi rozmiarami, używając cmplub diff.

z różnicą
$ diff -s /usr/bin/ls /bin/ls
Files /usr/bin/ls and /bin/ls are identical
z cmp
$ cmp /usr/bin/ls /bin/ls
$ 

Korzystanie z pliku

Jeśli zapytam je za pomocą filepolecenia:

$ 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

Byłyby to więc rzeczywiste programy fizyczne skompilowane z C / C ++. Gdyby były to skrypty powłoki, zwykle prezentowałyby się tak file:

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

Co to jest ELF?

ELF jest formatem pliku , jest to wynik kompilatora takiego jak gcc, który jest używany do kompilacji programów C / C ++ takich jak ls.

W informatyce format wykonywalny i możliwy do połączenia (ELF, wcześniej nazywany formatem rozszerzalnego łączenia) jest powszechnym standardowym formatem plików wykonywalnych, kodu obiektowego, bibliotek współdzielonych i zrzutów rdzenia.

Zwykle będzie miał jedno z następujących rozszerzeń w nazwie pliku: none, .o, .so, .elf, .prx, .puff, .bin


@lgeorget - Zobacz tę Q & A dla porady na temat używania typu Vs. których: unix.stackexchange.com/questions/85249/... . Zasadniczo najlepiej jest używać typewszędzie tam, gdzie masz ochotę użyć whichlub whereis.
slm

3
Dodatkowo, w przypadku narzędzi GNU, kod źródłowy jest dostępny bezpłatnie, rozpocznij wyszukiwanie na gnu.org/software
glenn jackman

Do identycznego testu, to naprawdę powinno być coś jak przy użyciu md5sumlub sha1sum, nie tylko sprawdzenie rozmiary i czasy plików.
Bob

@Bob - Te identyczne pliki nie miały nic wspólnego z Q, więc pokazałem prostą metodę. Do porównania plików użyłbym bardziej trafnego narzędzia, takiego jak cmp, które służy do porównywania plików binarnych. Również sprawdzenie, jaki pakiet zapewnia, wskazuje, czy są powiązane, czy nie. Obaj są częścią coreutils-8.21-13.fc19.x86_64i po prostu wiem, że są identyczni z 20 lat zajmowania się wydaniami Red Hat.
slm

@Bob - zobacz aktualizacje przykładów porównujących pliki.
slm

9

Jest to binarny plik wykonywalny (skompilowany do kodu maszynowego, jak większość systemu). Skrypty powłoki są bardziej jak „klej” do łączenia części w celu szybkiego i elastycznego tworzenia rozwiązań z istniejących elementów. To jest moc * nix.

Potrzebujesz kodu źródłowego (c, czasem c ++, są najczęstszymi językami w * nix), a nie tylko skompilowanego pliku wykonywalnego. Ponieważ jest to oprogramowanie typu open source, możesz uzyskać kod do wszystkiego z repozytoriów online (podstawowe narzędzia są zwykle z projektu GNU). Jest to jednak trochę trudne, jeśli nie wiesz, jak korzystać z git lub innych systemów śledzenia wersji.

Oto plik ls.c, jeśli pomaga: http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c


Aha, aby wyjaśnić pytanie, jak tworzyć aplikacje binarne: wybieraj spośród niezliczonej liczby języków programowania (z wyjątkiem kilku, które są interpretowane lub częściowo interpretowane, takich jak python, java, javascript, ... które tradycyjnie nie dają samodzielnego pliku wykonywalnego plik binarny). Następnie naucz się używać tego języka i jak go skompilować.
Orion
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.