RS/6000 Shared libraries

Richard Basch probe at athena.mit.edu
Tue May 28 02:32:04 AEST 1991


We are trying to figure out how to build shared libraries and various
ways in which they can be used.

#1.

How does one create shared libraries.  For instance, I am trying to
build Kerberos on the RS/6000, and from what I can tell you have to be
able to resolve all references within the library at the time that you
create the shared objects.  I wrote a quick script to generate the
exported symbols:

	#!/bin/sh -
	rm -f $lib shr.o syms.exp
	lib=$1; shift
	nm $*|awk 'BEGIN {print "#!"}
		(NF==3 && $2=="D") {print $3}' > syms.exp
	ld -r -o shr.o $* -bM:sre -bE:syms.exp -lc
	ar cru $lib shr.o
	ranlib -t $lib
	rm -f shr.o syms.exp

(I haven't checked the above for its complete accuracy; I typed it in
from memory).

Anyway, when I build the DES libraries for Kerberos, there is no
problem, as all the symbols will be resolved against libc.  When I
attempt to build libkrb.a, which depends on libdes.a, I either have to
have the libdes.a on the ld line, or specify an import file.  I did the
latter with the following script (replaces the one above):

	#!/bin/sh -
	rm -f $lib shr.o syms.exp syms.imp
	lib=$1; shift
	nm $*|awk 'BEGIN {print "#!"}
		(NF==2 && $1=="U") {print $2}' | sort -u > syms.imp
	nm $*|awk 'BEGIN {print "#!"}
		(NF==3 && $2=="D") {print $3}' > syms.exp
	ld -o shr.o $* -bM:sre -bE:syms.exp -bI:syms.imp -lc
	ar cru $lib shr.o
	ranlib -t $lib
	rm -f shr.o syms.exp syms.imp

This seemed to work with libkrb.a (all be it, with a lot of warnings
during the execution of the ld command).  However, this trick did not
seem to work with the next step... I tried the same thing with the
libkdb.a library, and found that as soon as a call was made to the kdb
portion of the library that the program (kdb_init) died (it core
dumped).  However, building kdb_init with the static versions of the
libraries worked.

What am I missing?  Is there any documentation on shared libraries that
includes examples of how to generate them and what the restrictions are?
The only documentation I have seen is under the "ld" command.  The
description of import/export files leaves a bit to be desired.




#2.

Lucien (lwvanels at athena.mit.edu) previously asked how to create a
statically-resolved binary from one that had previously been resolved
with shared libraries.  It turns out that this is simple:

	cc -bnso -bI:/lib/syscalls.exp -o bar foo -L... -L...

(The trick was to remember to use -bI:/lib/syscalls.exp).

Is there a way to simply statically resolve the contents of one library?
I assume that you could extract the shared library and statically link
the objects within it and then re-link it against the executable.

Does this sound right?  Do I need to create import files for the
libraries that I build?  I assume not, given the contents of
/lib/syscalls.exp.  I'd prefer if I do not lose the advantage of
continuing to use the shared C library.



-Richard



More information about the Comp.unix.aix mailing list