Мы тестируем наше приложение в среде SELinux. Теперь мы получаем следующую ошибку:
dlopen failed to load libFoo.so -libFoo.so: cannot restore segment prot after reloc: Permission denied
Насколько я понимаю из мои поиски, это связано с переездом в .text
раздел в общей библиотеке. Насколько я вижу, мы уже используем -fPIC
для всех наших общих библиотек. Хотя, возможно, есть некоторые статические библиотеки, также связанные с этими общими библиотеками.
Как я могу узнать, какие перемещения / символы вызывают появление этой ошибки? Что я должен искать в nm
или же objdump -rR
выход для общей библиотеки?
Или я ловлю неправильную информацию, и проблема кроется где-то еще, кроме произведенных перемещений в общей библиотеке?
Я нашел это: http://akkadia.org/drepper/textrelocs.html, который в основном сводится к предложению использовать eu-findtextrel
чтобы увидеть, какие текстовые перемещения существуют. Перекомпиляция затронутых библиотек с -fPIC
затем решает проблему.
Я подумал, что это хороший совет, потому что он не установил SELinux в разрешающий режим.
Вы также можете от Вот.
chcon -t texrel_shlib_t <lib>
Так, например,
chcon -t texrel_shlib_t libmylib.so
Но это все еще обходит SELinux, так что -FPIC — способ сделать это. У меня были некоторые проблемы, потому что я неправильно ввел -fPIC во флаги компоновщика. -fPIC — это опция компилятора!