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

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

Ошибки EXE происходят по ряду причин, но в основном из-за проблем с исполняемыми файлами или EXE-файлами. EXE — это расширение приложения в Windows. Подобно другим типам файлов, встроенных в вашу компьютерную систему, EXE-файлы могут время от времени входить в ошибки. Некоторые ошибки являются общими, но некоторые из них трудно устранить и устранить.

Программное обеспечение, которое вы используете, и приложения, необходимые для работы операционной системой, используют EXE-файлы для выполнения своих задач. В этой записке ПК содержит много EXE-файлов, возможно, тысячи, что позволяет с большой вероятностью иметь место ошибка. Иногда ошибки EXE могут повлиять на вашу компьютерную систему. Программы могут перестать работать, или ваш компьютер может замедлить работу. Хуже того, EXE-ошибка может помешать вам получить доступ к вашему компьютеру и войти в него.

Некоторые проблемы, которые могут вызвать ошибки EXE:

  • Вирусы, вредоносные программы и программы-шпионы
  • Неверные, поврежденные, поврежденные или устаревшие файлы или драйверы
  • Конфликт записей в системном реестре Windows
  • Конфликты приложений

Ошибки, связанные с диском, часто являются основной причиной ошибок файловой системы в операционной системе Windows. Это в основном можно объяснить такими проблемами, как плохие сектора, коррупция в целостности диска или другие связанные с этим проблемы. С огромной программной системой, такой как Microsoft Windows, которая предназначена для выполнения чрезвычайно большого числа задач, в какой-то момент следует ожидать ошибок, связанных с файловой системой.

Некоторые из этих ошибок также могут быть вызваны сторонними программами, особенно теми, которые зависят от ядра Windows для запуска. Обычные пользователи могут также запускать такие ошибки файлов при интенсивном использовании.

Создание файла

Давайте создадим файл — текстовый документ. Щелкаем на свободном месте папки (в данном случае оно у нас все свободно) левой кнопкой мышки, в меню выбираем «Создать», в следующем — «Текстовый документ».  Так же создается документ – имя по умолчанию «Новый текстовый документ». Меняем на «Важные телефоны», и нажимаем клавишу «Enter» (или просто щелкаем мышкой по свободному месту в папке).
У нас создан новый файл, текстовый документ. Сейчас он пустой. Для того чтобы его открыть, делаем двойной щелчок левой кнопки мышки на файле. По умолчанию файл открывается в программе «Блокнот». Пишем необходимый нам текст. Если после того, как мы все написали, попытаться закрыть программу «Блокнот», появится окно предупреждение «Вы хотите сохранить изменения в файле »   – далее идет имя файла и путь, где он сохраняется. Если нажать «Сохранить», «Блокнот» – закрывается, данные сохраняются в наш файл.  Если выбрать пункт «Не сохранить» – программа закрывается, изменения не записываются. При выборе пункта «Отмена» – продолжается редактирование документа.
Что бы корректно закрыть программу «Блокнот» после завершения редактирования документа необходимо в левом верхнем углу окна нажать левую кнопку мышки на пункте меню «Файл» , в выпавшем подменю выбрать пункт «Сохранить». После этого «Выход».

Исполняемые файлы

В вопросах исполняемых файлов, то есть, если по простому, обычных программ, Ubuntu кардинально отличается от Windows. В Windows исполняемые файлы имеют расширение (в основном), а внутри представляют из себя нечитаемый набор байтов. А в Ubuntu исполняемым может быть даже текстовый файл. Сразу скажу, что — это программы для Windows и в Ubuntu они не работают без Wine (приложения для запуска исполняемых файлов Windows в Linux), но вообще говоря и в Wine они работают далеко не всегда.

Итак, что же такое исполняемый файл с точки зрения Ubuntu? Фактически это любой файл, который помечен, как исполняемый и который Ubuntu сможет запустить на выполнение. Означает это вот что: у каждого файла есть специальное свойство-переключатель, никак не зависящее ни от имени, ни от содержимого, отвечающее за исполняемость. Если файл помечен, как исполняемый, то вообще говоря он таковым и является, а если не помечен — то это обычный файл с данными и напрямую запустить его на выполнение нельзя. Другое дело, что не любой файл, помеченный как исполняемый, Ubuntu сможет выполнить, хотя в арсенале Ubuntu есть масса методов запуска файлов с совершенно различным содержимым.

Характерным примером необычных с первого взгляда исполняемых файлов Linux являются так называемые скрипты. Скрипты — это обычные текстовые файлы, содержащие набор инструкций для программы-интерпретатора, которая занимается собственно выполнением скриптов. Так вот, если на скрипте установлено свойство исполняемости, то это программа, которую можно запустить обычным образом, а если не установлено — то это всего лишь текстовый файл. То есть сделать файл исполняемым или же наоборот, убрать возможность его выполнения, можно изменением всего одного его свойства.

