Как bash делает исполняемый файл?

325
StatGenGeek

Я знаю, что когда я запускаю команду

chmod +x filename

bash сделает мой файл исполняемым. Что именно происходит с архитектурой файла, чтобы изменить его на исполняемый файл? т.е. как ядро ​​узнает, что этот файл исполняемый?

Просто пытаюсь тренировать мои ботанические мышцы.

0

2 ответа на вопрос

6
grawity

«Архитектура» файла не меняется - вам нужно убедиться, что он имеет правильный формат. Таким образом, файл уже должен быть действительным двоичным файлом ELF, или сценарием с действительным #!заголовком, или чем-то еще, что распознает ваше конкретное ядро ​​(например, a.out или MZ / PE).

Для chmodэтого достаточно установить бит в разрешениях файла, сообщая ядру, что пользователю разрешено выполнять этот файл. Он может действовать как небольшой защитный барьер, а также предотвращать определенные виды аварий. (Обратите внимание, что +xздесь это сокращенное ugo+xобозначение; это бит разрешения, такой же, как чтение / запись.)

Если вы установите + x для файла, который ядро ​​не распознает, он просто вернет код ошибки из execсистемного вызова. (Обратите внимание, что некоторые оболочки имеют специальную обработку для этого - если ядро ​​сообщило о «нераспознанном формате», оболочка попытается внутренне интерпретировать файл как скрипт, так как именно так работали сценарии оболочки до того, как #!был изобретен .)

«Если вы установите` + x` для файла, который ядро ​​не распознает, он просто вернет код ошибки из системного вызова `exec`" - это не очевидно, когда возвращается эта ошибка. Это когда вы пытаетесь выполнить, а не когда вы `chmod`; право? Kamil Maciorowski 7 лет назад 0
Ну, это не может относиться к выполнению команды 'chmod', так как это происходит задолго до того, как что-то связано с режимом (в любом случае фактической операцией ядра является chmod _syscall_). Так что оставляет (попытка) выполнения рассматриваемого файла. grawity 7 лет назад 0
Это имеет смысл, спасибо. Извините за плохо сформулированный вопрос. Я не мог придумать, как еще описать то, что я спрашивал. «установить бит в разрешениях файла» - вот что я хотел знать. StatGenGeek 7 лет назад 0
0
TOOGAM

Содержимое файла не меняется вообще. Файловые системы, разработанные для типичного Unix, будут поддерживать хранение информации о каждом файле. Это часто называют метаданными файла.

Вот почему вы не получите аналогичные результаты с некоторыми файловыми системами. А именно, FAT не имеет встроенного пространства, предназначенного для хранения данных, связанных с разрешениями Unix, и Unix обычно обходит это, используя специальный параметр при монтировании такого тома файловой системы. Таким образом, обычно все файлы на диске FAT имеют те же разрешения, что и при монтировании. (Я ожидаю аналогичного поведения для других файловых систем, таких как ISO9660, хотя это, вероятно, обычно невозможно записать.) На томах, смонтированных таким образом, использование chmod +xфактически не приведет к изменению чего-либо.

Короче говоря, ядро ​​знает об этом, проверяя драйвер файловой системы. Для типичных файловых систем, разработанных для Unix, этот драйвер поддерживает чтение мест, где хранятся разрешения в стиле Unix.

CHMOD просто меняет эти места на диске.

Я действительно не согласен с [ответом grawity] (https://superuser.com/a/1190394/401839) вообще. Я просто думаю, что ответ Гравити больше фокусируется на том, как ядро ​​интерпретирует данные файла после того, как операционная система определит, что файл должен рассматриваться как исполняемый файл, в то время как мой ответ больше фокусируется на том, что делает chmod. Поэтому я отвечаю на вопросы «Как работает bash» (заглавный вопрос) ... и «Что ... исполняемый файл», в то время как я оставляю ответ Гравити на вопрос «Как работает ядро» ... TOOGAM 7 лет назад 0