As a followup to my previous post (http://www.escribe.com/software/crypto/m2475.html), I believe that I have successfully built and installed Crypto++ 5.0 on Mac OS X 10.2.3 (Jaguar) using the Apple Developer Tools December 2002 gcc 3.1 compiler. It passes the verification tests (cryptest.exe v) and the RSA key test (cryptest.exe g) Besides the code tweak listed in my previous post, one must do four things to get it to properly build and run:
1. Mac OS X uses mach-o files, not ELF files as it's executable format. As per the man page for libtool(1), libtool replaces ar and ranlib on OS X. So you need to edit the GNUmakefile entry for libcryptopp.a so that instead of this:
libcryptopp.a: $(LIBOBJS)
$(AR) $(ARFLAGS) $@ $(LIBOBJS)
$(RANLIB) $@it reads:
libcryptopp.a: $(LIBOBJS)
libtool -static -o $@ $(LIBOBJS)
$(RANLIB) $@And in fact I think that the RANLIB line is unnecessary (but does not hurt).
2. The following CFLAGS worked for me:
CXXFLAGS = -g -no-cpp-precomp -Wno-deprecated -fPIC
Note that there is a line which states
ifeq ($(UNAME),Darwin) # -fpic conflicts with inline asm in ... CXX = g++ CXXFLAGS += -fno-pic
In this case the -fno-pic is a bad idea; at least for building on OS X it seems to be necessary to have -fPIC.
3. It appears that my powerpc did not detect as big endian so it defaulted to little endian. To fix this, edit config.h and just above the line which says
#ifndef IS_BIG_ENDIAN
add a line saying #define IS_BIG_ENDIAN.
4. Finally, I found that the OS-supplied blocking random number generator failed the verification test. Therefore, near the bottom of config.h, comment out the line saying
#define BLOCKING_RNG_AVAILABLE
in the #if (defined(__FreeBSD__) ...) block.
And that should do it. Hope this helps... I have attached a diff with these changes.
-Jason
-- /******************************************************************************
Jason Arnold / Sandia National Laboratories
jdarnol @ ca . sandia . gov / (925) 294-3693******************************************************************************/
diff -C 5 crypto50/GNUmakefile crypto50-osx/GNUmakefile
*** crypto50/GNUmakefile Fri Aug 30 18:17:12 2002
--- crypto50-osx/GNUmakefile Wed Feb 19 13:50:06 2003
***************
*** 1,23 ****
# can't use -fno-rtti yet because it causes problems with exception handling in GCC
2.95.2
! CXXFLAGS = -g
# uncomment the next two lines to do a release build
# CXXFLAGS = -O2 -DNDEBUG -ffunction-sections -fdata-sections
# LDFLAGS = -Wl,--gc-sections
ARFLAGS = -cr # ar needs the dash on OpenBSD
RANLIB = ranlib
UNAME = $(shell uname)
ifeq ($(UNAME),) # for DJGPP, where uname doesn't exist
CXXFLAGS += -mbnu210
else
CXXFLAGS += -pipe
endif
ifeq ($(UNAME),Darwin) # -fpic conflicts with inline asm in integer.cpp on
i386
! CXX = c++
! CXXFLAGS += -fno-pic
endif
ifeq ($(UNAME),SunOS)
LDLIBS = -lnsl -lsocket
endif
--- 1,26 ----
# can't use -fno-rtti yet because it causes problems with exception handling in GCC
2.95.2
! CXXFLAGS = -g -Wno-deprecated -no-cpp-precomp
# uncomment the next two lines to do a release build
# CXXFLAGS = -O2 -DNDEBUG -ffunction-sections -fdata-sections
# LDFLAGS = -Wl,--gc-sections
ARFLAGS = -cr # ar needs the dash on OpenBSD
RANLIB = ranlib
+ LIBTOOL = libtool
+ LTFLAGS = -static
+
UNAME = $(shell uname)
ifeq ($(UNAME),) # for DJGPP, where uname doesn't exist
CXXFLAGS += -mbnu210
else
CXXFLAGS += -pipe
endif
ifeq ($(UNAME),Darwin) # -fpic conflicts with inline asm in integer.cpp on
i386
! CXX = g++
! CXXFLAGS += -fPIC
endif
ifeq ($(UNAME),SunOS)
LDLIBS = -lnsl -lsocket
endif
***************
*** 41,51 ****
clean:
$(RM) cryptest.exe libcryptopp.a $(LIBOBJS) $(TESTOBJS)
libcryptopp.a: $(LIBOBJS)
! $(AR) $(ARFLAGS) $@ $(LIBOBJS)
$(RANLIB) $@
cryptest.exe: libcryptopp.a $(TESTOBJS)
$(CXX) -o $@ $(CXXFLAGS) $(TESTOBJS) -L. -lcryptopp $(LDFLAGS) $(LDLIBS)
--- 44,54 ----
clean:
$(RM) cryptest.exe libcryptopp.a $(LIBOBJS) $(TESTOBJS)
libcryptopp.a: $(LIBOBJS)
! $(LIBTOOL) $(LTFLAGS) -o $@ $(LIBOBJS)
$(RANLIB) $@
cryptest.exe: libcryptopp.a $(TESTOBJS)
$(CXX) -o $@ $(CXXFLAGS) $(TESTOBJS) -L. -lcryptopp $(LDFLAGS) $(LDLIBS)
diff -C 5 crypto50/config.h crypto50-osx/config.h
*** crypto50/config.h Fri Aug 30 18:59:32 2002
--- crypto50-osx/config.h Wed Feb 19 13:52:44 2003
***************
*** 6,15 ****
--- 6,19 ----
// define this if running on a big-endian CPU
#if !defined(IS_LITTLE_ENDIAN) && (defined(__sparc) || defined(__sparc__) ||
defined(__hppa__) || defined(__PPC__) || defined(__mips__) || (defined(__MWERKS__) &&
!defined(__INTEL__)))
# define IS_BIG_ENDIAN
#endif
+ #if defined(__MACH__) // Mac OS X
+ # define IS_BIG_ENDIAN
+ #endif
+
// define this if running on a little-endian CPU
// big endian will be assumed if IS_LITTLE_ENDIAN is not defined
#ifndef IS_BIG_ENDIAN
# define IS_LITTLE_ENDIAN
#endif
***************
*** 225,235 ****
# define OS_RNG_AVAILABLE
#endif
#if (defined(__FreeBSD__) || defined(__linux__) || defined(__MACH__))
# define NONBLOCKING_RNG_AVAILABLE
! # define BLOCKING_RNG_AVAILABLE
# define OS_RNG_AVAILABLE
#endif
#ifdef __unix__
# define HAS_PTHREADS
--- 229,239 ----
# define OS_RNG_AVAILABLE
#endif
#if (defined(__FreeBSD__) || defined(__linux__) || defined(__MACH__))
# define NONBLOCKING_RNG_AVAILABLE
! // define BLOCKING_RNG_AVAILABLE
# define OS_RNG_AVAILABLE
#endif
#ifdef __unix__
# define HAS_PTHREADS
