HsOpenSSL icon indicating copy to clipboard operation
HsOpenSSL copied to clipboard

Building on MacOS for x86_64 architecture

Open bapcyk opened this issue 2 years ago • 2 comments

I am trying to use the library on arm-based MacOS which support both architectures (arm64, x86_64), it's so called "M1":

$ sw_vers
ProductName:            macOS
ProductVersion:         13.0.1
BuildVersion:           22A400
$ arch
arm64

and when I compile my application using the library for arm64 architecture - no problem (but it requires sudo ln -sf /opt/homebrew/Cellar/openssl@3/3.0.7 /usr/local/opt/openssl).

But when I try to switch to x86_64, I get an error like:

dlopen(/Xxx/.stack/snapshots/x86_64-osx/b1...50/9.2.5/lib/x86_64-osx-ghc-9.2.5/libHSHsOpenSSL-0.11.7.2-1JX1qBi8YfpGDjk1ra3OXq-ghc9.2.5.dylib, 0x0005): symbol not found in flat namespace '_DSA_free'

I do it by:

stack --resolver lts-20.4 --arch x86_64 build

and installed openssl with brew arch -x86_64 ./brew install openssl@3 from the folder (/usr/local/homebrew) where I installed Homebrew for x86_64.

I tried flags as well, but it does not help.

Not sure, why it happens, maybe it tries to use arm64 library. Any help is appreciated.

bapcyk avatar Feb 01 '23 16:02 bapcyk

After some research I realized that errors like:

<command line>: dlopen(/XXXXX/.stack/snapshots/x86_64-osx/b1d675598b9b6c5f516e03f82c45d01becd6003e6128005b2b4acb8628b0f350/9.2.5/lib/x86_64-osx-ghc-9.2.5/libHSHsOpenSSL-0.11.7.2-1JX1qBi8YfpGDjk1ra3OXq-ghc9.2.5.dylib, 0x0005): symbol not found in flat namespace '_DSA_free'

happens during compilation of files containing things related to templates, like $(embedDir ...) and similar and in Lens related things. For example, it happens during compilation of a module like this one:

