Reducing the footprint of a simple application

Jakob Bohm jb-openssl at wisemo.com
Tue Sep 14 09:58:49 UTC 2021


Hi fellow sufferer,

I used to do a lot of manual patching of OpenSSL 1.0.x to remove the 
insane object interdependencies (such as objects named foolib.c being 
nexus points that bring in tonnes of irrelevant code because someone was 
too unfamiliar with basic library concepts to make an actual library 
instead of a monolithic file).

However the rush to repeatedly rewrite and deprecate everything after 
the new people joined the OpenSSL project made maintaining the needed 
patches too time consuming.

Some day, I will have to start over turning the 3.0.x code into an 
actual library while removing linker mishandling, low security RNGs and 
other antifeatures.

On 2021-09-12 19:34, Reinier Torenbeek wrote:
> Hi,
>
> I have a simple application that uses OpenSSL 3.0.0 for AES-GCM 
> encryption and decryption only. Looking at the size of the binary on 
> disc, I see it's a few KBs when linking dynamically with libcrypto, 
> and  4.8 MB when linking statically. Although I know the large 
> footprint of OpenSSL is considered "a fact of life", this seems 
> excessive. From experience with other crypto implementations, I know 
> that the *actual* crypto functionality that I am using can fit in 10s 
> of KBsand I would like to understand the reasons for OpenSSL's size 
> better. I am on Linux, 64 bits, using gcc 9.3.0.
>
> Some analysis of the binary reveals (not surprisingly) that it 
> contains many OpenSSL symbols that have nothing to do with the 
> functionality that I am using. Those seem to get pulled in because 
> objects get linked in as a whole and apparently the layout of the 
> object contents are such that the symbols needed for my functionality 
> are spread out over many different objects.
>
> It was my hope that I could mitigate this by compiling OpenSSL and my 
> application with the flags -ffunction-sections, -fdata-sections, -Os 
> and -flto and using --gc-sections and -flto when linking. (See 3.10 
> Options That Control Optimization 
> <https://gcc.gnu.org/onlinedocs/gcc-9.4.0/gcc/Optimize-Options.html#Optimize-Options> of 
> GCC's documentation).  This did reduce the binary size by 2 MB, 
> leaving me with almost 3 MB. Almost 90% of that was in the text 
> section and a bit over 10% in the data section. I do not have 
> sufficient experience with these options to assess how well the 
> optimizations worked in this case, I think the resulting binary is 
> still pretty large.
>
> I have not tried disabling any of the features when building OpenSSL. 
> I suspect that may help a little bit because it may result in a 
> decrease in size of (some) objects, but I have seen people reporting 
> disappointing results of that on the web. Also, it does not seem to be 
> a workable approach in general to have to figure out which build 
> options to use and to have to rebuild OpenSSL for every type of 
> application that I create.
>
> Did any people here try similar things, with better results? Does 
> anybody have any other suggestions as to what I could try? And what is 
> the explanation (or justification) for this excessive footprint?
>
> Thanks,
> Reinier

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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mta.openssl.org/pipermail/openssl-users/attachments/20210914/b83dd3c3/attachment-0001.html>


More information about the openssl-users mailing list