如何为OpenSSL提供自定义编译器/链接器标志?

20

我试图使用-Wa,-noexecstack选项构建OpenSSL,但是在它的配置命令行中找不到提供此标志的任何地方。我尝试设置CFLAGS,但它似乎忽略了这一点并只使用自己的。

这是一个自动化构建,使用干净的OpenSSL源代码副本,所以对配置脚本进行一次性修改并不是真正的选择。

是否有办法将自定义标志传递给OpenSSL的构建过程?


1
请注意,文档实际上建议您执行那些您想避免的编辑 - 请参见https://wiki.openssl.org/index.php/Compilation_and_Installation#Modifying_Build_Settings,在那里他们谈论在构建过程中运行sed。 - James Moore
4个回答

21
晚来一步,但这似乎是正确的方法。
config脚本帮助中得知:
$ ./config -h
Usage: config [options]
 -d Add a debug- prefix to machine choice.
 -t Test mode, do not run the Configure perl script.
 -h This help.

Any other text will be passed to the Configure perl script.
See INSTALL for instructions.

所以 config 脚本将“意外”的选项转发给 Configure 脚本。好的,让我们看看 Configure 脚本对此有何说法:
$ ./Configure --help
Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [experimental-<cipher> ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-dso] [no-krb5] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--test-sanity] os/compiler[:flags]

看到那一行末尾的[:flags]了吗?文件内还有一条注释:

# -<xxx> +<xxx> compiler options are passed through

虽然它不遵循众所周知的标准,但答案很简单:只需将选项附加到config命令行的末尾即可。

由于您发布问题以来已经过了很长时间,我必须补充说明:

  • 它可能无法适用于您正在使用的OpenSSL版本(我的是OpenSSL 1.0);
  • 既然之前的答案都没有解决我的问题,而我又花了一点时间才找到这个解决方案,因此我觉得有必要发布这个答案。

2
结果证明这并不有用。大多数情况下,您需要设置cflags;这只是追加它们。无法帮助消除已经存在的错误标志。 - James Moore
请注意,这种方法并不适用于所有类型的标志。例如,在 Windows 上,无法设置“/SUBSYSTEM:CONSOLE,x.xx”,您仍然需要退回到此答案中所述的方法。(https://dev59.com/omsz5IYBdhLWcg3wiYY0#16248464) - Claudiu

15

config脚本会忽略CFLAGS,但不会忽略CC。因此,您可以同时指定编译器并给它传递标志:

export CC="gcc -Wall -DHELLO_WORLD"; ./config

或者,由于config会自动检测您的平台并使用预设的编译器设置运行Configure,因此您可以将编译器标志添加到平台配置中。例如,对于我的Mac,在我第一次运行config时,我会看到这行:

Operating system: i386-apple-darwinDarwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386
Configuring for darwin-i386-cc

如果我打开“配置”,我可以搜索darwin-i386-cc并将其添加到预设中。

如果您没有使用预设配置,则可以在命令行直接传递标志给Configure,它会使用它们。


5
来晚了,但做这件事的另一种方法是对生成的 Makefile 进行自动化编辑。例如,要将 -DPURIFY 添加到标志中,首先进行常规配置,然后执行以下操作:
perl -i~ -plwe 's!^(CFLAG=.*$)!$1 -DPURIFY!' Makefile

这不是最优雅的解决方案,但对我来说有效。


这似乎是移除或替换标志的唯一方式。 - Mikhail Edoshin

0
  1. CC=clang ./config [其他参数]
  2. CC=gcc ./confug [其他参数]

等等


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接