2013-07-16 2 views
1

Мне немного любопытно о внутреннем файле ELF. И у меня есть вопрос:Зачем использовать общую библиотеку (.so) в Linux с флагом -fPIC?

Зачем нам нужно скомпилировать общую библиотеку (.so) с флагом -fPIC?

Хотя теоретически мы можем динамически связывать исполняемый файл со статически связанным файлом elf. Это связано с тем, что таблица GOT и PLT в исполняемом файле необходимо обновить, в то время как исполняемый файл динамической ссылки можно оставить без изменений.

+0

Я понимаю, что общая библиотека должна использоваться несколькими процессами, чтобы сохранить физическую память и дискового пространства. Но я до сих пор не понимаю, зачем нужен файл общей библиотеки (.so) для компиляции с -fPIC. – Boehm

ответ

2

Идея общей библиотеки заключается в том, что один и тот же код может совместно использоваться несколькими программами в памяти. Однако нельзя гарантировать, что обе работающие программы ожидают, что библиотека будет на одном адресе их макета памяти (подумайте о конфликтах, если программа использует разные общие библиотеки). Таким образом, общая библиотека хранится только один раз в физической памяти, но благодаря модулю управления памятью, одна и та же физическая память рассматривается как два разных адреса двумя программами. Конечно, для этой работы вам нужен код, чтобы быть независимым от его реального адреса (см, например, http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/ для более точных объяснений)

Это к тому же позволяет рандомизации адрес разделяемой памяти, которая хороша в целях безопасности (http://fr.wikipedia.org/wiki/Return-to-libc_attack)

+0

, когда вы говорите, что «общая библиотека хранится только один раз в физической памяти», у меня есть некоторые вопросы здесь. Где общая библиотека хранится в phy mem? Как ядро ​​вычисляет адрес общей библиотеки? – badmad

+0

Прежде всего, если у вас есть другой вопрос, вы должны открыть другой вопрос. Во-вторых, у меня возникает соблазн спросить: «Зачем вам это?». Теперь вот мой короткий ответ: ядро ​​не знает. Он просто выбирает случайную свободную физическую память для хранения общей библиотеки при первом использовании lib, а затем, благодаря MMU, отображает этот mem там, где он должен быть в каждом процессе. – hivert

0

PIC просто означает независимый от положения код. Подумайте о адресах перехода в вашем коде, которые должны быть относительно местоположения вашего кода общей библиотеки в памяти.

также посмотреть на:

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