#linux #gcc #shared
#linux #gcc #общий
Вопрос:
Я создаю общую библиотеку в Linux с использованием gcc. Я не получаю ошибок компиляции или компоновки, но для моего общего объекта всегда установлен бит выполнения (хотя readelf указывает, что это общий объект). Я просто делаю это:
> echo "int f() {return 1;}" > a.cpp
> gcc -c a.cpp
> gcc -shared -o liba.so a.o
> ls -l liba.so
-rwxr-xr-x 1 me me 6652 2011-06-09 17:05 liba.so
Почему для общего объекта должен быть установлен бит execute?
Комментарии:
1. это не gcc, это ваш компоновщик (
ld
или аналогичный)
Ответ №1:
Потому что обычно вы можете запускать разделяемые библиотеки. Большинство совместно используемых библиотек будут аварийно завершать работу при их выполнении, но вы можете их выполнить.
В некоторых библиотеках определена точка входа (-Wl,-e,имя_в_у_в_пункте входа, основная функция в стандартных программах на C), после чего вы можете выполнить их без сбоев.
Комментарии:
1. Каждый день чему-то учишься. Спасибо, я удалю это из файла. Возможно, когда-нибудь это будет полезно.
Ответ №2:
Например, HP-UX требует, чтобы разделяемые библиотеки были исполняемыми. Если это не так, карта памяти динамическим загрузчиком завершается ошибкой с отказом в разрешении. И, по-видимому, наличие бита x на других платформах не повредит, поэтому GCC выбирает безопасный маршрут и устанавливает бит x.