Мало того, на самом деле это магическое свойство-переключатель исполняемости является одним из трёх прав доступа, о которых я мельком упоминал в предыдущей статье. Я говорил, что у каждого файла есть три группы прав доступа — для пользователя-владельца, для группы-владельца и для всех остальных, каждая группа состоит в свою очередь из трёх прав: на чтение, модифицирование и выполнение. Так вот, право на выполнение и является тем самым волшебным переключателем исполняемости.

Из этого вытекает весьма забавное свойство: один и тот же файл может быть одновременно и исполняемым, и не исполняемым, допустим, если на его выполнение есть права только у пользователя-владельца. Тогда пользователь, которому принадлежит этот файл, сможет его запустить как программу, а для всех остальных он будет обычным файлом с данными.

Вот так всё на самом деле просто и красиво, надеюсь, вы осознали основную логику и не будете путаться при работе с исполняемыми файлами в Ubuntu.

Аудиофайлы

В случае с аудиофайлами также существует проблема с кодировками, только проявляется она в тегах. К сожалению, некоторые популярные Windows-программы редактирования тегов как и текстовые редакторы до сих пор используют устаревшую кодировку. Некоторые плееры Ubuntu поддерживают указание кодировки воспроизводимых файлов, однако гораздо предпочтительней обработать всю вашу медиатеку специальными программами, которые автоматически приведут все теги в нормальный вид, дабы в дальнейшем не было проблем. Самой популярной программой такого рода является EasyTag, она доступна в стандартных репозиториях, так что почти сразу после прочтения следующей статьи вы сможете ей воспользоваться.

Что же касается форматов, то Ubuntu поддерживает все существующие аудио-форматы, однако для воспроизведения некоторых требуются дополнительные кодеки. О том, как их поставить, я расскажу в одной из следующих статей.

Использование в других операционных системах

Формат PE также используется ReactOS, поскольку ReactOS предназначена для того, чтобы быть двоично совместимой с Windows на уровне кода. Кроме того, он исторически использовался многими другими операционными системами, включая SkyOS и BeOS R3. Однако и SkyOS, и BeOS в конечном счёте перешли на формат ELF.

Поскольку платформа разработки Mono намеревается быть двоично совместимой с Microsoft .NET, она использует тот же формат PE, что и в реализации Microsoft.

На платформе x86 в Unix-подобных операционных системах некоторые двоичные файлы Windows (в формате PE) могут быть выполнены с помощью Wine. HX DOS Extender также использует формат PE для собственных 32-разрядных двоичных файлов DOS, кроме того, может в некоторой степени выполнить существующие двоичные файлы Windows в DOS, действуя, таким образом, как Wine для DOS.

Mac OS X 10.5 имеет возможность загружать и интерпретировать PE-файлы, однако они не являются двоично совместимыми с Windows.

Что же такое расширение файла?

Фактически — это некая последовательность, добавляемых к имени файла символов, как правило, отделяемых от имени файла точкой. Стоит заметить, что расширение файла  не всегда видимо. Символы, установленные через точку после имени файла и говорящие о его расширении мы видим только в тех случаях, когда это позволяют настройки проводника, в котором отображаются сами файлы.
В большинстве же случаев, расширение файлов мы не видим. Но, тогда, о расширении говорит и визуализация его иконки. Дело в том, что, как для Пользователя, так и так и программ нашего компьютера расширение– служит неким маркером, подсказывающим о том, какой тип данных,  хранится в этом файле (сможет ли программа его прочитать). Разница определения лишь в том, что, если мы, в основном, определяем расширения файла по иконке визуально, отталкиваясь от того, что видим на мониторе, то программы, с которыми мы работаем, определяют это по расширению», тем самым символам после точки, которые не всегда видны нам.

Например! Если Вы возьмете любой видеофайл или музыку, ну, либо, например картинку, хранящейся на вашем компьютере и попробуете переименовать в любое имя, которое будет заканчиваться на «.doc» — открыть это файл, обычным способом (двойным щелчком левой кнопки мыши) –уже не получится. Ибо, переименованный файл, представим, что это было видео, уже имеющий расширение «.doc» — автоматически будет открываться при помощи программ текстовых редакторов, таких например, как  Microsoft World.
Так же, как мы привыкли определять тип файла визуально, программа,  после изменения нами «расширения, автоматически решит, что это тот файл, который должна открыть именно она.  Однако, файл с неправильным расширением открыть не получится, потому что потоки данных все ровно не синхронизируются из-за разности типов.

Опытные пользователи могут извлекать определенную пользу меняя расширения файлов в ту или иную форму для редактирования данных и возврата, в дальнейшем, в исходную форму, но, об этом подробнее в других статьях, посвященных непосредственно извлечением этой выгоды, такой как, например, вытаскиванием видео, которое Вы посмотрели через обычный браузер к себе на компьютер, для дальнейшего хранения и так далее.
.

Технические детали


Структура 32-разрядного PE-файла

Сигнатура

Первые 2 байта PE файла содержат сигнатуру 0x4D 0x5A — «MZ» (как наследник MZ-формата). Далее двойное слово по смещению 0x3C содержит адрес PE-заголовка. Последний начинается с сигнатуры 0x50 0x45 — «PE».

