Для чего используется параметр-z в этой команде компилятора gcc?


Команда:

gcc -fno-stack-protector -z execstack -o ExitCode ExitCode.c
Я знаю, что мне нужно включить-z execstack, чтобы мой код работал, и у меня в основном есть идея, для чего execstack и что он позволяет мне делать. Но я не знаю, что здесь делает вариант -z. Я посмотрел и grep'd на gcc и execstack man-страницы и использовал --help на обоих, но не нашел прямого ответа. Я предполагаю, что это позволяет добавить функциональность execstack...?
2 7

2 ответа:

В вашем случае это-z execstack

- z передается непосредственно компоновщику вместе с ключевым словом execstack.

Источник: https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#index-z

О пакете execstack

Linux в прошлом допускал выполнение инструкций в стеке, и существует множество двоичных файлов и общих библиотек, предполагающих такое поведение. Кроме того, код GCC trampoline для, например, вложенных функций требует исполняемого стека на многих зодчие. Чтобы избежать разрыва двоичных файлов и общих библиотек, которые нуждаются в исполняемом стеке, двоичные файлы ELF и общие библиотеки теперь могут быть помечены как требующие исполняемого стека или не требующие его. Эта маркировка выполняется через поле p_flags в заголовке программы PT_GNU_STACK. Если маркировка отсутствует, ядро или динамический компоновщик должны предполагать, что ему может потребоваться исполняемый стек. Разметка выполняется автоматически в последних версиях GCC (объекты, использующие батуты в стеке, помечаются как требующий исполняемый стек, все другие вновь построенные объекты помечаются как не требующие его), и компоновщик собирает эти метки в маркировку всей двоичной или общей библиотеки. Пользователь может переопределить это, на время сборки (через ... execstack или ... noexecstack ассемблер варианты), по ссылке время (до Z или execstack-з noexecstack параметров компоновщика) и с помощью execstack инструмент также уже линкер двоичном или разделяемую библиотеку. Этот инструмент особенно полезен для сторонних общих библиотек, где известно, что им не нужен исполняемый стек или тестирование доказывает это.

Источник: http://linux.die.net/man/8/execstack

Надеюсь, это поможет.

Это вариант компоновщика. То, что -z передается непосредственно компоновщику, не упоминается в man-странице, но упоминается здесь в онлайн-документации.

Таким образом, место, чтобы искать его, - это ld manpage. Из него:

 -z keyword
     The recognized keywords are:

 (...)

     execstack
         Marks the object as requiring executable stack.