Чому спільні бібліотеки виконують?


59

Чому майже у всіх спільних бібліотеках /usr/lib/встановлено біт дозволу, що виконується? Я не бачу жодного випадку використання для їх виконання. Деяким вдається приєднати певну форму mainфункції для друку короткої нотатки про авторські права та версії, але багато хто не робить цього навіть після виконання.

Отже, який сенс встановлювати це x? Чи повинні це робити всі пакувачі бібліотеки? Що станеться, якщо я dlopen()матиму спільну бібліотеку, яка має 0644дозволи?


3
На якій ОС (якщо Linux, який дистрибутив)? На видавленні Debian єдині виконувані бібліотеки, що діляться, /libі /usr/libє libc та libpthread, і обидва друкують повідомлення про авторські права при виконанні.
Жиль

Якщо вони сегментуються, вони, ймовірно, незначні помилки. Я повідомив би про них, якщо ви натрапите на них. Що таке розподіл?
Faheem Mitha

@Faheem: Якщо main()символ не є точкою входу, це не незначна помилка, а фундаментальний вибір дизайну. Ви пропустили мою думку.
Tadeusz A. Kadłubowski

2
@Gilles: Я бачив 755 як вибір дозволу за замовчуванням для систем сімейства Linux RedHat (Fedora та Centos) та Solaris.
Тадеуш А. Kadłubowski

Передумова цього питання не є універсальним. Насправді це помилково, як зазначалося вище, для Debian Linux; а також неправдиво для 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 від Hewlett Packard Enterprise на основі системи UNIX V
Девід 天宇 Вонг,

Ще одним прикладом є те, що для створення rpm-пакетів з окремими пакетами debuginfo потрібні виконання дозволів для спільних бібліотек, інакше find-debuginfo.sh пропускає їх обробку.
Домен Вранкар

20

Невиконані спільні об'єкти працюють нормально, але бібліотеки, позначені виконуваним файлом, також можуть працювати як окремі програми.

Отже, який сенс встановлювати цей х?

Ні, якщо ви не хочете, щоб вони надсилали версію чи іншу інформацію

Чи повинні це робити всі пакувачі бібліотеки?

Немає

Що буде, якщо я відкрию спільну бібліотеку, яка має 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 просто сегментовані, оскільки вони не мають нічого подібного до нормальної main()точки входу. Libc - чужий чоловік. Його розробники зробили цю нотатку як додаткову функціональність. Проста chmod a+xбудь-яка інша бібліотека не надасть вам цієї функціональності` Я все ще не бачу сенсу налаштування +xдля всіх бібліотек.
Тадеуш А. Кадлубовський

Погоджені, і, ймовірно, лише такі .so, які можуть бути виконані, повинні бути позначені як такі. Я зміню свою відповідь, щоб уникнути того, що все з набором бітів exec - це справді автономний виконуваний файл.
Марно

5
Команда "ldd" - це звичайно скрипт sh, який викликає динамічний лінкер, ld-linux-x86-64.so.2 або /lib/ld-linux.so.2 або якийсь подібний. Динамічний лінкер - це завжди спільний об'єкт.
Брюс Едігер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.