diff options
Diffstat (limited to 'util/mkdef.pl')
-rwxr-xr-x | util/mkdef.pl | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/util/mkdef.pl b/util/mkdef.pl index 20338f5770..1e0da1c87b 100755 --- a/util/mkdef.pl +++ b/util/mkdef.pl @@ -53,6 +53,58 @@ use FindBin; use lib "$FindBin::Bin/perl"; use OpenSSL::Glob; +# When building a "variant" shared library, with a custom SONAME, also customize +# all the symbol versions. This produces a shared object that can coexist +# without conflict in the same address space as a default build, or an object +# with a different variant tag. +# +# For example, with a target definition that includes: +# +# shlib_variant => "-opt", +# +# we build the following objects: +# +# $ perl -le ' +# for (@ARGV) { +# if ($l = readlink) { +# printf "%s -> %s\n", $_, $l +# } else { +# print +# } +# }' *.so* +# libcrypto-opt.so.1.1 +# libcrypto.so -> libcrypto-opt.so.1.1 +# libssl-opt.so.1.1 +# libssl.so -> libssl-opt.so.1.1 +# +# whose SONAMEs and dependencies are: +# +# $ for l in *.so; do +# echo $l +# readelf -d $l | egrep 'SONAME|NEEDED.*(ssl|crypto)' +# done +# libcrypto.so +# 0x000000000000000e (SONAME) Library soname: [libcrypto-opt.so.1.1] +# libssl.so +# 0x0000000000000001 (NEEDED) Shared library: [libcrypto-opt.so.1.1] +# 0x000000000000000e (SONAME) Library soname: [libssl-opt.so.1.1] +# +# We case-fold the variant tag to upper case and replace all non-alnum +# characters with "_". This yields the following symbol versions: +# +# $ nm libcrypto.so | grep -w A +# 0000000000000000 A OPENSSL_OPT_1_1_0 +# 0000000000000000 A OPENSSL_OPT_1_1_0a +# 0000000000000000 A OPENSSL_OPT_1_1_0c +# 0000000000000000 A OPENSSL_OPT_1_1_0d +# 0000000000000000 A OPENSSL_OPT_1_1_0f +# 0000000000000000 A OPENSSL_OPT_1_1_0g +# $ nm libssl.so | grep -w A +# 0000000000000000 A OPENSSL_OPT_1_1_0 +# 0000000000000000 A OPENSSL_OPT_1_1_0d +# +(my $SO_VARIANT = qq{\U$target{"shlib_variant"}}) =~ s/\W/_/g; + my $debug=0; my $crypto_num= catfile($config{sourcedir},"util","libcrypto.num"); @@ -1231,13 +1283,13 @@ EOF if ($symversion ne $prevsymversion) { if ($prevsymversion ne "") { if ($prevprevsymversion ne "") { - print OUT "} OPENSSL_" + print OUT "} OPENSSL${SO_VARIANT}_" ."$prevprevsymversion;\n\n"; } else { print OUT "};\n\n"; } } - print OUT "OPENSSL_$symversion {\n global:\n"; + print OUT "OPENSSL${SO_VARIANT}_$symversion {\n global:\n"; $prevprevsymversion = $prevsymversion; $prevsymversion = $symversion; } @@ -1286,7 +1338,7 @@ EOF } while ($linux && $thisversion ne $currversion); if ($linux) { if ($prevprevsymversion ne "") { - print OUT " local: *;\n} OPENSSL_$prevprevsymversion;\n\n"; + print OUT " local: *;\n} OPENSSL${SO_VARIANT}_$prevprevsymversion;\n\n"; } else { print OUT " local: *;\n};\n\n"; } |