When building on aix (5.3) with gcc (don't know for xlc) there is an inconsistency in building aix-sharelibs between data/ and others, mainly stubdata/, causing this build error:
LIBPATH=../../lib:../../stubdata:../../tools/ctestfw:$LIBPATH ../../bin/genrb -e UTF-8 -s /source/icu/source/extra/uconv/resources -d uconvmsg root.txt
Could not load program ../../bin/genrb:
Could not load module ../lib/libicuuc38.a.
Dependent module ../../lib/libicudata38.a could not be loaded.
The module has an invalid magic number.
Could not load module genrb.
Dependent module ../lib/libicuuc38.a could not be loaded.
Could not load module .
gmake[2]: *** [uconvmsg/root.res] Error 255
gmake[2]: Leaving directory `/build/extra/uconv'
gmake[1]: *** [all-recursive] Error 2
gmake[1]: Leaving directory `/build/extra'
gmake: *** [all-recursive] Error 2
Some analysis:
When building genrb, data/ is not built yet, and genrb is linked against stubdata/libicudata38.a
For genrb execution, LIBPATH is set to find lib/libicudata38.a if available, instead of stubdata/libicudata38.a
But lib/libicudata38.a is built differently than stubdata/libicudata38.a:
lib/libicudata38.a is an ar-archive:
$ file lib/libicudata38.a
lib/libicudata38.a: archive (big format)
$ ar tv lib/libicudata38.a
rwxrwxrwx 854/1999 11176712 Oct 9 17:02 2007 libicudata38.0.a
$ file stubdata/libicudata38.a
stubdata/libicudata38.a: executable (RISC System/6000) or object module not stripped
Now looking at the build commands for stubdata/libicudata38.a:
$ rm stubdata/libicudata*
$ gmake --no-print-directory
gmake[0]: Making `all' in `stubdata'
rm -f libicudata38.0.a ; gcc -g -O2 -Wl,-bbigtoc -nodefaultlibs -nostdlib -shared -Wl,-bexpall -o libicudata38.0.a stubdata.o
rm -f libicudata38.a && ln -s libicudata38.0.a libicudata38.a
rm -f libicudata.a && ln -s libicudata38.0.a libicudata.a
gmake[0]: Making `all' in `common'
<snip>
And for lib/libicudata38.a:
$ rm lib/libicudata*
$ gmake --no-print-directory
<snip>
gmake[0]: Making `all' in `data'
LIBPATH=../stubdata:../lib:../tools/ctestfw:$LIBPATH MAKEFLAGS= ../bin/pkgdata -O ../data/icupkg.inc -q -c -s /build/data/out/build/icudt38b -d ../lib -M'PKGDATA_LDFLAGS="-nodefaultlibs -nostdlib"' -e icudt38 -T ./out/tmp -p icudt38b -m dll -r 38.0 -L icudata ./out/tmp/icudata.lst
gmake[2]: Entering directory `/build/data'
rm -f ../lib/libicudata38.0.a ; gcc -g -O2 -nodefaultlibs -nostdlib -shared -Wl,-bexpall -o libicudata38.0.a ./out/tmp/icudt38b_dat.o -Wl,-bE:icudt38b.map,-bnoexpall
/bin/ar r ../lib/libicudata38.0.a libicudata38.0.a
ar: creating an archive file ../lib/libicudata38.0.a
/bin/ar vt ../lib/libicudata38.0.a
rwxrwxrwx 854/1999 11176712 Oct 9 17:21 2007 libicudata38.0.a
rm -f ../lib/libicudata38.a && ln -s libicudata38.0.a ../lib/libicudata38.a
rm -f ../lib/libicudata.a && ln -s libicudata38.0.a ../lib/libicudata.a
gmake[2]: Leaving directory `/build/data'
gmake[0]: Making `all' in `io'
So stubdata/libicudata38.a directly is the shared object, while lib/libicudata38.a is an archive containing the shared object.
Each lib/libicu*.a besides lib/libicudata*.a is the shared object directly, not an archive containing the shared object:
$ file lib/libicu*38.0.a
lib/libicudata38.0.a: archive (big format)
lib/libicui18n38.0.a: executable (RISC System/6000) or object module not stripped
lib/libicuio38.0.a: executable (RISC System/6000) or object module not stripped
lib/libicule38.0.a: executable (RISC System/6000) or object module not stripped
lib/libiculx38.0.a: executable (RISC System/6000) or object module not stripped
lib/libicutu38.0.a: executable (RISC System/6000) or object module not stripped
lib/libicuuc38.0.a: executable (RISC System/6000) or object module not stripped
Seems that ticket 4738 also applies to each library except in data/ ?
When using "LDFLAGS=-Wl,-brtl", having lib*.a as shared objects works, so only the different build methods for data/ and stubdata/ remains as problem, as they produce libraries with identical names.