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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7827622/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-05 06:45:41  来源:igfitidea点击:

How can one provide custom compiler/linker flags for OpenSSL?

linuxgccbuildopenssl

提问by DNS

I'm trying to build OpenSSL with -Wa,--noexecstack, but can't find anywhere in its config command-line to provide this flag. I've tried to set CFLAGS, but it appears to ignore that and just use its own.

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

This is an automated build working off a clean copy of the OpenSSL source, so a one-time hack of the config script isn't really an option.

这是一个自动构建,使用 OpenSSL 源的干净副本,因此配置脚本的一次性破解并不是真正的选择。

Is there a way to pass custom flags to OpenSSL's build process?

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

采纳答案by indiv

The configscript ignores CFLAGS, but not CC. So you can specify your compiler and give it the flags at the same time:

config脚本忽略CFLAGS,但不是CC。因此,您可以指定编译器并同时为其提供标志:

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

Alternatively, since configauto detects your platform and then runs Configurewith preset compiler settings, you can add the compiler flags to your platform configuration. E.g., for my mac, I see this line when I first run 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

So if I open Configure, I can search for darwin-i386-ccand add the flags to the presets.

因此,如果我打开Configure,我可以搜索darwin-i386-cc标志并将其添加到预设中。

If you're not using a preset configuration, then you'd just pass the flags directly to Configureon the command line and it'll use them.

如果您没有使用预设配置,那么您只需将标志直接传递给Configure命令行,它就会使用它们。

回答by AnthonyFoiani

Late to the party, but another way of doing this is to make an automated edit to the generated makefile. E.g., to add -DPURIFYto the flags, I first do the regular configure, then:

迟到了,但另一种方法是对生成的 makefile 进行自动编辑。例如,要添加-DPURIFY到标志,我首先进行常规配置,然后:

perl -i~ -plwe 's!^(CFLAG=.*$)! -DPURIFY!' Makefile

Not the most elegant solution, but it works for me.

不是最优雅的解决方案,但它对我有用。

回答by freitass

Later to the party, but this seems to be the correct way of doing this.

后来到了聚会,但这似乎是正确的做法。

From the configscript help:

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.

So the configscript forwards "unexpected" options to the Configurescript. Well, lets see what the Configurescript has to say about that:

因此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]

See the [:flags]part at the end of that long line? There is also a comment inside the file:

看到[:flags]那条长线末尾的部分了吗?文件中还有一条注释:

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

It's not that obvious since it does not follow well known standards but the answer is: just append the options to the end of the configcommand line.

这不是很明显,因为它不遵循众所周知的标准,但答案是:只需将选项附加到config命令行的末尾。

As a long time has passed since you posted the question, I must add:

自从您发布问题以来已经过去很长时间了,我必须补充一点:

  • it may not work for the version of OpenSSL you are working with (mine is OpenSSL 1.0);
  • I felt compelled to post this answer since none of the previous answers solved my problem and it took me a little while to figure out that solution.
  • 它可能不适用于您正在使用的 OpenSSL 版本(我的是 OpenSSL 1.0);
  • 我觉得有必要发布这个答案,因为之前的答案都没有解决我的问题,我花了一点时间才找到解决方案。