3

Чтение через libtool docs Я задавался вопросом, почему нам нужно сообщить компилятору о создании независимого от позиции кода. В конце концов, созданный объектный файл еще не знает, где в адресном пространстве он будет связан, так что один файл объекта должен всегда оставаться независимым от положения, не так ли? И, кроме того, для создания общих объектов libs, это не означает, что просто означает выпекание всех объектных файлов, которые составляют эту библиотеку, и, возможно, установку всех относительных ссылок, ставших «стажерами» в библиотеку baked-together, оставляя все остальные ссылки (абсолютный и относительный), который будет заполнен позже компоновщиком-загрузчиком? Почему это вызывает озабоченность у компилятора?Позиция независимого кода: какая разница во время компиляции?

+0

Возможно более ontopic на SO. Является ли это действительно уникальным? –

ответ

2

Я задавался вопросом, почему нам нужно сообщить компилятору о создании независимого от позиции кода. В конце концов, созданный объектный файл еще не знает, где в адресном пространстве он будет связан, поэтому один файл объекта должен быть независимым от позиции во все времена, не так ли?

Когда вы сообщаете компилятору о создании независимого от положения кода (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

Gentoo: http://wiki.gentoo.org/wiki/Project:Hardened

+0

Хорошо, теперь я знаю, где я пропустил точку общих libs: shared lib foolib.so может появляться по адресу X для одного процесса и по адресу Y для другого процесса, правильно? – Vroomfondel

+0

На самом деле каждый процесс имеет собственное виртуальное адресное пространство, поэтому, если совместно используемая библиотека, такая как foolib.so, построена с помощью PIC, она может находиться в любом месте виртуального адресного пространства процессов. – skush

+0

Нельзя сказать: он ДОЛЖЕН быть построен с ПОС, потому что иначе он может столкнуться с кодом из процесса, который на самом деле пытается использовать lib? – Vroomfondel

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