On 13/11/2019 15:23, Michael Wojcik wrote:
From: openssl-users [mailto:openssl-users-boun...@openssl.org] On Behalf Of 
Aijaz Baig
Sent: Wednesday, November 13, 2019 01:45
I am trying to statically link libssl.a and libcrypto.a into a static library 
of my own
which I will be using in an application (Linux).
You can't link anything into a Linux static library, technically.

ELF static libraries, like the older UNIX static libraries they're descended 
from, are just collections of object files, possibly with some additional 
metadata. (In BSD 4.x, for example, libraries often had an index member added 
using the ranlib utility, so that the linker didn't have to search the entire 
library for each symbol.)
Actually, that is also the format and mechanism with Microsoft Win32 tools,
they just use the DOS-like file name "foo.lib" instead of "libfoo.a" to
maintain makefile compatibility with their older Intel OMF-based toolchains.

The object files inside the archive are in COFF format, as they seem to
have used Unix tools to bring up the initial "NT" operating system
internally back before the initial 1993 release.

On some platforms, where objects can be relinked, the constituent object files 
produced by compiling source files are sometimes combined into a single large 
object. This is most often seen on AIX, which uses IBM's XCOFF object format 
(an enhanced COFF); XCOFF supports relinking objects, so you can bundle objects 
up this way and save some time in symbol resolution when you link against the 
library later. But even on AIX this is commonly seen with dynamic libraries and 
relatively rare for static ones.

Normally the linker isn't even involved in creating a static library. You 
compile sources to objects, and then use ar(1) to create the static library. 
The makefile you posted to StackOverflow doesn't include this step, so it's 
hard to tell what exactly you're doing.

But in any case, linking a static library against another static library is 
essentially a no-op.

What you *can* do, if you don't want to have to list your library and the 
OpenSSL libraries when linking your application, is combine multiple static 
libraries into a single one - provided the object names don't conflict. This is 
straightforward:

$ mkdir tmp; cd tmp
$ ar x /path/to/libssl.a
$ ar x /path/to/libcrypto.a
$ cp /path/to/your/objects/*.o .
$ ar c ../your-library.a *.o
$ cd ..
$ rm -rf tmp

(Untested, but see the ar manpage if you run into issues.)

That should create a single archive library containing all the objects from the 
three input libraries. Again, it relies on there being no filename clashes 
among the objects; if there are, you'll have to rename some of them.
Note: I seem to recall from a long time ago that GNU ar can combine
static libraries directly (without all those temporary file names).

In BinUtils 2.25 this was apparently done by invoking ar in "MRI
compatibility mode" and using the script command "ADDLIB" inside
the provided MRI-style linker script.  For more details see the
"ar scripts" part of the full GNU BinUtils TexInfo manual.

Enjoy

Jakob
--
Jakob Bohm, CIO, Partner, WiseMo A/S.  https://www.wisemo.com
Transformervej 29, 2860 Søborg, Denmark.  Direct +45 31 13 16 10
This public discussion message is non-binding and may contain errors.
WiseMo - Remote Service Management for PCs, Phones and Embedded

Reply via email to