Чтение через libtool docs Я задавался вопросом, почему нам нужно сообщить компилятору о создании независимого от позиции кода. В конце концов, созданный объектный файл еще не знает, где в адресном пространстве он будет связан, так что один файл объекта должен всегда оставаться независимым от положения, не так ли? И, кроме того, для создания общих объектов libs, это не означает, что просто означает выпекание всех объектных файлов, которые составляют эту библиотеку, и, возможно, установку всех относительных ссылок, ставших «стажерами» в библиотеку baked-together, оставляя все остальные ссылки (абсолютный и относительный), который будет заполнен позже компоновщиком-загрузчиком? Почему это вызывает озабоченность у компилятора?Позиция независимого кода: какая разница во время компиляции?
ответ
Я задавался вопросом, почему нам нужно сообщить компилятору о создании независимого от позиции кода. В конце концов, созданный объектный файл еще не знает, где в адресном пространстве он будет связан, поэтому один файл объекта должен быть независимым от позиции во все времена, не так ли?
Когда вы сообщаете компилятору о создании независимого от положения кода (PIC), он полностью отличается от компилятора, который производит не-ПОС, в основном в отношении функции и доступа к данным. Причина использования PIC заключается в том, чтобы избежать переполнения буфера или перезаписи кода, который возникает, когда кто-то вводит несколько строк кода в адресное пространство вашего приложения, в основном написанное на языках с низким уровнем, например C/C++, потому что по умолчанию C/C++ не проверяет границы ,
Он использует косвенный метод доступа к данным и функциям с помощью таблицы «Глобальная таблица смещения» (GOT). Этот GOT обычно находится в специальном реестре машин. Основное преимущество использования этой таблицы состоит в том, что генерация кода не зависит от фактического адреса нагрузки. Во время выполнения он обновит смещения в таблице в зависимости от текущего адреса загрузки необходимых библиотек.
Когда компилятор создает объектный файл (.lo in PIC), он загружает объект произвольным адресом без изменений и даже если адрес загрузки объекта фиксирован для некоторого ABI, он будет загружать каждую требуемую библиотеку наугад address.The созданный объектный файл не знает, где в адресном пространстве, в котором он будет связан, ну, именно это означает, что PIC хочет сделать так, чтобы не был установлен фиксирующий адрес, который может поставить под угрозу безопасность приложения, если злоумышленник находит этот адрес.
И, кроме того, для создания общих объектов libs это не означает, что это просто означает выпекание всех объектных файлов, которые выдают эту библиотеку и, возможно, устанавливают все относительные ссылки, ставшие «стажерами» для библиотеки baked-together lib , оставляя все остальные ссылки (абсолютные и относительные) заполняться позже компоновщиком-загрузчиком? Почему это вызывает озабоченность у компилятора?
В случае общей библиотеки libtool, когда видит флаг PIC, установленный в препроцессоре, автоматически создает объектный файл для разделяемых библиотек. Они не стали «стажерами», потому что разделяемые библиотеки могут быть расположены в любом месте в макете памяти процесса, и к ним обращаются косвенно с помощью некоторых флагов, установленных при создании.
Wiki: http://en.wikipedia.org/wiki/Position-independent_code
Хорошо, теперь я знаю, где я пропустил точку общих libs: shared lib foolib.so может появляться по адресу X для одного процесса и по адресу Y для другого процесса, правильно? – Vroomfondel
На самом деле каждый процесс имеет собственное виртуальное адресное пространство, поэтому, если совместно используемая библиотека, такая как foolib.so, построена с помощью PIC, она может находиться в любом месте виртуального адресного пространства процессов. – skush
Нельзя сказать: он ДОЛЖЕН быть построен с ПОС, потому что иначе он может столкнуться с кодом из процесса, который на самом деле пытается использовать lib? – Vroomfondel
- 1. Позиция независимого кода и общего объекта
- 2. Позиция независимого кода в макрос сборке
- 3. Позиция независимого кода в NASM (32 бит)
- 4. ошибки во время компиляции кода
- 5. Запуск произвольного кода во время компиляции
- 6. Преобразование кода Java во время компиляции
- 7. Позиция во время CAAnimation
- 8. Тип независимого кода в шаблонах
- 9. Отказывание во время компиляции
- 10. Ошибка компиляции "Не имя типа" во время компиляции кода
- 11. Ошибки при отладке во время компиляции во время компиляции
- 12. Разница во времени в компиляции?
- 13. Как пропустить строку кода внутри класса во время компиляции
- 14. Какая итерация делает GHC во время компиляции шаблонов?
- 15. Позиция камеры во время выполнения
- 16. offsetof во время компиляции
- 17. Ошибка во время компиляции?
- 18. Генерация координат во время компиляции
- 19. Оставшиеся классы во время компиляции
- 20. Позиция независимого кода, разделяемых библиотек и виниров кода - заставить их работать вместе
- 21. Detect С # во время компиляции
- 22. предупреждение, возникающее во время компиляции
- 23. Вставить строку во время компиляции
- 24. Вывести ошибку во время компиляции, если какая-либо конкретная внешняя функция используется в любом месте кода?
- 25. Ошибка выполнения во время компиляции
- 26. Генерация классов во время выполнения/время компиляции с Дартом
- 27. оценить выражение во время компиляции
- 28. Типы ошибок во время компиляции и во время выполнения
- 29. Разница во время сервера
- 30. Concatenate + разница во время
Возможно более ontopic на SO. Является ли это действительно уникальным? –