xref: /netbsd-src/crypto/external/bsd/openssl/dist/NOTES-UNIX.md (revision b0d1725196a7921d003d2c66a14f186abda4176b)
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