Hi there!
I'm not super familiar with libtool's inner workings, so I was wondering if
someone could help point me in the right direction. On AIX, if we configure
with --enable-transarc-paths (though I think this happens even without it), and
after the make, run "make dest", the resulting binaries don't work.
I'm currently trying this on AIX 7.1. The shared libraries should end up in
rs_aix71/dest/lib. Let's say I try to run afsd:
./afsd --help
exec(): 0509-036 Cannot load program ./afsd because of the following errors:
0509-150 Dependent module libafshcrypto.a(libafshcrypto.so.2) could
not be loaded.
0509-022 Cannot load module libafshcrypto.a(libafshcrypto.so.2).
0509-026 System error: A file or directory in the path name does not
exist.
Ok, expected with shared libraries. On AIX I can set my LD_LIBRARY_PATH to
/wherever/rs_aix71/dest/lib, and try again:
$ ./afsd --help
exec(): 0509-036 Cannot load program ./afsd because of the following errors:
0509-150 Dependent module
/whereever/rs_aix71/dest/lib/libafshcrypto.a(libafshcrypto.so.2) could not be
loaded.
0509-152 Member libafshcrypto.so.2 is not found in archive
Let's see what is in that archive:
$ ar t /wherever/rs_aix71/dest/lib/libafshcrypto.a
aes.o
camellia.o
camellia-ntt.o
des.o
engine.o
evp.o
evp-hcrypto.o
evp-cc.o
hmac.o
md2.o
md4.o
md5.o
pkcs5.o
rand-egd.o
rand-timer.o
rand-unix.o
rand.o
rc2.o
rc4.o
rijndael-alg-fst.o
rnd_keys.o
sha.o
sha256.o
sha512.o
ui.o
validate.o
rand-fortuna.o
Sure enough, that's the static archive. Let's see what exists in the build
directory:
$ find /wherever -name libafshcrypto.a
/wherever/lib/libafshcrypto.a
/wherever/rs_aix71/dest/lib/libafshcrypto.a
/wherever/src/crypto/hcrypto/.libs/libafshcrypto.a
/wherever/src/crypto/hcrypto/libafshcrypto.a
Ok, we're interested in the contents of src/crypto/hcrypto/libafshcrypto.a and
src/crypto/hcrypto/.libs/libafshcrypto.a:
$ ar t /whereever/src/crypto/hcrypto/libafshcrypto.a
aes.o
camellia.o
camellia-ntt.o
des.o
engine.o
evp.o
evp-hcrypto.o
evp-cc.o
hmac.o
md2.o
md4.o
md5.o
pkcs5.o
rand-egd.o
rand-timer.o
rand-unix.o
rand.o
rc2.o
rc4.o
rijndael-alg-fst.o
rnd_keys.o
sha.o
sha256.o
sha512.o
ui.o
validate.o
rand-fortuna.o
... That's the static archive...
$ ar t /whereever/src/crypto/hcrypto/.libs/libafshcrypto.a
libafshcrypto.so.2
Aha, that's the shared library archive!
Now, on AIX, you can have an archive file with both static and shared objects
in it. So what we really want here is for the installed libafshcrypto.a to
have all the .o files, and also the libafshcrypto.so.2 in it.
Let's look at the "dest" make rule in src/crypto/hcrypto/Makefile:
dest: $(SHARED_LIBS) libafshcrypto.a
${LT_INSTALL_DATA} libafshcrypto.la ${DEST}/lib/libafshcrypto.la
${RM} ${DEST}/lib/libafshcrypto.la
${INSTALL_DATA} libafshcrypto.a ${DEST}/lib/libafshcrypto.a
AHA, that looks like the problem! First we install the shared library, then we
overwrite it with the static library! Of course this only breaks on AIX
because on AIX the names of the shared and the static libraries are the same.
I thought that is what the --with-aix=soname=aix configure option is supposed
to take care of, which is the default. Ideally libtool could either build the
combined library in src/crypto/hcrypto so that this works as-is, or else the
Makefile needs to be heavily reworked with some AIX specifics. This library is
just one example out of many, all of them have the same issue on AIX with the
"dest" target, as well as the "install" target.
Another alternative that I might prefer, would be for the default on AIX to be
to disable shared libraries altogether. This would be more similar to the
original IBM AFS. Would that be possible, something everyone could agree on,
and anyone know how to do that?
Obviously this is a big problem, as the AIX build doesn't work unless you
select only one or the other shared/static library options manually as a
./configure option.
Thanks in advance for any suggestions!
-Ben