почему -z используется с -Wl
Следующие 3 команды точно эквивалентны:
clang main.c -o a.out -Wl,-z,norelro
clang main.c -o a.out -z norelro
clang main.c -o a.out -Xlinker -z -Xlinker norelro
Все они проходят -z norelro
компоновщику на последнем этапе компоновки.
Первая форма является стандартной для многих компиляторов. Вторая форма немного короче, но на самом деле не должна использоваться (потому что использование «стандартной» формы всегда лучше). Третья форма поддерживается только для совместимости с GCC. Это излишне многословно.
Обновление:
Не могли бы мы просто написать -Wl,norelro
Нет: это пройдет«голая» опция norelro
для компоновщика, которая будет обрабатывать его как входной файл и будет жаловаться, что такого входного файла не существует. Существует (очевидно) разница между передачей -z norelro
и просто norelro
.
Кроме того, рассмотрим clang ./noaslr.c -Wl,-z,-no_pie ...
Это просто поддельная команда. -no-pie
- это параметр компоновщика, и перед ним не должен стоять префикс -z
. Это также не действительное значение параметра для -z
.
Обновление 2:
Где я могу увидеть возможные значениядля опции компоновщика -z?
На странице руководства для ld
в операционной системе, на которую вы нацелены . Например, в Linux последняя версия BFD ld
понимает следующие -z
опции: bndplt
, call-nop-prefix=...
, combreloc
и т. Д. И т. Д.
Кроме того, вы понимаете, почему man ld в macOS не показывает опцию -z linker?
Возможно, потому что не вообще не поддерживает эту опцию.