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

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

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

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

Что происходит, когда мы пытаемся выполнить файл? Мы пытаемся набрать имя и, может быть, путь к файлу, который пытаемся запустить в командной строке и нажимаем Enter. (если файл расположен в текущем каталоге, то необходимо набирать ./program). В первую очередь, оболочка проверяет, а имеет ли пользователь права на исполнение этого файла? Если имеет, тогда система смотрит, а это исполняемый бинарный файл? В Linux все исполняемые бинарные файлы в начале файла имеют заголовок ELF. (напомню, что в 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/ за исходный текст.




Теги: , , ,

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

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

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

    • Декабрь 19th, 2012 at 00:55
      2

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

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

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

    • Декабрь 18th, 2014 at 15:12
      4

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

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