Предположим, что динамические библиотеки отличаются от исполняемого эльфа только одной вещью: для начала выполнения нет точки входа. Лично мне удалось создать исполняемую общую библиотеку с простым кодом - я только что установил точку входа. Таким образом, это было почти так же, как и вызов ld-linux.so
. Теперь, пожалуйста, не бросайте помидоры, но если я здесь, почему мы не можем связать два исполняемых файла вместе - если исполняемые файлы и файлы общих объектов имеют одинаковый формат файла и очень мало различий? Почему у нас есть do есть исполняемые файлы, но не только файлы с общими объектами? И следующий вопрос: почему мы не можем просто предоставить исполняемые библиотеки вместо исполняемых файлов? Пожалуйста, объясните как можно больше.Общие библиотеки vs executable
ответ
Это звучит скорее как философский вопрос. Верно, что на ELF, по крайней мере, существует очень мало вещей, которые отличаются между совместно используемыми библиотеками и исполняемыми файлами. Но давайте перечислим несколько различий, которые могут быть, чтобы увидеть, если это не приблизит нас к ответу:
Исполняемый имеет только одну точку входа, библиотека может иметь более одного (все функции являются потенциальными точками входа).
Исполняемый файл может быть предварительно перенесен на статический адрес памяти (это было 100% истинно, но сегодня на сегодняшний день менее распространено то, что многие системы реализуют независимые исполняемые файлы PIE-позиции), это гораздо сложнее сделать с хотя есть системы, которые пытаются.
Исполняемый файл не обязательно должен содержать символы. Общая библиотека должна выставлять хотя бы один символ, иначе было бы бессмысленно ссылаться на нее.
Различия довольно малы. Они больше связаны с оптимизацией и организацией, а не с другими, и поэтому разница между исполняемым файлом и библиотекой в ELF настолько мала и не требует много настроек, чтобы превратить один в другой.
Мы могли бы предоставить исполняемые библиотеки вместо исполняемых файлов, но почему? Это просто сбивает с толку. Просто потому, что вы можете что-то обобщить, это не значит, что это хорошая идея. Мы сохраняем исполняемые файлы в /.../bin, потому что мы ожидаем, что программы будут там, чтобы мы могли их найти, когда хотим их запустить, мы храним библиотеки в /.../lib, потому что мы ожидаем, что библиотеки будут там, чтобы мы могут найти их, когда нам нужно связать их. Небольшие различия в заголовках только для того, чтобы избежать ошибок и путаницы без каких-либо причин. Я никогда не был в ситуации, когда я думал: «Мне жаль, что я не могу запустить эту библиотеку» или «Мне жаль, что я не смогу связаться с этим двоичным кодом».
Да, это философский вопрос, вы поняли меня совершенно правильно. Но в конце вашего ответа вы говорите о '/ lib' и'/bin/'директиве, и я думаю, что неправильно указывать его как один из аргументов в ответ, потому что это эффекты от отдельных исполняемых файлов и библиотек, а не от причина. –
Каталоги были просто для того, чтобы показать, что мы уже разделяем разные варианты использования одним способом, потому что нет причин смешать их, поэтому мы можем также иметь небольшие отличия в заголовках, чтобы избежать ошибок. – Art
- 1. JDK java executable vs JRE executable
- 2. Общие библиотеки: метод Windows vs Linux
- 3. Ссылка на общие библиотеки DLL в проекте развертывания VS
- 4. Maven и общие библиотеки
- 5. Настраиваемые общие библиотеки (DLL)
- 6. Как объединить общие библиотеки?
- 7. Ссылка на общие библиотеки
- 8. Общие библиотеки между войнами
- 9. Общие библиотеки в компании
- 10. Как разрешены общие библиотеки?
- 11. Общие библиотеки TFS
- 12. Недопустимые общие библиотеки Libcrypto ++
- 13. Общие библиотеки Websphere «Приоритет»?
- 14. Jni и общие библиотеки
- 15. Включить общие библиотеки
- 16. opencv, общие библиотеки отсутствуют
- 17. asp.net общие вспомогательные библиотеки
- 18. Общие библиотеки C++
- 19. Общие библиотеки Linux C++
- 20. Общие разреженные библиотеки итерационных решателей
- 21. Общие библиотеки в Poly/ML
- 22. QtCreator (2.8.0), используя общие библиотеки
- 23. ссылки на общие библиотеки linux
- 24. Общие библиотеки в папке проекта
- 25. Требовать не находит общие библиотеки
- 26. Общие библиотеки C++ с наследованием
- 27. Статические и общие библиотеки C++
- 28. Как обновить общие библиотеки Matlab?
- 29. Как общие библиотеки в Jboss7
- 30. Ссылки на общие библиотеки Linux
Целью связывания является разрешение неразрешенных символов и создание автономного объекта. Какова была бы цель связать два автономных исполняемых файла вместе? Скорее всего, это вызовет конфликты, поскольку, скорее всего, есть довольно много общих символов, определенных в обоих исполняемых файлах. –
О, а общие библиотеки на самом деле не связаны * с исполняемым файлом, есть только ссылка в исполняемом файле, поэтому загрузчик знает, что он должен загружать библиотеку и разрешать любые ссылки. Кроме того, общая библиотека - это то, что подразумевает название, * shared *, то есть многие исполняемые программы могут использовать одну и ту же единую библиотеку, и библиотека будет загружаться только в память * один раз *. –
Итак, если вы загрузили две «исполняемые библиотеки»: какая будет точка входа? Помните, что сейчас два. – Olaf