Я смущен. Я пытаюсь в Linux на x86.Зачем нужна общая библиотека, созданная из объекта non-pic?
ответ
x86 ABI поддерживает не-PIC-код в совместно используемых библиотеках. Как указывалось ранее, страницы, которые обычно будут разделяться, не будут разделяться (поскольку ld.so необходимо исправлять ссылки в коде, а особое место (GOT)).
Но библиотеки, построенные таким образом, могут быть немного быстрее, потому что код ПИК обычно медленнее.
amd64 ABI не поддерживает это.
PIC просто делает жизнь более простой для загрузчика, так как она только должна изменить несколько глобальных адресов в коде. В коде, отличном от PIC, содержится гораздо больше этих адресов, поэтому таблица с адресами, требующими перемещения, больше. Но загрузчик должен иметь возможность переместить код в любом случае (например, для разрешения адресов статических/глобальных переменных и всех указателей на функции).
MUST ??? обычно это вообще не работает –
У вас всегда есть некоторые символы, к которым обращаются через их глобальный адрес. Эти адреса всегда должны быть перемещены. Раньше такой код часто отображался на фиксированный адрес, но с появлением переполнения буфера ОС отображали приложение на постоянно меняющиеся адреса, чтобы сделать эти виды атак более сложными. –