Структура

Файл PE состоит из нескольких заголовков и секций, которые указывают динамическому компоновщику, как отображать файл в память. Исполняемый образ состоит из нескольких различных областей (секций), каждая из которых требует различных прав доступа к памяти; таким образом, начало каждой секции должно быть выровнено по границе страницы. Например, обычно секция .text, которая содержит код программы, отображена как исполняемая/доступная только для чтения, а секция .data, содержащая глобальные переменные, отображена как неисполняемая/доступная для чтения и записи. Однако, чтобы не тратить впустую пространство на жёстком диске, различные секции на нём на границу страницы не выровнены. Часть работы динамического компоновщика состоит в том, чтобы отобразить каждую секцию в память отдельно и присвоить корректные права доступа получившимся областям согласно указаниям, содержащимся в заголовках.

Таблица импорта

Одна из известных секций — таблица адресов импорта (IAT — Import Address Table), которая используется в качестве таблицы поиска, когда приложение вызывает функцию из другого модуля. Это может быть сделано и в форме импорта по порядковому номеру функции (ordinal), и импорта по её имени. Поскольку скомпилированной программе неизвестно расположение библиотек, от которых она зависит, то требуется производить косвенный переход всякий раз, когда происходит вызов API-функции. Когда динамический компоновщик загружает модули и объединяет их, он записывает действительные адреса в область IAT так, чтобы они указали на ячейки памяти соответствующих библиотечных функций. Хотя это добавляет дополнительный переход внутри модуля, приводящий к потере производительности, это предоставляет ключевое преимущество: количество страниц памяти, которые должны быть скопированы загрузчиком при записи, минимизировано, что приводит к экономии памяти и дискового времени ввода-вывода. Если компилятору будет известно заранее, что вызов будет межмодульным (через атрибут dllimport), то он сможет произвести более оптимизированный код, который просто приводит к коду операции косвенного вызова.

Таблица экспорта

Таблица адресов экспорта (EAT — Export Address Table) нужна для того, чтобы один модуль (обычно это динамически загружаемая библиотека) мог указать другим модулям, какие функции они могут из него импортировать, и по каким адресам последние расположены.

Таблица перемещений

Файлы PE не содержат позиционно-независимого кода. Вместо этого они скомпилированы для предпочтительного базового адреса, и все адреса, генерируемые компилятором/компоновщиком, заранее фиксированы. Если PE-файл не может быть загружен по своему предпочтительному адресу (потому что он уже занят чем-то ещё), операционная система будет перебазировать его. Это включает в себя перевычисление каждого абсолютного адреса и изменение кода для того, чтобы использовать новые значения. Загрузчик делает это, сравнивая предпочтительный и фактический адреса загрузки, и вычисляя значение разности. Тогда для получения нового адреса ячейки памяти эта разность складывается с предпочтительным адресом. Базовые адреса перемещений хранятся в списке и при необходимости добавляются к существующей ячейке памяти. Полученный код является теперь отдельным по отношению к процессу и не является больше разделяемым, так что при таком способе теряются многие из преимуществ экономии памяти динамически загружаемых библиотек. Такой способ также значительно замедляет загрузку модуля. По этой причине следует избегать перебазирования везде, где это возможно; например, библиотеки, поставляемые Microsoft, имеют предварительно вычисленные неперекрывающиеся базовые адреса. В случае отсутствия необходимости перебазировании PE-файлы имеют преимущество очень эффективного кода, но при наличии перебазирования издержки в использовании памяти могут быть значительными. Это отличает формат PE от ELF, который использует полностью позиционно-независимый код и глобальную таблицу смещений, которая жертвует временем выполнения в пользу расходования памяти.

Инструкции

Инструкции (код) — это:

  • либо машинные инструкции, составленные из числа доступных исполнителю команд;
  • либо исходный код (сценарий, скрипт, псевдокод), записанный на одном из интерпретируемых языков программирования;
  • либо байт-код виртуальной машины.

Программа, записанная с помощью инструкций, предназначена для решения полезной задачи, например, для воспроизведения музыки или видео.

Обычно, инструкции предназначены для ограниченного набора исполнителей, например, только для процессоров архитектуры x86-64, или только для виртуальной машины Java. Кроме того, исполняемые файлы зачастую содержат вызовы библиотечных функций, в частности, вызовы функций ОС. Таким образом, исполняемым файлам может быть свойственна зависимость не только от архитектуры, но и от версий:

  • библиотек;
  • ядра ОС;
  • компонентов (модулей) ОС.

Исполняемый файл отличают от других файлов:

  • по имени файла (например, файл с расширением .exe или .bin содержит машинный код, .jar — байт-код виртуальной машины Java, .pyc — байт-код виртуальной машины Python);
  • по содержимому файла (по сигнатуре — уникальным последовательностям байт, содержащимся внутри файла и постоянных для файлов одного формата; по shebang «#!»);
  • по атрибутам файла в файловой системе (например, по биту «execute» в ОС, подобных UNIX).
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector