【发布时间】:2024-04-28 18:25:02
【问题描述】:
我在CFLAGS 中有一些-f 编译器选项,例如-fsanitize=address,不久前有人建议我也将这些选项放在LDFLAGS 中,所以我这样做了。它没有引起任何问题。
我的问题是我如何知道CFLAGS 中的哪些编译器选项也应该进入LDFLAGS?它只是-f 前缀选项吗?谢谢
【问题讨论】:
我在CFLAGS 中有一些-f 编译器选项,例如-fsanitize=address,不久前有人建议我也将这些选项放在LDFLAGS 中,所以我这样做了。它没有引起任何问题。
我的问题是我如何知道CFLAGS 中的哪些编译器选项也应该进入LDFLAGS?它只是-f 前缀选项吗?谢谢
【问题讨论】:
我在 CFLAGS 中有一些 -f 编译器选项,例如 -fsanitize=address 和 不久前有人向我建议,我也将这些选项放在 LDFLAGS 中 所以我做了。它没有引起任何问题。
它不仅不会引起任何问题,而且是构建净化程序的唯一正确方法。
我的问题是如何从 CFLAGS 中分辨出哪些编译器选项 也应该去LDFLAGS?只是 -f 前缀选项吗?
只要你这样做就不会受到伤害
LDFLAGS = $(CFLAGS) $(LIBS)
编译器驱动程序 (/usr/bin/gcc) 知道哪些高级选项适用于链接器,因此会简单地过滤掉不必要的选项。如果您想知道这是怎么发生的,请使用-dumpspecs 标志运行 gcc:
$ gcc -dumpspecs
...
*link_command:
%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %{!fno-use-linker-plugin:%{!fno-lto: -plugin %(linker_plugin_file) -plugin-opt=%(lto_wrapper) -plugin-opt=-fresolution=%u.res %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} }}%{flto|flto=*:%<fcompare-debug*} %{flto} %{fno-lto} %{flto=*} %l %{no-pie:} %{pie:-pie} ...
这看起来有点难看,但实际上它只是一种用于国旗翻译的迷你语言。 here 给出了语法详细信息(尽管我非常怀疑您是否需要了解它们)。
【讨论】: