[comp.windows.x] Recipe for making a sharable libX11 under SunOS 4

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