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