Fun with platform linker inconsistencies (AIX vs. Linux)
Posted by peeterjoot on May 10, 2012
Imagine we have three source files, to be built into a pair of shared libs (one with a dependency on the other) and an exe as in:
// s1.C
extern "C" void foo(void){}
// s2.C
extern "C" void foo(void) ;
extern "C" void bar(void){foo();}
// m.C
extern "C" void foo(void) ;
extern "C" void bar(void) ;
int main()
{
bar() ;
foo() ;
return 0 ;
}
On Linux, we can compile and link these with command line of the following sort
# g++ -shared s1.C -o libs1.so -fpic # g++ -shared s2.C -o libs2.so -fpic -L. -ls1 # g++ -L. -ls2 m.C -Wl,-rpath-link,`pwd` -Wl,-rpath,`pwd`
Notice that we’ve not explicitly linked to libs1.so on Linux, even though we are using a symbol from it explictly. The linker picks up dependencies from other things that you choose to link to.
On AIX the equivalent commands to create a pair of shared libraries and link the exe to it fails at that exe link
# xlC -q64 -qmkshrobj s1.C -o shr1.o # ar -X64 -crv libs1.a shr1.o # xlC -q64 -qmkshrobj s2.C -o shr2.o -L. -ls1 # ar -X64 -crv libs2.a shr2.o # xlC -q64 -L. -ls2 m.C ld: 0711-317 ERROR: Undefined symbol: .foo ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
You’ve got to add -ls1 to those link flags to get the exe to find its dependencies. I wonder which of these two link time behaviours is more common?