summaryrefslogtreecommitdiffstats
path: root/Configurations
diff options
context:
space:
mode:
authorAndy Polyakov <appro@openssl.org>2018-06-14 11:45:15 +0200
committerAndy Polyakov <appro@openssl.org>2018-06-22 10:57:01 +0200
commitcff89b179c91c7c1f6f08b2c1f1697005c1804d2 (patch)
tree2f12a8427ae6026b301aac2a615256284610fcaa /Configurations
parentb48d4397b8ee4256f0b0a115eb99f27ae89995e0 (diff)
Configurations/unix-Makefile.tmpl: switch to "natural" AIX shared libraries.
AIX treats its shared libraries in unique manner, by placing multiple shared objects of different versions and bitnesses, into .a file. So far we have been naively linking with version-less libcrypto|ssl.so, which poses long-term maintenance problems. One could choose to link straight with libcrypto.so.X.Y [or libcrypto.X.Y.so], but it would be inconsistent with the way AIX [or Unix] does things. Reviewed-by: Richard Levitte <levitte@openssl.org> (Merged from https://github.com/openssl/openssl/pull/6487)
Diffstat (limited to 'Configurations')
-rw-r--r--Configurations/10-main.conf7
-rw-r--r--Configurations/unix-Makefile.tmpl44
2 files changed, 40 insertions, 11 deletions
diff --git a/Configurations/10-main.conf b/Configurations/10-main.conf
index a62abe29b1..0086ceec0e 100644
--- a/Configurations/10-main.conf
+++ b/Configurations/10-main.conf
@@ -1113,11 +1113,14 @@ my %targets = (
thread_scheme => "pthreads",
dso_scheme => "dlfcn",
shared_target => "self",
- shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
bin_lflags => shared("-Wl,-bsvr4"),
module_ldflags => "-Wl,-G,-bsymbolic,-bexpall,-bnolibpath",
shared_ldflag => "-Wl,-G,-bsymbolic,-bnolibpath",
shared_defflag => "-Wl,-bE:",
+ shared_extension => ".so.\$(SHLIB_VERSION_NUMBER)",
+ dso_extension => ".so",
+ lib_extension => shared("_a.a"),
+ shared_extension_simple => shared(".a"),
},
"aix-gcc" => {
inherit_from => [ "aix-common", asm("ppc32_asm") ],
@@ -1142,6 +1145,7 @@ my %targets = (
bn_ops => "SIXTY_FOUR_BIT_LONG RC4_CHAR",
perlasm_scheme => "aix64",
shared_ldflag => add_before("-shared -static-libgcc"),
+ shared_extension => "64.so.\$(SHLIB_VERSION_NUMBER)",
AR => add("-X64"),
RANLIB => add("-X64"),
},
@@ -1173,6 +1177,7 @@ my %targets = (
perlasm_scheme => "aix64",
dso_scheme => "dlfcn",
shared_cflag => "-qpic",
+ shared_extension => "64.so.\$(SHLIB_VERSION_NUMBER)",
AR => add("-X64"),
RANLIB => add("-X64"),
},
diff --git a/Configurations/unix-Makefile.tmpl b/Configurations/unix-Makefile.tmpl
index 42da98dd48..8d33e84318 100644
--- a/Configurations/unix-Makefile.tmpl
+++ b/Configurations/unix-Makefile.tmpl
@@ -16,6 +16,10 @@
sub windowsdll { $config{target} =~ /^(?:Cygwin|mingw)/ }
+ # Shared AIX support is special. We put libcrypto[64].so.ver into
+ # libcrypto.a and use libcrypto_a.a as static one.
+ sub sharedaix { !$disabled{shared} && $config{target} =~ /^aix/ }
+
our $sover_dirname = $config{shlib_version_number};
$sover_dirname =~ s|\.|_|g
if $config{target} =~ /^mingw/;
@@ -506,7 +510,7 @@ install_dev:
s2=`echo "$$s" | cut -f2 -d";"`; \
fn1=`basename $$s1`; \
fn2=`basename $$s2`; \
- : {- output_off() if windowsdll(); "" -}; \
+ : {- output_off(); output_on() unless windowsdll() or sharedaix(); "" -}; \
$(ECHO) "install $$s1 -> $(DESTDIR)$(libdir)/$$fn1"; \
cp $$s1 $(DESTDIR)$(libdir)/$$fn1.new; \
chmod 755 $(DESTDIR)$(libdir)/$$fn1.new; \
@@ -516,13 +520,28 @@ install_dev:
$(ECHO) "link $(DESTDIR)$(libdir)/$$fn2 -> $(DESTDIR)$(libdir)/$$fn1"; \
ln -sf $$fn1 $(DESTDIR)$(libdir)/$$fn2; \
fi; \
- : {- output_on() if windowsdll(); "" -}{- output_off() unless windowsdll(); "" -}; \
+ : {- output_off() unless windowsdll() or sharedaix(); output_on() if windowsdll(); "" -}; \
$(ECHO) "install $$s2 -> $(DESTDIR)$(libdir)/$$fn2"; \
cp $$s2 $(DESTDIR)$(libdir)/$$fn2.new; \
chmod 755 $(DESTDIR)$(libdir)/$$fn2.new; \
mv -f $(DESTDIR)$(libdir)/$$fn2.new \
$(DESTDIR)$(libdir)/$$fn2; \
- : {- output_on() unless windowsdll(); "" -}; \
+ : {- output_off() if windowsdll(); output_on() if sharedaix(); "" -}; \
+ a=$(DESTDIR)$(libdir)/$$fn2; \
+ $(ECHO) "install $$s1 -> $$a"; \
+ if [ -f $$a ]; then ( trap "rm -rf /tmp/ar.$$$$" INT 0; \
+ mkdir /tmp/ar.$$$$; ( cd /tmp/ar.$$$$; \
+ cp -f $$a $$a.new; \
+ for so in `$(AR) t $$a`; do \
+ $(AR) x $$a $$so; \
+ chmod u+w $$so; \
+ strip -X32_64 -e $$so; \
+ $(AR) r $$a.new $$so; \
+ done; \
+ )); fi; \
+ $(AR) r $$a.new $$s1; \
+ mv -f $$a.new $$a; \
+ : {- output_off() if sharedaix(); output_on(); "" -}; \
done
@ : {- output_on() if $disabled{shared}; "" -}
@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(libdir)/pkgconfig
@@ -562,11 +581,11 @@ uninstall_dev:
fn1=`basename $$s1`; \
fn2=`basename $$s2`; \
: {- output_off() if windowsdll(); "" -}; \
- $(ECHO) "$(RM) $(DESTDIR)$(libdir)/$$fn1"; \
- $(RM) $(DESTDIR)$(libdir)/$$fn1; \
- if [ "$$fn1" != "$$fn2" ]; then \
- $(ECHO) "$(RM) $(DESTDIR)$(libdir)/$$fn2"; \
- $(RM) $(DESTDIR)$(libdir)/$$fn2; \
+ $(ECHO) "$(RM) $(DESTDIR)$(libdir)/$$fn2"; \
+ $(RM) $(DESTDIR)$(libdir)/$$fn2; \
+ if [ "$$fn1" != "$$fn2" -a -f "$(DESTDIR)$(libdir)/$$fn1" ]; then \
+ $(ECHO) "$(RM) $(DESTDIR)$(libdir)/$$fn1"; \
+ $(RM) $(DESTDIR)$(libdir)/$$fn1; \
fi; \
: {- output_on() if windowsdll(); "" -}{- output_off() unless windowsdll(); "" -}; \
$(ECHO) "$(RM) $(DESTDIR)$(libdir)/$$fn2"; \
@@ -1105,6 +1124,11 @@ EOF
cp -p $shlib'\$(SHLIB_EXT)' test/
cp -p $shlib'\$(SHLIB_EXT)' fuzz/
EOF
+ } elsif (sharedaix()) {
+ $recipe .= <<"EOF";
+ rm -f $target && \\
+ \$(AR) r $target $target_full
+EOF
} else {
$recipe .= <<"EOF";
if [ '$target' != '$target_full' ]; then \\
@@ -1168,8 +1192,8 @@ EOF
push @linkdirs, $d unless grep { $d eq $_ } @linkdirs;
}
my $linkflags = join("", map { "-L$_ " } @linkdirs);
- my $linklibs = join("", map { if ($_ =~ /\.a$/) {
- " $_";
+ my $linklibs = join("", map { if ($_ =~ s/\.a$//) {
+ " $_$libext";
} else {
my $f = basename($_);
(my $l = $f) =~ s/^lib//;