From 343ec2b083b82ccf9ce96020bc95320390296f1f Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Fri, 19 Feb 2016 22:08:37 +0100 Subject: [PATCH] Build dynamic engines even if configured "no-shared" Until now, the engines in engines/ were only built as dynamicaly loadable ones if shared libraries were built. We not dissociate the two and can build dynamicaly loadable engines even if we only build static libcrypto and libssl. This is controlled with the option (enable|disable|no)-static-engine, defaulting to no-static-engine. Note that the engines in crypto/engine/ (dynamic and cryptodev) will always be built into libcrypto. Reviewed-by: Rich Salz --- Configure | 47 +++++++++++++++++++++++++++++---------------- Makefile.in | 3 ++- engines/Makefile.in | 2 +- engines/build.info | 2 +- util/mk1mf.pl | 6 ++---- 5 files changed, 36 insertions(+), 24 deletions(-) diff --git a/Configure b/Configure index e8786b020a..1cb5ace1af 100755 --- a/Configure +++ b/Configure @@ -261,7 +261,7 @@ my @disablables = ( "dsa", "dso", "dtls", - "dynamic[-_]engine", + "dynamic-engine", "ec", "ec2m", "ecdh", @@ -335,6 +335,7 @@ my %disabled = ( # "what" => "comment" "sctp" => "default", "shared" => "default", "ssl-trace" => "default", + "static-engine" => "default", "unit-test" => "default", "zlib" => "default", "crypto-mdebug" => "default", @@ -380,6 +381,9 @@ my @disable_cascades = ( "tlsext" => [ "srp", "heartbeats" ], "crypto-mdebug" => [ "crypto-mdebug-backtrace" ], + + # Without DSO, we can't load dynamic engines, so don't build them dynamic + "dso" => [ "dynamic-engine" ], ); # Avoid protocol support holes. Also disable all versions below N, if version @@ -544,6 +548,14 @@ foreach (@argvcopy) $disabled{$proto} = "option(tls)"; } } + elsif ($1 eq "static-engine") + { + $disabled{"static-engine"} = "option"; + } + elsif ($1 eq "dynamic-engine") + { + delete $disabled{"static-engine"}; + } else { $disabled{$1} = "option"; @@ -551,6 +563,14 @@ foreach (@argvcopy) } elsif (/^enable-(.+)$/) { + if ($1 eq "static-engine") + { + delete $disabled{"static-engine"}; + } + elsif ($1 eq "dynamic-engine") + { + $disabled{"static-engine"} = "option"; + } my $algo = $1; delete $disabled{$algo}; @@ -984,20 +1004,13 @@ if ($target{shared_target} eq "") $config{no_shared} = 1; } -if ($builder ne "mk1mf") - { - # add {no-}static-engine to options to allow mkdef.pl to work without extra arguments - if ($config{no_shared}) - { - push @{$config{openssl_other_defines}}, "OPENSSL_NO_DYNAMIC_ENGINE"; - $config{options}.=" static-engine"; - } - else - { - push @{$config{openssl_other_defines}}, "OPENSSL_NO_STATIC_ENGINE"; - $config{options}.=" no-static-engine"; - } - } +if ($disabled{"static-engine"}) { + push @{$config{defines}}, "OPENSSL_NO_STATIC_ENGINE"; + $config{dynamic_engines} = 1; +} else { + push @{$config{defines}}, "OPENSSL_NO_DYNAMIC_ENGINE"; + $config{dynamic_engines} = 0; +} # # Platform fix-ups @@ -1371,8 +1384,8 @@ if ($builder eq "unified") { $unified_info{libraries}->{$library} = 1; } - die <<"EOF" if $config{no_shared} && scalar @engines; -ENGINES can only be used if configured with 'shared'. + die <<"EOF" if scalar @engines and !$config{dynamic_engines}; +ENGINES can only be used if configured with 'static-enginex'. This is usually a fault in a build.info file. EOF foreach (@engines) { diff --git a/Makefile.in b/Makefile.in index c269a6d20a..9cca221cdd 100644 --- a/Makefile.in +++ b/Makefile.in @@ -210,6 +210,7 @@ SHARED_LDFLAG={- $target{shared_ldflag} . ($config{target} =~ m|^BSD-| && $prefix !~ m|^/usr/.*$| ? " -Wl,-rpath,\$\$(LIBRPATH)" : "") -} SHARED_RCFLAG={- $target{shared_rcflag} -} +DYNAMIC_ENGINES={- $config{dynamic_engines} -} GENERAL= Makefile BASENAME= openssl @@ -254,7 +255,7 @@ BUILDENV= LC_ALL=C PLATFORM='$(PLATFORM)' PROCESSOR='$(PROCESSOR)'\ AS='$(CC)' ASFLAG='$(CFLAG) -c' \ AR='$(AR)' NM='$(NM)' RANLIB='$(RANLIB)' \ CROSS_COMPILE='$(CROSS_COMPILE)' \ - PERL='$(PERL)' \ + PERL='$(PERL)' DYNAMIC_ENGINES='$(DYNAMIC_ENGINES)' \ SDIRS='$(SDIRS)' LIBRPATH='$(INSTALLTOP)/$(LIBDIR)' \ DESTDIR='$(DESTDIR)' \ INSTALLTOP='$(INSTALLTOP)' OPENSSLDIR='$(OPENSSLDIR)' \ diff --git a/engines/Makefile.in b/engines/Makefile.in index ea2ae2cd1b..d07cc0f841 100644 --- a/engines/Makefile.in +++ b/engines/Makefile.in @@ -57,7 +57,7 @@ top: all: lib lib: $(LIBOBJ) $(TESTLIBOBJ) - @if [ -n "$(SHARED_LIBS)" ]; then \ + @if [ "$(DYNAMIC_ENGINES)" = 1 ]; then \ set -e; \ for l in $(LIBNAMES) $(TESTLIBNAMES); do \ $(MAKE) -f ../Makefile.shared -e \ diff --git a/engines/build.info b/engines/build.info index cae49862ed..98f0e58ee9 100644 --- a/engines/build.info +++ b/engines/build.info @@ -1,5 +1,5 @@ {- use File::Spec::Functions qw/:DEFAULT rel2abs/; -} -IF[{- $config{no_shared} -}] +IF[{- !$config{dynamic_engines} -}] LIBS=../libcrypto SOURCE[../libcrypto]=\ e_padlock.c {- $target{padlock_asm_src} -} \ diff --git a/util/mk1mf.pl b/util/mk1mf.pl index 08999bfe72..3e8967c315 100755 --- a/util/mk1mf.pl +++ b/util/mk1mf.pl @@ -176,8 +176,6 @@ foreach (grep(!/^$/, split(/ /, $OPTIONS))) print STDERR "unknown option - $_\n" if !&read_options; } -$no_static_engine = 0 if (!$shlib); - $no_mdc2=1 if ($no_des); $no_ssl3=1 if ($no_md5); @@ -1463,11 +1461,11 @@ sub read_options { $zlib_opt = 2; } - elsif (/^no-static-engine/) + elsif (/^no-static-engine/ or /^enable-dynamic-engine/) { $no_static_engine = 1; } - elsif (/^enable-static-engine/) + elsif (/^no-dynamic-engine/ or /^enable-static-engine/) { $no_static_engine = 0; }