[openssl-commits] [openssl] master update

Andy Polyakov appro at openssl.org
Mon Mar 19 13:31:56 UTC 2018


The branch master has been updated
       via  df3a15512bd0f5ddd9f0dd74f0a058ee55b33904 (commit)
       via  f39276fdff6ccc1c71bdb30a8050fa1c0bf6e20a (commit)
       via  87ba25ee3fd152d807496609e821a9f5fc950d02 (commit)
       via  9d3cab4bdb03ed740e009503088b0d3c21072eea (commit)
       via  f41c8674c481ae32164430e0797979e29896cd77 (commit)
       via  6d5e74f3fcd7135b829edd17758762de3fb2d594 (commit)
      from  c911e5da3c8e09a9531149c95aa92c65ecdf4b99 (commit)


- Log -----------------------------------------------------------------
commit df3a15512bd0f5ddd9f0dd74f0a058ee55b33904
Author: Andy Polyakov <appro at openssl.org>
Date:   Sat Mar 17 10:59:57 2018 +0100

    Configurations/15-android.conf: detect clang by PATH, not by CC.
    
    Since they intend to omit gcc, it's more appropriate to simply detect
    if there is NDK's clang on PATH, as opposite to requiring to specify it
    with CC=clang (and looking for it on PATH).
    
    Also detect NDK version and default to armv7-a for NDK>16.
    
    Address failure to recognize -D__ADNDROID_API__=N in CPPFLAGS.
    
    Reviewed-by: Rich Salz <rsalz at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/5613)

commit f39276fdff6ccc1c71bdb30a8050fa1c0bf6e20a
Author: Andy Polyakov <appro at openssl.org>
Date:   Fri Mar 16 12:14:28 2018 +0100

    Add NOTES.ANDROID.
    
    Reviewed-by: Rich Salz <rsalz at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/5613)

commit 87ba25ee3fd152d807496609e821a9f5fc950d02
Author: Andy Polyakov <appro at openssl.org>
Date:   Wed Mar 14 17:30:22 2018 +0100

    Configurations/15-android.conf: default to RC4_CHAR whenever possible.
    
    Reviewed-by: Rich Salz <rsalz at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/5613)

commit 9d3cab4bdb03ed740e009503088b0d3c21072eea
Author: Andy Polyakov <appro at openssl.org>
Date:   Wed Mar 14 17:23:16 2018 +0100

    MIPS assembly pack: default heuristic detection to little-endian.
    
    Current endianness detection is somewhat opportunistic and can fail
    in cross-compile scenario. Since we are more likely to cross-compile
    for little-endian now, adjust the default accordingly.
    
    Reviewed-by: Rich Salz <rsalz at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/5613)

commit f41c8674c481ae32164430e0797979e29896cd77
Author: Andy Polyakov <appro at openssl.org>
Date:   Wed Mar 14 09:45:31 2018 +0100

    Configurations/15-android.conf: refine clang support.
    
    Adjusting ARM default broke clang support, and x86[_64] needed
    path adjustment.
    
    Reviewed-by: Rich Salz <rsalz at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/5613)

commit 6d5e74f3fcd7135b829edd17758762de3fb2d594
Author: Andy Polyakov <appro at openssl.org>
Date:   Wed Mar 14 09:42:42 2018 +0100

    Configure: pass -no-integrated-as.
    
    Occasionally you have to pass -no-integrated-as to clang, but we
    consider any -no-option as no-option. Don't touch -no-integrated-as.
    
    Reviewed-by: Rich Salz <rsalz at openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/5613)

-----------------------------------------------------------------------

Summary of changes:
 Configurations/15-android.conf | 75 ++++++++++++++++++++++--------------------
 Configure                      |  4 ++-
 INSTALL                        |  1 +
 NOTES.ANDROID                  | 68 ++++++++++++++++++++++++++++++++++++++
 crypto/aes/asm/aes-mips.pl     |  2 +-
 crypto/sha/asm/sha1-mips.pl    |  2 +-
 crypto/sha/asm/sha512-mips.pl  |  2 +-
 7 files changed, 115 insertions(+), 39 deletions(-)
 create mode 100644 NOTES.ANDROID

diff --git a/Configurations/15-android.conf b/Configurations/15-android.conf
index b524858..551f71b 100644
--- a/Configurations/15-android.conf
+++ b/Configurations/15-android.conf
@@ -1,27 +1,7 @@
 #### Android...
 #
