gcc генерирует общий объект с разрешениями на выполнение

#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.