Configurations/unix-Makefile.tmpl: switch to "natural" AIX shared libraries.
authorAndy Polyakov <appro@openssl.org>
Thu, 14 Jun 2018 09:45:15 +0000 (11:45 +0200)
committerAndy Polyakov <appro@openssl.org>
Fri, 22 Jun 2018 08:57:01 +0000 (10:57 +0200)
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)

Configurations/10-main.conf
Configurations/unix-Makefile.tmpl

index a62abe2..0086cee 100644 (file)
@@ -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"),
     },
index 42da98d..8d33e84 100644 (file)
 
      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"; \
@@ -1104,6 +1123,11 @@ EOF
        cp -p $shlib'\$(SHLIB_EXT)' apps/
        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";
@@ -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//;