Home | History | Annotate | Line # | Download | only in dist
NOTES-UNIX.md revision 1.1
      1 Notes for UNIX-like platforms
      2 =============================
      3 
      4  For Unix/POSIX runtime systems on Windows,
      5  please see the [Notes for Windows platforms](NOTES-WINDOWS.md).
      6 
      7  OpenSSL uses the compiler to link programs and shared libraries
      8  ---------------------------------------------------------------
      9 
     10  OpenSSL's generated Makefile uses the C compiler command line to
     11  link programs, shared libraries and dynamically loadable shared
     12  objects.  Because of this, any linking option that's given to the
     13  configuration scripts MUST be in a form that the compiler can accept.
     14  This varies between systems, where some have compilers that accept
     15  linker flags directly, while others take them in `-Wl,` form.  You need
     16  to read your compiler documentation to figure out what is acceptable,
     17  and `ld(1)` to figure out what linker options are available.
     18 
     19  Shared libraries and installation in non-default locations
     20  ----------------------------------------------------------
     21 
     22  Every Unix system has its own set of default locations for shared
     23  libraries, such as `/lib`, `/usr/lib` or possibly `/usr/local/lib`.  If
     24  libraries are installed in non-default locations, dynamically linked
     25  binaries will not find them and therefore fail to run, unless they get
     26  a bit of help from a defined runtime shared library search path.
     27 
     28  For OpenSSL's application (the `openssl` command), our configuration
     29  scripts do NOT generally set the runtime shared library search path for
     30  you.  It's therefore advisable to set it explicitly when configuring,
     31  unless the libraries are to be installed in directories that you know
     32  to be in the default list.
     33 
     34  Runtime shared library search paths are specified with different
     35  linking options depending on operating system and versions thereof, and
     36  are talked about differently in their respective documentation;
     37  variations of RPATH are the most usual (note: ELF systems have two such
     38  tags, more on that below).
     39 
     40  Possible options to set the runtime shared library search path include
     41  the following:
     42 
     43     -Wl,-rpath,/whatever/path   # Linux, *BSD, etc.
     44     -R /whatever/path           # Solaris
     45     -Wl,-R,/whatever/path       # AIX (-bsvr4 is passed internally)
     46     -Wl,+b,/whatever/path       # HP-UX
     47     -rpath /whatever/path       # Tru64, IRIX
     48 
     49  OpenSSL's configuration scripts recognise all these options and pass
     50  them to the Makefile that they build. (In fact, all arguments starting
     51  with `-Wl,` are recognised as linker options.)
     52  Please note that 'l' in '-Wl' is lowercase L and not 1.
     53 
     54  Please do not use verbatim directories in your runtime shared library
     55  search path!  Some OpenSSL config targets add an extra directory level
     56  for multilib installations.  To help with that, the produced Makefile
     57  includes the variable LIBRPATH, which is a convenience variable to be
     58  used with the runtime shared library search path options, as shown in
     59  this example:
     60 
     61     $ ./Configure --prefix=/usr/local/ssl --openssldir=/usr/local/ssl \
     62         '-Wl,-rpath,$(LIBRPATH)'
     63 
     64  On modern ELF based systems, there are two runtime search paths tags to
     65  consider, `DT_RPATH` and `DT_RUNPATH`.  Shared objects are searched for in
     66  this order:
     67 
     68   1. Using directories specified in DT_RPATH, unless DT_RUNPATH is also set.
     69   2. Using the environment variable LD_LIBRARY_PATH
     70   3. Using directories specified in DT_RUNPATH.
     71   4. Using system shared object caches and default directories.
     72 
     73  This means that the values in the environment variable `LD_LIBRARY_PATH`
     74  won't matter if the library is found in the paths given by `DT_RPATH`
     75  (and `DT_RUNPATH` isn't set).
     76 
     77  Exactly which of `DT_RPATH` or `DT_RUNPATH` is set by default appears to
     78  depend on the system.  For example, according to documentation,
     79  `DT_RPATH` appears to be deprecated on Solaris in favor of `DT_RUNPATH`,
     80  while on Debian GNU/Linux, either can be set, and `DT_RPATH` is the
     81  default at the time of writing.
     82 
     83  How to choose which runtime search path tag is to be set depends on
     84  your system, please refer to ld(1) for the exact information on your
     85  system.  As an example, the way to ensure the `DT_RUNPATH` is set on
     86  Debian GNU/Linux systems rather than DT_RPATH is to tell the linker to
     87  set new dtags, like this:
     88 
     89     $ ./Configure --prefix=/usr/local/ssl --openssldir=/usr/local/ssl \
     90         '-Wl,--enable-new-dtags,-rpath,$(LIBRPATH)'
     91 
     92  It might be worth noting that some/most ELF systems implement support
     93  for runtime search path relative to the directory containing current
     94  executable, by interpreting `$ORIGIN` along with some other internal
     95  variables. Consult your system documentation.
     96 
     97  Linking your application
     98  ------------------------
     99 
    100  Third-party applications dynamically linked with OpenSSL (or any other)
    101  shared library face exactly the same problem with non-default locations.
    102  The OpenSSL config options mentioned above might or might not have bearing
    103  on linking of the target application. "Might" means that under some
    104  circumstances, it would be sufficient to link with OpenSSL shared library
    105  "naturally", i.e. with `-L/whatever/path -lssl -lcrypto`. But there are
    106  also cases when you'd have to explicitly specify runtime search path
    107  when linking your application. Consult your system documentation and use
    108  above section as inspiration...
    109 
    110  Shared OpenSSL builds also install static libraries. Linking with the
    111  latter is likely to require special care because linkers usually look
    112  for shared libraries first and tend to remain "blind" to static OpenSSL
    113  libraries. Referring to system documentation would suffice, if not for
    114  a corner case. On AIX static libraries (in shared build) are named
    115  differently, add `_a` suffix to link with them, e.g. `-lcrypto_a`.
    116