2015-11-27 3 views
2

Предположим, что динамические библиотеки отличаются от исполняемого эльфа только одной вещью: для начала выполнения нет точки входа. Лично мне удалось создать исполняемую общую библиотеку с простым кодом - я только что установил точку входа. Таким образом, это было почти так же, как и вызов ld-linux.so. Теперь, пожалуйста, не бросайте помидоры, но если я здесь, почему мы не можем связать два исполняемых файла вместе - если исполняемые файлы и файлы общих объектов имеют одинаковый формат файла и очень мало различий? Почему у нас есть do есть исполняемые файлы, но не только файлы с общими объектами? И следующий вопрос: почему мы не можем просто предоставить исполняемые библиотеки вместо исполняемых файлов? Пожалуйста, объясните как можно больше.Общие библиотеки vs executable

+0

Целью связывания является разрешение неразрешенных символов и создание автономного объекта. Какова была бы цель связать два автономных исполняемых файла вместе? Скорее всего, это вызовет конфликты, поскольку, скорее всего, есть довольно много общих символов, определенных в обоих исполняемых файлах. –

+0

О, а общие библиотеки на самом деле не связаны * с исполняемым файлом, есть только ссылка в исполняемом файле, поэтому загрузчик знает, что он должен загружать библиотеку и разрешать любые ссылки. Кроме того, общая библиотека - это то, что подразумевает название, * shared *, то есть многие исполняемые программы могут использовать одну и ту же единую библиотеку, и библиотека будет загружаться только в память * один раз *. –

+1

Итак, если вы загрузили две «исполняемые библиотеки»: какая будет точка входа? Помните, что сейчас два. – Olaf

ответ

2

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

  • Исполняемый имеет только одну точку входа, библиотека может иметь более одного (все функции являются потенциальными точками входа).

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

  • Исполняемый файл не обязательно должен содержать символы. Общая библиотека должна выставлять хотя бы один символ, иначе было бы бессмысленно ссылаться на нее.

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

Мы могли бы предоставить исполняемые библиотеки вместо исполняемых файлов, но почему? Это просто сбивает с толку. Просто потому, что вы можете что-то обобщить, это не значит, что это хорошая идея. Мы сохраняем исполняемые файлы в /.../bin, потому что мы ожидаем, что программы будут там, чтобы мы могли их найти, когда хотим их запустить, мы храним библиотеки в /.../lib, потому что мы ожидаем, что библиотеки будут там, чтобы мы могут найти их, когда нам нужно связать их. Небольшие различия в заголовках только для того, чтобы избежать ошибок и путаницы без каких-либо причин. Я никогда не был в ситуации, когда я думал: «Мне жаль, что я не могу запустить эту библиотеку» или «Мне жаль, что я не смогу связаться с этим двоичным кодом».

+0

Да, это философский вопрос, вы поняли меня совершенно правильно. Но в конце вашего ответа вы говорите о '/ lib' и'/bin/'директиве, и я думаю, что неправильно указывать его как один из аргументов в ответ, потому что это эффекты от отдельных исполняемых файлов и библиотек, а не от причина. –

+0

Каталоги были просто для того, чтобы показать, что мы уже разделяем разные варианты использования одним способом, потому что нет причин смешать их, поэтому мы можем также иметь небольшие отличия в заголовках, чтобы избежать ошибок. – Art

Смежные вопросы