-# It takes *one* prior-set environment variable to make it work:
-#
-# ANDROID_NDK=/some/where/android-ndk-<ver>
-#
-# As well as PATH *adjusted* to cover ${CROSS_COMPILE}gcc and company.
-#
-# Note that it's different from original instructions that required to
-# set CROSS_SYSROOT [to $ANDROID_NDK/platforms/android-<api>/arch-<arch>]
-# and CROSS_COMPILE. CROSS_SYSROOT is still recognized [and even required
-# for some legacy targets], but if not set, it's detected and set to the
-# latest Android platform available with appointed NDK automatically. If
-# you need to target older platform, pass additional -D__ANDROID_API__=N
-# to Configure. For example, to compile for ICS on ARM with NDK 10d:
-#
-# ANDROID_NDK=/some/where/android-ndk-10d
-# PATH=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.8/prebuild/linux-x86_64/bin:$PATH
-# [..]./Configure android-arm -D__ANDROID_API__=14
-#
-# One can engage clang by passing CC=clang to Configure. In such case
-# PATH needs even more adjustments to cover NDK's clang itself, as well
-# as unprefixed, yet target-specific ar and ranlib [or not, if you use
-# binutils-multiarch].
+# See NOTES.ANDROID for details, and don't miss platform-specific
+# comments below...
 
 {
     my $android_ndk = {};
@@ -40,20 +20,33 @@
             die "\$ANDROID_NDK is not defined"  if (!$ndk);
             die "\$ANDROID_NDK=$ndk is invalid" if (!-d "$ndk/platforms");
 
+            my $ndkver = undef;
+
+            if (open my $fh, "<$ndk/source.properties") {
+                local $_;
+                while(<$fh>) {
+                    if (m|Pkg\.Revision\s*=\s*([0-9]+)|) {
+                        $ndkver = $1;
+                        last;
+                    }
+                }
+                close $fh;
+            }
+
             my $sysroot;
 
             if (!($sysroot = $ENV{CROSS_SYSROOT})) {
                 my $api = "*";
 
                 # see if user passed -D__ANDROID_API__=N
-                foreach (@{$useradd{CPPDEFINES}}) {
+                foreach (@{$useradd{CPPDEFINES}}, @{$user{CPPFLAGS}}) {
                     if (m|__ANDROID_API__=([0-9]+)|) {
                         $api = $1;
                         last;
                     }
                 }
 
-                # list available platforms [numerically]
+                # list available platforms (numerically)
                 my @platforms = sort { $a =~ m/-([0-9]+)$/; my $aa = $1;
                                        $b =~ m/-([0-9]+)$/; $aa <=> $1;
                                      } glob("$ndk/platforms/android-$api");
@@ -71,17 +64,24 @@
             my $cflags = "-Wa,--noexecstack";
             my $cppflags;
 
-            # see if user passed CC=clang
-            if ($user{CC} eq "clang") {
-                if (which("clang") !~ m|^$ndk/.*/prebuilt/([^/]+)/|) {
-                    die "no NDK clang on \$PATH";
-                }
+            # see if there is NDK clang on $PATH
+            if (which("clang") =~ m|^$ndk/.*/prebuilt/([^/]+)/|) {
+                my $host=$1;
                 # harmonize with gcc default
-                (my $tridefault = $triarch) =~ s|^arm-|armv5te-|;
-                $cflags .= " -target $tridefault -gcc-toolchain "
-                        . "\$(ANDROID_NDK)/toolchains/$triarch-4.9/prebuilt/$1";
+                my $arm = $ndkver > 16 ? "armv7a" : "armv5te";
+                (my $tridefault = $triarch) =~ s/^arm-/$arm-/;
+                (my $tritools   = $triarch) =~ s/(?:x|i6)86(_64)?-.*/x86$1/;
+                $cflags .= " -target $tridefault "
+                        .  "-gcc-toolchain \$(ANDROID_NDK)/toolchains"
+                        .  "/$tritools-4.9/prebuilt/$host";
+                $user{CC} = "clang" if ($user{CC} !~ m|clang|);
                 $user{CROSS_COMPILE} = undef;
+            } elsif ($user{CC} eq "clang") {
+                die "no NDK clang on \$PATH";
             } else {
+                if (which("$triarch-gcc") !~ m|^$ndk/.*/prebuilt/([^/]+)/|) {
+                    die "no NDK $triarch-gcc on \$PATH";
+                }
                 $cflags .= " -mandroid";
                 $user{CROSS_COMPILE} = "$triarch-";
             }
@@ -138,7 +138,7 @@ my %targets = (
         # ability to engage NEON is not constrained by ABI choice, nor
         # is your ability to call OpenSSL from your application code
         # compiled with floating-point ABI other than default 'soft'.
-        # [Latter thanks to __attribute__((pcs("aapcs"))) declaration.]
+        # (Latter thanks to __attribute__((pcs("aapcs"))) declaration.)
         # This means that choice of ARM libraries you provide in .apk
         # is driven by application needs. For example if application
         # itself benefits from NEON or is floating-point intensive, then
@@ -151,20 +151,24 @@ my %targets = (
         # in order to build "universal" binary and allow OpenSSL take
         # advantage of NEON when it's available.
         #
-        # Keep in mind that [just like with linux-armv4] we rely on
+        # Keep in mind that (just like with linux-armv4) we rely on
         # compiler defaults, which is not necessarily what you had
         # in mind, in which case you would have to pass additional
         # -march and/or -mfloat-abi flags. NDK defaults to armv5te.
+        # Newer NDK versions reportedly require additional -latomic.
         #
         inherit_from     => [ "android", asm("armv4_asm") ],
+        bn_ops           => add("RC4_CHAR"),
     },
     "android-arm64" => {
         inherit_from     => [ "android", asm("aarch64_asm") ],
+        bn_ops           => add("RC4_CHAR"),
         perlasm_scheme   => "linux64",
     },
 
     "android-mips" => {
         inherit_from     => [ "android", asm("mips32_asm") ],
+        bn_ops           => add("RC4_CHAR"),
         perlasm_scheme   => "o32",
     },
     "android-mips64" => {
@@ -178,6 +182,7 @@ my %targets = (
         # prior versions original MIPS binary code will fail.
         #
         inherit_from     => [ "android", asm("mips64_asm") ],
+        bn_ops           => add("RC4_CHAR"),
         perlasm_scheme   => "64",
     },
 
@@ -194,7 +199,7 @@ my %targets = (
     },
 
     ####################################################################
-    # Backward compatible targets, [might] requre $CROSS_SYSROOT
+    # Backward compatible targets, (might) requre $CROSS_SYSROOT
     #
     "android-armeabi" => {
         inherit_from     => [ "android-arm" ],
diff --git a/Configure b/Configure
index 8efd8bf..9b89f60 100755
--- a/Configure
+++ b/Configure
@@ -638,7 +638,9 @@ while (@argvcopy)
 		{
 		s/^([^=]*)/lc($1)/e;
 		}
-	s /^-no-/no-/; # some people just can't read the instructions
+
+	# some people just can't read the instructions, clang people have to...
+	s/^-no-(?!integrated-as)/no-/;
 
 	# rewrite some options in "enable-..." form
 	s /^-?-?shared$/enable-shared/;
diff --git a/INSTALL b/INSTALL
index d53162c..007f6a3 100644
--- a/INSTALL
+++ b/INSTALL
@@ -22,6 +22,7 @@
   * NOTES.VMS (OpenVMS)
   * NOTES.WIN (any supported Windows)
   * NOTES.DJGPP (DOS platform with DJGPP)
+  * NOTES.ANDROID (obviously Android [NDK])
 
  Notational conventions in this document
  ---------------------------------------
diff --git a/NOTES.ANDROID b/NOTES.ANDROID
new file mode 100644
index 0000000..dcddc4c
--- /dev/null
+++ b/NOTES.ANDROID
@@ -0,0 +1,68 @@
+
+ NOTES FOR ANDROID PLATFORMS
+ ===========================
+
+ Requirement details
+ -------------------
+
+ Beside basic tools like perl and make you'll need to download the Android
+ NDK. It's available for Linux, Mac OS X and Windows, but only Linux
+ version was actually tested. There is no reason to believe that Mac OS X
+ wouldn't work. And as for Windows, it's unclear which "shell" would be
+ suitable, MSYS2 might have best chances. NDK version should play lesser
+ role, the goal is to support a range of most recent versions.
+
+ Configuration
+ -------------
+
+ Android is naturally cross-compiled target and you can't use ./config.
+ You have to use ./Configure and name your target explicitly; there are
+ android-arm, android-arm64, android-mips, android-mip64, android-x86
+ and android-x86_64. Do not pass --cross-compile-prefix (as you might
+ be tempted), as it will be "calculated" automatically based on chosen
+ platform. Though you still need to know the prefix to extend your PATH,
+ in order to invoke $(CROSS_COMPILE)gcc and company. (Configure will fail
+ and give you a hint if you get it wrong.) Apart from PATH adjustment
+ you need to set ANDROID_NDK environment to point at NDK directory
+ as /some/where/android-ndk-<ver>. NDK customarily supports multiple
+ Android API levels, e.g. android-14, android-21, etc. By default latest 
+ one available is chosen. If you need to target older platform, pass
+ additional -D__ANDROID_API__=N to Configure. N is numeric value of the
+ target platform version. For example, to compile for ICS on ARM with
+ NDK 10d:
+
+    ANDROID_NDK=/some/where/android-ndk-10d
+    PATH=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.8/prebuild/linux-x86_64/bin:$PATH
+    ./Configure android-arm -D__ANDROID_API__=14
+
+ Caveat lector! Earlier OpenSSL versions relied on additional CROSS_SYSROOT
+ variable set to $ANDROID_NDK/platforms/android-<api>/arch-<arch> to
+ appoint headers-n-libraries' location. It's still recognized in order
+ to facilitate migration from older projects. However, since API level
+ appears in CROSS_SYSROOT value, passing -D__ANDROID_API__=N can be in
+ conflict, and mixing the two is therefore not supported. Migration to
+ CROSS_SYSROOT-less setup is recommended.
+
+ One can engage clang by adjusting PATH to cover NDK's clang. Just keep
+ in mind that if you miss it, Configure will try to use gcc... Also,
+ PATH would need even further adjustment to cover unprefixed, yet
+ target-specific, ar and ranlib (or not, if you use binutils-multiarch
+ on your Linux).
+
+ Running tests (on Linux)
+ ------------------------
+
+ This is not actually supported. Notes are meant rather as inspiration.
+
+ Even though build output targets alien system, it's possible to execute
+ test suite on Linux system by employing qemu-user. The trick is static
+ linking. Pass -static to Configure, then edit generated Makefile and
+ remove occurrences of -ldl and -pie flags. You would also need to pick
+ API version that comes with usable static libraries, 42/2=21 used to
+ work. Once built, you should be able to
+
+    env EXE_SHELL=qemu-<arch> make test
+
+ If you need to pass additional flag to qemu, quotes are your friend, e.g.
+
+    env EXE_SHELL="qemu-mips64el -cpu MIPS64R6-generic" make test
diff --git a/crypto/aes/asm/aes-mips.pl b/crypto/aes/asm/aes-mips.pl
index d81d76d..9334d8f 100644
--- a/crypto/aes/asm/aes-mips.pl
+++ b/crypto/aes/asm/aes-mips.pl
@@ -88,7 +88,7 @@ $pf = ($flavour =~ /nubi/i) ? $t0 : $t2;
 #
 ######################################################################
 
-$big_endian=(`echo MIPSEL | $ENV{CC} -E -`=~/MIPSEL/)?1:0 if ($ENV{CC});
+$big_endian=(`echo MIPSEB | $ENV{CC} -E -`=~/MIPSEB/)?0:1 if ($ENV{CC});
 
 for (@ARGV) {	$output=$_ if (/\w[\w\-]*\.\w+$/);	}
 open STDOUT,">$output";
diff --git a/crypto/sha/asm/sha1-mips.pl b/crypto/sha/asm/sha1-mips.pl
index 71dc722..f6bbfb9 100644
--- a/crypto/sha/asm/sha1-mips.pl
+++ b/crypto/sha/asm/sha1-mips.pl
@@ -75,7 +75,7 @@ if ($flavour =~ /64|n32/i) {
 #
 ######################################################################
 
-$big_endian=(`echo MIPSEL | $ENV{CC} -E -`=~/MIPSEL/)?1:0 if ($ENV{CC});
+$big_endian=(`echo MIPSEB | $ENV{CC} -E -`=~/MIPSEB/)?0:1 if ($ENV{CC});
 
 for (@ARGV) {	$output=$_ if (/\w[\w\-]*\.\w+$/);   }
 open STDOUT,">$output";
diff --git a/crypto/sha/asm/sha512-mips.pl b/crypto/sha/asm/sha512-mips.pl
index e6fd268..285a717 100644
--- a/crypto/sha/asm/sha512-mips.pl
+++ b/crypto/sha/asm/sha512-mips.pl
@@ -81,7 +81,7 @@ $pf = ($flavour =~ /nubi/i) ? $t0 : $t2;
 #
 ######################################################################
 
-$big_endian=(`echo MIPSEL | $ENV{CC} -E -`=~/MIPSEL/)?1:0 if ($ENV{CC});
+$big_endian=(`echo MIPSEB | $ENV{CC} -E -`=~/MIPSEB/)?0:1 if ($ENV{CC});
 
 for (@ARGV) {	$output=$_ if (/\w[\w\-]*\.\w+$/);	}
 open STDOUT,">$output";


More information about the openssl-commits mailing list