Как запускаются исполняемые файлы в Linux

25 ноября, 2010 Рубрики: Linux, основы Linux

исполняемые файлы в linuxДоброго времени, читатели моих постов о Linux!

В сегодняшней статье расскажу о том, как работают исполняемые файлы. Из моей прошлой статьи о атрибутах доступа к файлам в Linux думаю Вам будет известно, что такое полномочия выполнения (исполнения).  Данное право можно установить для любого файла. Исходя из этого, можно задать вопрос: неужели любой файл можно сделать программой? Да, так  и есть. В Linux является ли файл исполняемым или нет, определяется не по его расширению, как в Windows (понятие расширение файла отсутствует в файловой системе Linux), а по правам доступа. Если у файла установлено право x (выполнения), его можно запустить на выполнение.

Что происходит, когда мы пытаемся выполнить файл? Мы пытаемся набрать имя и, может быть, путь к файлу, который пытаемся запустить в командной строке и нажимаем Enter. (если файл расположен в текущем каталоге, то необходимо набирать ./program). В первую очередь, оболочка проверяет, а имеет ли пользователь права на исполнение этого файла? Если имеет, тогда система смотрит, а это исполняемый бинарный файл? В Linux все исполняемые бинарные файлы в начале файла имеют заголовок .ELF (Executable and Linkable Format) (напомню, что в Windows в исполняемых файлах заголовок – MZ). Если это исполняемый бинарный файл, тогда, согласно его заголовку, происходит распределение оперативной памяти, и управление передается программе.

Если файл не бинарный, тогда считается, что это текстовый файл – скрипт или сценарий. В первых двух байтах сценария обнаруживается последовательность символов #!. Если символы “#!” присутствуют, тогда всю первую строку сценария, начиная с третьего байта, ядро воспримет как команду обработки. Исполнение сценария, содержащего указанную последовательность приведет к запуску указанной после ” #!” команды, последним параметром которой будет имя самого файла сценария. Например, для файлов, написанных на языке shell script, первая строка будет выглядеть так:
#! /bin/sh

Для программ, написанных на perl, так:
#! /bin/perl

Таким образом, можно написать сценарий для любой программы, пример:

[bash@localhost ]$ cat > to.sort
 #!/bin/sort
 some
 unsorted
 lines
[bash@localhost ]$ chmod +x to.sort
[bash@localhost ]$ ./to.sort
 #!/bin/sort
 lines
 some
 unsorted

Во всех интерпретируемых языках программирования # — это символ комментария. То есть первая строка считается комментарием и программой не выполняется. При указании интерпретатора можно писать аргументы командной строки. Например:
#! /bin/sed -f command

Если в файле в первой строке нет этих символов, тогда все зависит о программы оболочки, в которой запускается программа. Если используется bash, то он считает, что файл содержит программу, написанную на языке shell script, запускает копию себя любимого и передает этой копии файл на интерпретацию. Если в файле действительно находится программа, то он ее выполняет. Если в файле находится «Война и мир» графа Льва Николаевича Толстого, то на экране появляются сообщения об ошибках shell script: «Я не знаю оператор Пьер Безухов. Наташа Ростова — это оператор или функция?»

Если Вы желаете выполнить exe-файл, который запускали в Windows, необходимо воспользоваться таким пакетом, как Wine. Но это уже совсем другая тема. :)

С Уважением, Mc.Sim!

P.S. Спасибо http://www.kryukov.biz/ за исходный текст.




Теги: , , ,

8 комментариев к “Как запускаются исполняемые файлы в Linux”

  1. Анатолий
    12 декабря, 2012 at 14:28
    1

    Пожалуйста, а какой интерфейс загрузки плагинов big endian в Linux?
    Спасибо, Анатолий

    • 19 декабря, 2012 at 00:55
      2

      Анатолий, к сожалению в С знаю не то чтобы мало – почти ничего )
      Вряд ли подскажу что-то дельное или больше того что есть в google…

  2. Игорь
    23 ноября, 2014 at 23:40
    3

    Здравствуйте.
    Я не могу запустить исполняемый файл т.к. отсутствует специальное ПО для файлов типа сценарий оболочки UNIX (application/x-shellscript). Не подскажете, где его найти?

    • 18 декабря, 2014 at 15:12
      4

      Каким образом вы производите запуск сценария?

  3. Владимир
    22 ноября, 2017 at 08:34
    5

    У Вас в статье допущена неточность. Неточность заключается в отсутствие точки перед ELF в строке

    в начале файла имеют заголовок ELF

    . Сигнатура файла состоит из 4 байт. Первым байтом идет точка, а потом ELF.

    • 10 февраля, 2019 at 10:05
      6

      Спасибо за дополнение.
      Поправил.

  4. Андрей
    20 ноября, 2019 at 02:48
    7

    А чем можно посмотреть внутреннюю информацию бинарного исполняемого файла? Например, архитектуру, версию, время выпуска.

    • 14 января, 2020 at 22:07
      8

      Например так
      file /bin/bash
      /bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=b533e7ee1f1588ddb63ceeea8554c15f42c75966, stripped

Написать комментарий