Почему разделяемые библиотеки исполняемые?

59

Почему почти во всех общих библиотеках /usr/lib/установлен бит разрешений для исполняемого файла? Я не вижу ни одного варианта их использования. Некоторым удается подключить некоторую форму mainфункции для печати краткой заметки об авторском праве и версии, но многие даже не делают этого, и при запуске происходит ошибка.

Итак, какой смысл устанавливать это x? Должны ли все библиотечные упаковщики делать это? Что произойдет, если у меня dlopen()будет общая библиотека с 0644разрешениями?

Тадеуш А. Кадлубовский
источник
3
На какой ОС (если Linux, какой дистрибутив)? В Debian squeeze единственными исполняемыми общими библиотеками в /libи /usr/libявляются libc и libpthread, и обе они печатают уведомление об авторских правах при выполнении.
Жиль "ТАК - перестань быть злым"
Если они segfault, они, вероятно, незначительные ошибки. Я бы сообщил о них, если вы столкнетесь с ними. Что такое распределение?
Фахим Митха
@Faheem: отсутствие main()символа в качестве точки входа - это не маленькая ошибка, а фундаментальный выбор дизайна. Вы пропустили мою точку зрения.
Тадеуш А. Кадлубовски
2
@Gilles: 755 я видел в качестве разрешения по умолчанию для систем Linux семейства RedHat (Fedora и Centos) и для Solaris.
Тадеуш А. Кадлубовский
Предпосылка этого вопроса не всегда верна. На самом деле это неверно, как отмечалось выше, для Debian Linux; а также false для FreeBSD и для OpenBSD.
JdeBP

Ответы:

32

В HP-UX разделяемые библиотеки отображаются в память с помощью mmap (), и все страницы памяти в системе имеют защитные биты, которые связаны с механизмами защиты страниц памяти в ядре и оборудовании процессора. Чтобы выполнить содержимое любой страницы памяти в системе, на этой странице должен быть установлен PROT_EXEC - полезная функция для предотвращения эксплойтов при выполнении данных.

Вызов mmap () использует биты прав доступа к файлу, который он собирается отобразить, чтобы определить защитные биты отображенных страниц памяти, которые должны его содержать: rwx -> PROT_READ | PROT_WRITE | PROT_EXEC (из sys / mman.h). таким образом, чтобы совместно используемую библиотеку можно было использовать в HP-UX, файл, содержащий разделяемую библиотеку, должен иметь разрешения на выполнение, чтобы гарантировать, что сопоставленная библиотека также имеет разрешение на выполнение.

Совместно используемая библиотека с режимом 644 в системе HP-UX вызовет дамп памяти.

Майкл Пеллетье
источник
Возможно, другие реализации Unix также используют эту функцию.
Тадеуш А. Кадлубовский,
> HP-UX (от «Hewlett Packard Unix») - это собственная реализация операционной системы Unix, основанная на UNIX System V, от Hewlett Packard Enterprise
Дэвид 天宇 Вонг
Еще один пример - создание пакетов rpm с отдельными пакетами debuginfo требует разрешения на выполнение для общих библиотек, в противном случае find-debuginfo.sh пропускает их обработку.
Домен Вранкар,
20

Неисполняемые общие объекты работают нормально, но библиотеки, помеченные как исполняемые, также могут быть запущены как автономные программы.

Итак, какой смысл устанавливать этот х?

Нет, если вы не хотите, чтобы они испускали версию или другую информацию

Должны ли все библиотечные упаковщики делать это?

нет

Что произойдет, если я буду использовать dlopen () совместно используемую библиотеку с разрешениями 0644?

Вы получите новый дескриптор общего объекта (при условии, что файл доступен для чтения и т. Д.) ... бит exec не влияет на это


Относительно того, почему библиотеки, которые нельзя использовать в качестве автономных исполняемых файлов, по-прежнему имеют установленный бит exec: это, вероятно, просто артефакт используемой системы сборки или сценария ссылки.


Пример вывода, просто для справки:

$ /lib/i386-linux-gnu/libc.so.6
GNU C Library (Ubuntu EGLIBC 2.15-0ubuntu10) stable release version 2.15, by Roland McGrath et al.
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.6.3.
Compiled on a Linux 3.2.14 system on 2012-04-19.
Available extensions:
    crypt add-on version 2.1 by Michael Glad and others
    GNU Libidn by Simon Josefsson
    Native POSIX Threads Library by Ulrich Drepper et al
    BIND-8.2.3-T5B
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<http://www.debian.org/Bugs/>.
Бесполезный
источник
11
Большинство библиотек .so просто segfault, потому что у них нет ничего похожего на обычную main()точку входа. Libc - это выброс. Его разработчики сделали эту заметку как дополнительный функционал. Простая chmod a+xиз любой другой библиотеки не даст вам такой функциональности`. Я все еще не вижу смысла устанавливать +xвсе библиотеки.
Тадеуш А. Кадлубовски
Согласованные, и, вероятно, только те, .soкоторые могут быть выполнены, должны быть помечены как таковые. Я исправлю свой ответ, чтобы не подразумевать, что все с установленным битом exec действительно является автономным исполняемым файлом.
бесполезно
5
Команда «ldd» обычно представляет собой скрипт sh, который вызывает динамический компоновщик, ld-linux-x86-64.so.2 или /lib/ld-linux.so.2 или что-то подобное. Динамический компоновщик всегда является общим объектом.
Брюс Эдигер