{-# LANGUAGE FlexibleInstances      #-}
{-# LANGUAGE FunctionalDependencies #-}

module MyUtilities.Lens where

import Control.Lens ( makePrisms, makeFieldsNoPrefix )
import MyUtilities.Network ( Error, NetData )

makePrisms ''Error
makeFieldsNoPrefix ''NetData

It looks like a template Haskell tries to link HsOpenSSL but it does not know folders where are openssl's .dylib files. I added them into a sub-folder of the project and set extra-lib-dirs:

package.yaml:

...
extra-lib-dirs:
  - libs/ssl
...

but it does not help.

PS. openssl libs are in /usr/local/opt/openssl/lib also (as the HsOpenSSL cabal's expects) - I have them in libs/ssl and in /usr/local/opt/openssl/lib - the same libs for x86_64.

Any suggestions?

bapcyk avatar Feb 02 '23 08:02 bapcyk

The problem file libHSHsOpenSSL-0.11.7.2-1JX1qBi8YfpGDjk1ra3OXq-ghc9.2.5.dylib (it's in .stack snapshot dir for x86_64) depends on some libraries, but libcrypto is not among them (libcrypto is the library exporting problem symbol _DSA_free). And it imports some symbols, one of them is _DSA_free. No idea is it OK, it looks strange

dyld_info -dependents -imports /Xxxxx/.stack/snapshots/x86_64-osx/b1d675598b9b6c5f516e03f82c45d01becd6003e6128005b2b4acb8628b0f350/9.2.5/lib/x86_64-osx-ghc-9.2.5/libHSHsOpenSSL-0.11.7.2-1JX1qBi8YfpGDjk1ra3OXq-ghc9.2.5.dylib
/Xxxxx/.stack/snapshots/x86_64-osx/b1d675598b9b6c5f516e03f82c45d01becd6003e6128005b2b4acb8628b0f350/9.2.5/lib/x86_64-osx-ghc-9.2.5/libHSHsOpenSSL-0.11.7.2-1JX1qBi8YfpGDjk1ra3OXq-ghc9.2.5.dylib [x86_64]:
    -dependents:
        attributes     load path
                       @rpath/libHSnetwork-3.1.2.7-L5OzboM5UdW3uPk8hB4dqj-ghc9.2.5.dylib
                       @rpath/libHStime-1.11.1.1-ghc9.2.5.dylib
                       @rpath/libHSbytestring-0.11.3.1-ghc9.2.5.dylib
                       @rpath/libHSbase-4.16.4.0-ghc9.2.5.dylib
                       @rpath/libHSghc-bignum-1.2-ghc9.2.5.dylib
                       @rpath/libHSghc-prim-0.8.0-ghc9.2.5.dylib
                       /usr/lib/libSystem.B.dylib
0x0000  0xFFFFFFFE  _DSA_free
0x0001  0xFFFFFFFE  _EVP_CIPHER_CTX_free
0x0002  0xFFFFFFFE  _EVP_MD_CTX_free
0x0003  0xFFFFFFFE  _EVP_PKEY_free

The similar file but in the snapshot for ARM64 platform:

dyld_info -dependents -imports libHSHsOpenSSL-0.11.7.2-1JX1qBi8YfpGDjk1ra3OXq-ghc9.2.5.dylib
libHSHsOpenSSL-0.11.7.2-1JX1qBi8YfpGDjk1ra3OXq-ghc9.2.5.dylib [arm64]:
    -dependents:
        attributes     load path
                       /opt/homebrew/opt/openssl@3/lib/libssl.3.dylib
                       /opt/homebrew/opt/openssl@3/lib/libcrypto.3.dylib
                       @rpath/libHSnetwork-3.1.2.7-L5OzboM5UdW3uPk8hB4dqj-ghc9.2.5.dylib
                       @rpath/libHStime-1.11.1.1-ghc9.2.5.dylib
                       @rpath/libHSbytestring-0.11.3.1-ghc9.2.5.dylib
                       @rpath/libHSbase-4.16.4.0-ghc9.2.5.dylib
                       @rpath/libHSghc-bignum-1.2-ghc9.2.5.dylib
                       @rpath/libHSghc-prim-0.8.0-ghc9.2.5.dylib
                       /usr/lib/libSystem.B.dylib
0x0000  0xFFFFFFFE  _stable_ptr_table
0x0001  0xFFFFFFFE  _stg_CHARLIKE_closure
0x0002  0xFFFFFFFE  _stg_INTLIKE_closure
0x0003  0xFFFFFFFE  _stg_INTLIKE_closure+0xCB1
0x0004  0xFFFFFFFE  _stg_INTLIKE_closure+0x301
0x0005  0xFFFFFFFE  _stg_INTLIKE_closure+0xCB1

imports explicitly libssl and libcrypto and no _DSA_free symbol (and Co) in imports section output.

And the same files examined with otool -l ...

for ARM64:

...
Load command 11
          cmd LC_LOAD_DYLIB
      cmdsize 72
         name /opt/homebrew/opt/openssl@3/lib/libssl.3.dylib (offset 24)
   time stamp 2 Thu Jan  1 02:00:02 1970
      current version 3.0.0
compatibility version 3.0.0
Load command 12
          cmd LC_LOAD_DYLIB
      cmdsize 80
         name /opt/homebrew/opt/openssl@3/lib/libcrypto.3.dylib (offset 24)
   time stamp 2 Thu Jan  1 02:00:02 1970
      current version 3.0.0
compatibility version 3.0.0
Load command 13
          cmd LC_LOAD_DYL...
...

ie, it tries to load ssl, crypto lib, but for x86_64 nothing related to these libraries.

bapcyk avatar Feb 02 '23 11:02 bapcyk