jw@sics.se (Johan Widen) (12/14/88)
SunOS 4 supports shared libraries. It turns out to be quite easy to make a shared libX11 library. The other X libraries are another matter 8-(. Here is a way to make a shared libX11. I did this already with X11R2 and we have been using that version for many month. What follows is for X11R3 however. Note that for every client that you want to link with the shared library, you will have to modify the Imakefile, so there is a bit of work involved in the conversion. Linking with the shared version of libX11 can result in substantial savings of disk space, and you may also see savings in memory use if like me you tend to have a lot of clients hanging around. It's a pity that it should be so difficult to turn libXt into a shared library. Now here is the recipe: I assume that you have made a regular libX11.a and have the X.V11R3/lib/X/Makefile handy. cd X.V11R3/lib mkdir Xpic cd Xpic foreach i ( ../X/* ) ln -s $i end make clean Now unshar the shar archive enclosed at the end of this article, in the Xpic directory. patch < Makefile.Patch Check that the Makefile looks reasonable. make make install You will have to run 'ldconfig' before you can run programs linked with the shared library. Now, ldconfig does not consider /usr/local/lib to be secure, it will not allow setuid programs to use shared libraries found in /usr/local/lib. You can work around this in several ways: The safe solution is to store libX11.s?.?.? in /usr/lib. A less safe solution (crackerwise) is to cd /usr/lib foreach i ( /usr/local/lib/libX11.s?.?.? ) ln -s $i end ldconfig To link a program with the shared library you just include '-lX11' among the link flags, e.g.: cc -o myProg myProg.o -lX11 The Makefiles in the client source directories are set up to link with ../../lib/X/libX11.a. You will have to change this. The way I have done it is to change the Imakefile in each directory. Generally I have removed references to $(XLIB) and added SYS_LIBRARIES = -lX11 (the above is just an example, SYS_LIBRARIES is already defined in several Imakefiles. In those cases: prepend a '-lX11' to the definition.) #!/bin/sh # shar: Shell Archiver (v1.22) # # Run the following text with /bin/sh to create: # Makefile.Patch # initGlobals.c # sed 's/^X//' << 'SHAR_EOF' > Makefile.Patch && X*** ../X/Makefile Mon Dec 12 20:35:23 1988 X--- Makefile Sat Dec 10 17:59:26 1988 X*************** X*** 91,96 **** X--- 91,97 ---- X INSTKMEMFLAGS = -m 4755 X FCFLAGS = -t X CDEBUGFLAGS = -O -DPURDUE X+ LIBREV = 1.2 X X PATHSEP = / X DEPEND = $(DEPENDSRC)/makedepend X*************** X*** 100,106 **** X MKFONTDIR = $(MKFONTDIRSRC)/mkfontdir X MKDIRHIER = $(SCRIPTSSRC)/mkdirhier.sh X X! CFLAGS = $(CDEBUGFLAGS) $(INCLUDES) $(STD_DEFINES) $(DEFINES) X LINTFLAGS = $(LINTOPTS) $(INCLUDES) $(STD_DEFINES) $(DEFINES) -DLINT X LDFLAGS = $(CDEBUGFLAGS) $(SYS_LIBRARIES) $(SYSAUX_LIBRARIES) X TOP = ../../. X--- 101,107 ---- X MKFONTDIR = $(MKFONTDIRSRC)/mkfontdir X MKDIRHIER = $(SCRIPTSSRC)/mkdirhier.sh X X! CFLAGS = $(CDEBUGFLAGS) $(INCLUDES) $(STD_DEFINES) $(DEFINES) -pic X LINTFLAGS = $(LINTOPTS) $(INCLUDES) $(STD_DEFINES) $(DEFINES) -DLINT X LDFLAGS = $(CDEBUGFLAGS) $(SYS_LIBRARIES) $(SYSAUX_LIBRARIES) X TOP = ../../. X*************** X*** 398,410 **** X OBJS =\ X $(OBJS1) $(OBJS2) X X! all:: libX11.a X X! libX11.a: $(OBJS1) $(OBJS2) X $(RM) $@ X! $(AR) $@ $(OBJS1) X! $(AR) $@ $(OBJS2) X! $(RANLIB) $@ X X lintlib:: llib-lX11.ln X X--- 396,411 ---- X OBJS =\ X $(OBJS1) $(OBJS2) X X! all:: libX11.so.$(LIBREV) X X! libX11.so.$(LIBREV): $(OBJS1) $(OBJS2) initGlobals.o X $(RM) $@ X! ld -o $@ -assert pure-text $(OBJS1) $(OBJS2) X! $(AR) libX11.sa.$(LIBREV) initGlobals.o evtomask.o X! $(RANLIB) libX11.sa.$(LIBREV) X! # $(AR) $@ $(OBJS1) X! # $(AR) $@ $(OBJS2) X! # $(RANLIB) $@ X X lintlib:: llib-lX11.ln X X*************** X*** 412,420 **** X $(RM) $@ X $(LINT) $(LINTLIBFLAG)X11 $(LINTFLAGS) *.c X X! install:: libX11.a X! $(INSTALL) -c $(INSTLIBFLAGS) libX11.a $(USRLIBDIR) X! $(RANLIB) $(RANLIBINSTFLAGS) $(USRLIBDIR)/libX11.a X X install.ln:: llib-lX11.ln X $(INSTALL) -c $(INSTLIBFLAGS) llib-lX11.ln $(LINTLIBDIR) X--- 413,422 ---- X $(RM) $@ X $(LINT) $(LINTLIBFLAG)X11 $(LINTFLAGS) *.c X X! install:: libX11.so.$(LIBREV) X! $(INSTALL) -c $(INSTLIBFLAGS) libX11.so.$(LIBREV) $(USRLIBDIR) X! $(INSTALL) -c $(INSTLIBFLAGS) libX11.sa.$(LIBREV) $(USRLIBDIR) X! $(RANLIB) $(RANLIBINSTFLAGS) $(USRLIBDIR)/libX11.sa.$(LIBREV) X X install.ln:: llib-lX11.ln X $(INSTALL) -c $(INSTLIBFLAGS) llib-lX11.ln $(LINTLIBDIR) SHAR_EOF chmod 0664 Makefile.Patch || echo "restore of Makefile.Patch fails" sed 's/^X//' << 'SHAR_EOF' > initGlobals.c && X#include "copyright.h" X X#define NEED_EVENTS X#define NEED_REPLIES X X#include <stdio.h> X#include <X11/Xos.h> X#include "Xlibint.h" X#include "Xresource.h" X#include "Xatom.h" X#include <errno.h> X Xchar *XErrorList[] = { X /* No error */ "", X /* BadRequest */ "BadRequest, invalid request code or no such operation", X /* BadValue */ "BadValue, integer parameter out of range for operation", X /* BadWindow */ "BadWindow, invalid Window parameter", X /* BadPixmap */ "BadPixmap, invalid Pixmap parameter", X /* BadAtom */ "BadAtom, invalid Atom parameter", X /* BadCursor */ "BadCursor, invalid Cursor parameter", X /* BadFont */ "BadFont, invalid Font parameter", X /* BadMatch */ "BadMatch, invalid parameter attributes", X /* BadDrawable */ "BadDrawable, invalid Pixmap or Window parameter", X /* BadAccess */ "BadAccess, attempt to access private resource denied", X /* BadAlloc */ "BadAlloc, insufficient resources for operation", X /* BadColor */ "BadColor, invalid Colormap parameter", X /* BadGC */ "BadGC, invalid GC parameter", X /* BadIDChoice */ "BadIDChoice, invalid resource ID chosen for this connection", X /* BadName */ "BadName, named color or font does not exist", X /* BadLength */ "BadLength, poly request too large or internal Xlib length error", X /* BadImplementation */ "BadImplementation, server does not implement operation", X}; Xint XErrorListSize = sizeof(XErrorList); X Xint _Xdebug = 0; X XDisplay *_XHeadOfDisplayList = NULL; X Xunsigned char _reverse_byte[0x100] = { X 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, X 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, X 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, X 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, X 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, X 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, X 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, X 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, X 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, X 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, X 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, X 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, X 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, X 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, X 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, X 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, X 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, X 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, X 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, X 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, X 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, X 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, X 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, X 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, X 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, X 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, X 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, X 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, X 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, X 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, X 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, X 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff X}; X X_XQEvent *_qfree = NULL; /* NULL _XQEvent. */ X XXrmQuark XrmQString; SHAR_EOF chmod 0664 initGlobals.c || echo "restore of initGlobals.c fails" exit 0 -- Johan Widen SICS, PO Box 1263, S-164 28 KISTA, SWEDEN Tel: +46 8 752 15 32 Ttx: 812 61 54 SICS S Fax: +46 8 751 72 30 Internet: jw@sics.se or {mcvax,munnari,ukc,unido}!enea!sics.se!jw