From d865cf9e62f2a9ecd5d1ba69f64d4b715eba6e24 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Wed, 22 Mar 2017 17:26:25 -0400 Subject: [PATCH] Fix OpenBSD 6.0 compile with GCC 4.9 (Issue 395) This check-in also enables the 64-bit RDRAND routines for X32. The changes were with held until they could be tested. The testing occurred with Issue 395 --- CMakeLists.txt | 4 ++++ GNUmakefile | 35 +++++++++++++++++++---------------- rdrand-nasm.sh | 34 ++++++++++++++++++++++++++++------ rdrand.cpp | 16 ++++++++-------- 4 files changed, 59 insertions(+), 30 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c39d3cb1..00a9de03 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,14 +88,18 @@ if(IS_BIG_ENDIAN) add_definitions(-DIS_BIG_ENDIAN) endif() +# No DISABLE_NATIVE_ARCH with DISABLE_ASM for now +# See http://github.com/weidai11/cryptopp/issues/395 if(DISABLE_ASM) add_definitions(-DCRYPTOPP_DISABLE_ASM) endif() if(DISABLE_SSSE3) add_definitions(-DCRYPTOPP_DISABLE_SSSE3) + set(DISABLE_NATIVE_ARCH 1) endif() if(DISABLE_AESNI) add_definitions(-DCRYPTOPP_DISABLE_AESNI) + set(DISABLE_NATIVE_ARCH 1) endif() if(NOT CRYPTOPP_DATA_DIR STREQUAL "") add_definitions(-DCRYPTOPP_DATA_DIR="${CRYPTOPP_DATA_DIR}") diff --git a/GNUmakefile b/GNUmakefile index 450db26c..a666c357 100755 --- a/GNUmakefile +++ b/GNUmakefile @@ -157,6 +157,23 @@ ifeq ($(IS_X86)$(IS_X32)$(IS_CYGWIN)$(IS_MINGW)$(SUN_COMPILER),00000) endif endif +# .intel_syntax wasn't supported until GNU assembler 2.10 +# No DISABLE_NATIVE_ARCH with CRYPTOPP_DISABLE_ASM for now +# See http://github.com/weidai11/cryptopp/issues/395 +ifeq ($(HAVE_GAS)$(GAS210_OR_LATER),10) +CXXFLAGS += -DCRYPTOPP_DISABLE_ASM +else +ifeq ($(HAVE_GAS)$(GAS217_OR_LATER),10) +CXXFLAGS += -DCRYPTOPP_DISABLE_SSSE3 +DISABLE_NATIVE_ARCH := 1 +else +ifeq ($(HAVE_GAS)$(GAS219_OR_LATER),10) +CXXFLAGS += -DCRYPTOPP_DISABLE_AESNI +DISABLE_NATIVE_ARCH := 1 +endif +endif +endif + # BEGIN NATIVE_ARCH # Guard use of -march=native (or -m{32|64} on some platforms) # Don't add anything if -march=XXX or -mtune=XXX is specified @@ -220,19 +237,6 @@ CXXFLAGS += -DCRYPTOPP_CLANG_INTEGRATED_ASSEMBLER=1 endif endif -# .intel_syntax wasn't supported until GNU assembler 2.10 -ifeq ($(HAVE_GAS)$(GAS210_OR_LATER),10) -CXXFLAGS += -DCRYPTOPP_DISABLE_ASM -else -ifeq ($(HAVE_GAS)$(GAS217_OR_LATER),10) -CXXFLAGS += -DCRYPTOPP_DISABLE_SSSE3 -else -ifeq ($(HAVE_GAS)$(GAS219_OR_LATER),10) -CXXFLAGS += -DCRYPTOPP_DISABLE_AESNI -endif -endif -endif - # GCC on Solaris needs -m64. Otherwise, i386 is default # http://github.com/weidai11/cryptopp/issues/230 ifeq ($(IS_SUN)$(GCC_COMPILER)$(IS_X64),111) @@ -762,9 +766,8 @@ endif # Dependencies ifeq ($(USE_NASM),1) rdrand.o: rdrand.h rdrand.cpp rdrand.S $(CXX) $(strip $(CXXFLAGS)) -DNASM_RDRAND_ASM_AVAILABLE=1 -DNASM_RDSEED_ASM_AVAILABLE=1 -c rdrand.cpp -rdrand-x86.o: ; -rdrand-x32.o: ; -rdrand-x64.o: ; +rdrand-%.o: + ./rdrand-nasm.sh endif # Only use CRYPTOPP_DATA_DIR if its not set in CXXFLAGS diff --git a/rdrand-nasm.sh b/rdrand-nasm.sh index c0b50588..8fb68597 100755 --- a/rdrand-nasm.sh +++ b/rdrand-nasm.sh @@ -1,42 +1,64 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh IS_LINUX=$(uname -s | grep -i -c linux) IS_SOLARIS=$(uname -s | grep -i -c sunos) IS_DARWIN=$(uname -s | grep -i -c darwin) IS_CYGWIN=$(uname -s | grep -i -c cygwin) +IS_OPENBSD=$(uname -s | grep -i -c openbsd) +IS_DRAGONFLY=$(uname -s | grep -i -c dragonfly) +IS_FREEBSD=$(uname -s | grep -i -c freebsd) +IS_NETBSD=$(uname -s | grep -i -c netbsd) rm -f rdrand-x86.o rdrand-x32.o rdrand-x64.o &>/dev/null +SUCCESS=0 NASM=$(which nasm 2>&1) -if [[ ! -f "$NASM" ]]; then +if [ ! -f "$NASM" ]; then echo "Unable to locate Nasm" [ "$0" = "$BASH_SOURCE" ] && exit 1 || return 1 fi -if [[ "$IS_LINUX" -eq "1" ]]; then +if [ "$IS_LINUX" -eq "1" ]; then echo "Building rdrand and rdseed modules for Linux" nasm -f elf32 rdrand.S -DX86 -g -o rdrand-x86.o nasm -f elfx32 rdrand.S -DX32 -g -o rdrand-x32.o nasm -f elf64 rdrand.S -DX64 -g -o rdrand-x64.o + SUCCESS=1 fi -if [[ "$IS_SOLARIS" -eq "1" ]]; then +if [ "$IS_OPENBSD" -eq "1" ] || [ "$IS_NETBSD" -eq "1" ] || [ "$IS_FREEBSD" -eq "1" ] || [ "$IS_DRAGONFLY" -eq "1" ]; then + echo "Building rdrand and rdseed modules for BSD" + nasm -f elf32 rdrand.S -DX86 -g -o rdrand-x86.o + nasm -f elfx32 rdrand.S -DX32 -g -o rdrand-x32.o + nasm -f elf64 rdrand.S -DX64 -g -o rdrand-x64.o + SUCCESS=1 +fi + +if [ "$IS_SOLARIS" -eq "1" ]; then echo "Building rdrand and rdseed modules for Solaris" nasm -f elf32 rdrand.S -DX86 -o rdrand-x86.o nasm -f elfx32 rdrand.S -DX32 -o rdrand-x32.o nasm -f elf64 rdrand.S -DX64 -o rdrand-x64.o + SUCCESS=1 fi -if [[ "$IS_DARWIN" -eq "1" ]]; then +if [ "$IS_DARWIN" -eq "1" ]; then echo "Building rdrand and rdseed modules for Darwin" nasm -f macho32 rdrand.S -DDARWIN -DX86 -g -o rdrand-x86.o nasm -f macho64 rdrand.S -DDARWIN -DX64 -g -o rdrand-x64.o + SUCCESS=1 fi -if [[ "$IS_CYGWIN" -eq "1" ]]; then +if [ "$IS_CYGWIN" -eq "1" ]; then echo "Building rdrand and rdseed modules for Cygwin" nasm -f win32 rdrand.S -DCYGWIN -DX86 -g -o rdrand-x86.o nasm -f win64 rdrand.S -DCYGWIN -DX64 -g -o rdrand-x64.o + SUCCESS=1 +fi + +if [ "$SUCCESS" -eq "0" ]; then + echo "Failed to build rdrand and rdseed modules" + [ "$0" = "$BASH_SOURCE" ] && exit 1 || return 1 fi [ "$0" = "$BASH_SOURCE" ] && exit 0 || return 0 diff --git a/rdrand.cpp b/rdrand.cpp index 74ecc34e..75889f1d 100644 --- a/rdrand.cpp +++ b/rdrand.cpp @@ -160,7 +160,7 @@ inline void RDRAND32(void* output) #endif } -#if CRYPTOPP_BOOL_X64 +#if CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 // Fills 8 bytes inline void RDRAND64(void* output) { @@ -198,7 +198,7 @@ inline void RDRAND64(void* output) throw NotImplemented("RDRAND: failed to find an implementation"); #endif } -#endif // CRYPTOPP_BOOL_X64 and RDRAND64 +#endif // CRYPTOPP_BOOL_X64, CRYPTOPP_BOOL_X32 and RDRAND64 void RDRAND::GenerateBlock(byte *output, size_t size) { @@ -213,7 +213,7 @@ void RDRAND::GenerateBlock(byte *output, size_t size) MASM_RDRAND_GenerateBlock(output, size); -#elif CRYPTOPP_BOOL_X64 +#elif CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 size_t i = 0; for (i = 0; i < size/8; i++) RDRAND64(reinterpret_cast(output)+i); @@ -227,7 +227,7 @@ void RDRAND::GenerateBlock(byte *output, size_t size) RDRAND64(&val); std::memcpy(output, &val, size); } -#elif (CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X86) +#elif CRYPTOPP_BOOL_X86 size_t i = 0; for (i = 0; i < size/4; i++) RDRAND32(reinterpret_cast(output)+i); @@ -304,7 +304,7 @@ inline void RDSEED32(void* output) #endif } -#if CRYPTOPP_BOOL_X64 +#if CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 // Fills 8 bytes inline void RDSEED64(void* output) { @@ -357,7 +357,7 @@ void RDSEED::GenerateBlock(byte *output, size_t size) MASM_RDSEED_GenerateBlock(output, size); -#elif CRYPTOPP_BOOL_X64 +#elif CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 size_t i = 0; for (i = 0; i < size/8; i++) RDSEED64(reinterpret_cast(output)+i); @@ -371,7 +371,7 @@ void RDSEED::GenerateBlock(byte *output, size_t size) RDSEED64(&val); std::memcpy(output, &val, size); } -#elif (CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X86) +#elif CRYPTOPP_BOOL_X86 size_t i = 0; for (i = 0; i < size/4; i++) RDSEED32(reinterpret_cast(output)+i); @@ -385,7 +385,7 @@ void RDSEED::GenerateBlock(byte *output, size_t size) RDSEED32(&val); std::memcpy(output, &val, size); } -#endif +#endif // CRYPTOPP_BOOL_X64, CRYPTOPP_BOOL_X32 and RDSEED64 } void RDSEED::DiscardBytes(size_t n)