Что такое опция -z для Clang и зачем она нужна? - PullRequest
2 голосов
/ 25 октября 2019

Рассмотрим следующие специфичные для линкера опции Clang:

-Wl,<arg>                Pass the comma separated arguments in <arg> to the linker
-Xlinker <arg>           Pass <arg> to the linker
-z <arg>                  Pass -z <arg> to the linker

Что означает Pass -z <arg> to the linker и чем -z <arg> отличается от -Xlinker <arg>?

Я иногда вижу-z <arg> используется с -Wl,<arg>, например:

-Wl,-z,norelro

Но зачем это нужно, если аргументы -Wl должны быть просто разделены запятыми?

1 Ответ

6 голосов
/ 25 октября 2019

почему -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?

Возможно, потому что не вообще не поддерживает эту опцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...