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
How can one provide custom compiler/linker flags for OpenSSL?
提问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 config
script 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 config
auto detects your platform and then runs Configure
with 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-cc
and 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 Configure
on 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 -DPURIFY
to 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 config
script 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 config
script forwards "unexpected" options to the Configure
script. Well, lets see what the Configure
script 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 config
command 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);
- 我觉得有必要发布这个答案,因为之前的答案都没有解决我的问题,我花了一点时间才找到解决方案。