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

8

Мне просто любопытно.

bash-3.00$  ldd libmylibrary.so
ldd: warning: you do not have execution permission for `libmylibrary.so'

Кажется, что все работает нормально только с + r. Я заметил, что большинство .so в / usr / lib имеют + x set ...

Почему разделяемые библиотеки должны иметь исполняемый бит? Что может произойти, если я не установлю это?

Томо
источник
2
Библиотеки определенно не нуждаются в + x для правильной работы. Возможно, они ссылки, однако? Ссылки должны быть + х, чтобы следовать.
Крис С
Да, им не нужен + x, но в большинстве библиотек он установлен.
Томо
Этот вопрос также задавался в Unix и Linux: unix.stackexchange.com/questions/40587/… (и получил там правильный ответ)
Михал Гурни

Ответы:

3

На самом деле это зависит от lddреализации. lddобычно это скрипт, вы можете отредактировать его, чтобы увидеть, где и почему вы получаете эту ошибку.

В Ubuntu 10.04 lddпроверяет readтолько разрешение. Это может дать ошибку не динамический исполняемый файл, если файл не является ELF ( Исполняемый и связываемый формат ). -rw-r--r--Например, все это - libs

$ find /usr/lib -type f -name "libm*.so*" -ls
(...)
-rw-r--r--   1 root     root       216800 Feb 26 22:20 /usr/lib/libmp.so.3.1.16
-rw-r--r--   1 root     root        76728 Mar 14 04:23 /usr/lib/libmjpegutils-1.9.so.0.0.0
-rw-r--r--   1 root     root       134464 Jan 29  2010 /usr/lib/libm17n-core.so.0.3.0
-rw-r--r--   1 root     root       290480 Feb 17  2010 /usr/lib/libmtp.so.8.3.2

Не шокирует желание получить xдоступ к общей библиотеке. executableРежим представляет собой соглашение , что дает OS другой уровень контроля прав доступа. Исполняемый загрузчик контролирует этот доступ, чтобы гарантировать, что пользователь может выполнить его, но также и для предотвращения ошибок (некоторые сценарии или программы не должны выполняться некоторыми людьми).

Это может быть распространено на разделяемые библиотеки по той же причине - но разделяемые библиотеки не могут запускаться сами по себе и менее подвержены ошибкам, которые могут быть использованы случайно ). Таким образом, необходимость менее очевидна ( rдоступ достаточен).

e2-e4
источник
3

На самом деле вы можете выполнить много библиотек, посмотрите, например, что происходит, когда вы печатаете /lib/libc.so.6в своей оболочке в недавней системе GNU / Linux.

JAQ
источник
0

думаю, что иметь исполняемый файл с -x. Вы не сможете выполнить это. Рассмотрим эти библиотеки как набор общих функций, которые вызываются другой программой (скажем, myProgra). Если вы не можете выполнить библиотеки / функции ... тогда у вас ничего нет

Пример

function1() {} 
function2() {} 
int main() { 
printf("Let's call func1"); 
function1(); 
printf("Let's call func2"); 
function2(); 
} 

Теперь, если вы поместите function1 и function2 в другой файл и включите его, то вы библиотека. (Конечно, это что-то более сложное. Это всего лишь пример)

Но в любом случае, как вы видите, вы должны выполнить код, который включен в библиотеку

Николайдис Фотис
источник
Но вы выполняете исполняемые файлы, а не библиотеки.
Игнасио Васкес-Абрамс
Смотрите отредактированную версию выше
Николайдис Фотис
0

Ключ - это формат файла, Исполняемый и Связываемый формат. Поскольку один и тот же точный формат файла используется для идентификации как исполняемой, так и общей библиотеки, оба должны иметь соответствующие разрешения для исполняемого файла для загрузчика ОС. Это позволяет использовать один загрузчик и использовать исполняемые файлы в качестве DSO, если они содержат таблицу символов.

nzwulfin
источник
Итак, загрузчик использует биты прав доступа, а не заголовок файла, чтобы определить, что загружать?
Томо
Загрузчик использует заголовок файла, чтобы идентифицировать содержимое как DYN или EXEC и сделать соответствующую вещь. Бит выполнения предназначен для ОС, а не для загрузчика. ELF - это исполняемый формат, без бита выполнения ОС не позволит загрузчику выполнить файл для чтения заголовков. Проверьте Википедию для получения дополнительной информации на ELF en.wikipedia.org/wiki/Executable_and_Linkable_Format .
nzwulfin