Разница между разделяемой библиотекой (.so) исполняемым файлом Linux без расширения? - PullRequest
1 голос
/ 16 июня 2020

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

По моему опыту, большинство двоичных исполняемых файлов Linux не имеют расширение файла; например, большинство файлов в каталоге /bin в системах Linux не имеют расширения.

С другой стороны, большинство файлов в каталоге /lib имеют .so в своем расширении, а также имеют разрешения на выполнение. Попытка выполнить файл .so напрямую обычно приводит к сбою сегмента или некоторой ошибке, что имеет смысл, поскольку разделяемые библиотеки обычно предназначены для динамического связывания. Но, насколько я понимаю, если файл .so имеет точку входа main(), то вы можете запустить его как исполняемый , как обычный исполняемый файл (т.е. файл без расширения).

Мои вопросы:

  1. В чем разница между общей библиотекой (расширение .so) и исполняемым файлом (расширение [none])? Просто ли определена точка входа main()?
  2. В C ++ есть ли разница (т.е. флаги, передаваемые компилятору) в компиляции кода в общую библиотеку (расширение .so) и компиляции кода в a Linux исполняемый файл ([none] расширение).

Изменить: В этом вопросе говорится о том, как создать файл .so с помощью командной строки g cc, но не Не идентифицируют различия между сборкой .so и обычного исполняемого файла.

1 Ответ

1 голос
/ 16 июня 2020
  1. Одно из основных отличий заключается в том, что разделяемая библиотека не имеет функции main(). Он также содержит независимый от позиции код, который может быть или не подходить для исполняемых файлов. Если вы делаете помещаете функцию main() в библиотеку, вам все равно нужно связать ее с нормальным объектным файлом (содержащим no main() функцию) .
  2. Да. Чтобы создать общую библиотеку, вы компилируете свой код с помощью -fpic или -fPIC, чтобы сгенерировать независимый от позиции код ( PI C), подходящий для использования в общей библиотеке.

Ничто не мешает вам создать исполняемый файл с именем myexe.so, но его нельзя использовать как разделяемую библиотеку.

...