Problems with shared library

Torsten Homeyer torsten at pcsbst.UUCP
Thu Sep 1 00:34:04 AEST 1988


In article <462 at kivax.UUCP> shu at kivax.UUCP (Schultis Abt.013.2) writes:
>
>I've tried to build a shared library and found a serious problem
>and now I need some help.
>Has anyone created their own shared library containing lots of
>references to system type C-functions,
>e.g. how can FILE *popen() be linked to the target file so that
>all references are covered?
>

	Hope i can help you a bit. Look past my signature.

		mfg Torsten.
---
Name    : Torsten Homeyer         {tho at pcsbst ; torsten at homeyer}.UUCP
Company : PCS GmbH, Munich W-Germany.
UUCP  : ..uunet!unido!pcsbst!tho     ..uunet!unido!pcsbst!sws4!torsten
PRIVAT: ..unido!{pcsbst,megalon,mikros,[altger,netmbx]!oldman}!homeyer!torsten
------------------------------------------------------------------------------
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  SH SH/README SH/import.h SH/libmaux.s1 SH/log.c SH/main.c
#   SH/makefile SH/maux.h SH/maux_defs.c SH/poly.c SH/stats.c
# Wrapped by torsten at sws4 on Wed Aug 31 16:06:37 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test ! -d 'SH' ; then
    echo shar: Creating directory \"'SH'\"
    mkdir 'SH'
fi
if test -f 'SH/README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'SH/README'\"
else
echo shar: Extracting \"'SH/README'\" \(844 characters\)
sed "s/^X//" >'SH/README' <<'END_OF_FILE'
from: tho at pcsbst.uucp, ...uunet!unido!pcsbst!tho; Torsten Homeyer
X	at PCS GmbH, Munich , West-Germany
X
X
Hints in the shared library description from ATT.
This corresponds to the description "Building a shared library" in the
Programmers guide.
X
X1. 	In the Specifications File you have to prepend an underscore to the
X	symbols referenced in the following sections :
X		#branch
X		#export linker
X		#init xx.o
X
X
X2.	Be shure to have "max number of segments per user" set to the
X	right value when generating the kernel. Normal it is set to 3 (.text,
X	.data, .bss) + SHMSEG /* max number of shared segment per user */ from
X	the shared memory tunable parameters + 1. That together normaly is 7.
X	You must add 3 foreach shared library you want to use simultaneously in
X	one program.
X	For PCS-machines you tune it in /usr/sys/conf.h; 
X	#define SHMSEG xx
X
END_OF_FILE
if test 844 -ne `wc -c <'SH/README'`; then
    echo shar: \"'SH/README'\" unpacked with wrong size!
fi
# end of 'SH/README'
fi
if test -f 'SH/import.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'SH/import.h'\"
else
echo shar: Extracting \"'SH/import.h'\" \(128 characters\)
sed "s/^X//" >'SH/import.h' <<'END_OF_FILE'
X#ifdef SHARED
X#define malloc	(*_libmaux_malloc)
X#define log	(*_libmaux_log)
X#endif
X
extern char	*malloc();
extern double	log();
END_OF_FILE
if test 128 -ne `wc -c <'SH/import.h'`; then
    echo shar: \"'SH/import.h'\" unpacked with wrong size!
fi
# end of 'SH/import.h'
fi
if test -f 'SH/libmaux.s1' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'SH/libmaux.s1'\"
else
echo shar: Extracting \"'SH/libmaux.s1'\" \(318 characters\)
sed "s/^X//" >'SH/libmaux.s1' <<'END_OF_FILE'
X##
X##
X#address	.text	0x3de00000
X#address	.data	0x3df00000
X#target	/usr/service/torsten/C/SH/libmaux_s
X#branch
X	_polyd		1
X	_logd		2
X	_maux_stat	3
X#objects
X	maux_defs.o
X	poly.o
X	log.o
X	stats.o
X#objects noload
X	-lc_s
X#hide linker	*
X#export linker
X	_mauxerr
X#init maux_defs.o
X	__libmaux_malloc	_malloc
X	__libmaux_log	_log
END_OF_FILE
if test 318 -ne `wc -c <'SH/libmaux.s1'`; then
    echo shar: \"'SH/libmaux.s1'\" unpacked with wrong size!
fi
# end of 'SH/libmaux.s1'
fi
if test -f 'SH/log.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'SH/log.c'\"
else
echo shar: Extracting \"'SH/log.c'\" \(400 characters\)
sed "s/^X//" >'SH/log.c' <<'END_OF_FILE'
X#include"maux.h"
X#include"import.h"
X#include<math.h>
X
double	logd(base,x)
X	double	base, x;
X{
X	extern int	stats_logd;
X	extern int	total_calls;
X
X	double	logbase;
X	double	logx;
X
X	total_calls++;
X	stats_logd++;
X	logbase = log((double)base);
X	logx = log((double)x);
X	if(logbase == -HUGE || logx == -HUGE)
X	{
X		mauxerr = 1;
X		return(0);
X	}
X	else
X		mauxerr= 0;
X	return(logx/logbase);
X}
static int mauxdummy;
END_OF_FILE
if test 400 -ne `wc -c <'SH/log.c'`; then
    echo shar: \"'SH/log.c'\" unpacked with wrong size!
fi
# end of 'SH/log.c'
fi
if test -f 'SH/main.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'SH/main.c'\"
else
echo shar: Extracting \"'SH/main.c'\" \(135 characters\)
sed "s/^X//" >'SH/main.c' <<'END_OF_FILE'
X#include<stdio.h>
X
extern double logd();
X
main()
X{
X	double erg;
X
X	erg = logd(2.0,10.343);
X	printf("logd(2.0, 10.343) == %f\n", erg);
X}
END_OF_FILE
if test 135 -ne `wc -c <'SH/main.c'`; then
    echo shar: \"'SH/main.c'\" unpacked with wrong size!
fi
# end of 'SH/main.c'
fi
if test -f 'SH/makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'SH/makefile'\"
else
echo shar: Extracting \"'SH/makefile'\" \(872 characters\)
sed "s/^X//" >'SH/makefile' <<'END_OF_FILE'
X
shlib:	log.c main.c maux_defs.c poly.c stats.c
X	cc -c -fT -DSHARED maux_defs.c poly.c log.c stats.c
X	mkshlib -s libmaux.s1 -t libmaux_s -h libmaux_s.a
X	rm *.o
X
X
lib:	log.c main.c maux_defs.c poly.c stats.c
X	cc -c -fT maux_defs.c poly.c log.c stats.c
X	ar rv maux maux_defs.o poly.o log.o stats.o
X	rm *.o
X
main:	main.c maux
X	cc -d -fT -o main main.c maux
X
X
X
X
smain:	main.c libmaux_s.a
X	cc -fT -o smain main.c libmaux_s.a
X
X# we can't do the following in this example because needing a printf which
X#understands float from libm.a
X#	cc -fT -o shmain main.c libmaux_s.a -lc_s
X#expands to
X#	ld -o shmain /lib/crt0.o main.o libmaux_s.a -lc_s -lm -lc
X#so we don't get the right printf.
X#But we can call the linker by hand, and it will work.
X# Look at the following example:
X
X
shmain:	main.c libmaux_s.a
X	cc -fT -c main.c
X	ld -o shmain /lib/crt0.o main.o libmaux_s.a -lm -lc_s -lc
END_OF_FILE
if test 872 -ne `wc -c <'SH/makefile'`; then
    echo shar: \"'SH/makefile'\" unpacked with wrong size!
fi
# end of 'SH/makefile'
fi
if test -f 'SH/maux.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'SH/maux.h'\"
else
echo shar: Extracting \"'SH/maux.h'\" \(174 characters\)
sed "s/^X//" >'SH/maux.h' <<'END_OF_FILE'
X
struct mstats
X	{
X		int	st_polyd;
X		int	st_logd;
X		int	st_total;
X	};
X
X
X
X
extern double	polyd();
extern double	logd();
extern struct mstats	*maux_stat();
X
extern int	mauxerr;
END_OF_FILE
if test 174 -ne `wc -c <'SH/maux.h'`; then
    echo shar: \"'SH/maux.h'\" unpacked with wrong size!
fi
# end of 'SH/maux.h'
fi
if test -f 'SH/maux_defs.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'SH/maux_defs.c'\"
else
echo shar: Extracting \"'SH/maux_defs.c'\" \(103 characters\)
sed "s/^X//" >'SH/maux_defs.c' <<'END_OF_FILE'
X
int	mauxerr = 0;
X
X
X#ifdef SHARED
double	(*_libmaux_log)() = 0;
char	*(*_libmaux_malloc)() = 0;
X#endif
END_OF_FILE
if test 103 -ne `wc -c <'SH/maux_defs.c'`; then
    echo shar: \"'SH/maux_defs.c'\" unpacked with wrong size!
fi
# end of 'SH/maux_defs.c'
fi
if test -f 'SH/poly.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'SH/poly.c'\"
else
echo shar: Extracting \"'SH/poly.c'\" \(390 characters\)
sed "s/^X//" >'SH/poly.c' <<'END_OF_FILE'
X#include"maux.h"
X#include"import.h"
X#include<math.h>
X
double polyd(a, n, x)
X	double	a[];
X	int	n;
X	double	x;
X{
X	extern int	stats_polyd;
X	extern int	total_calls;
X	double	result;
X	int	i;
X
X	total_calls++;
X	stats_polyd++;
X	if(n < 0)
X	{
X		mauxerr = 1;
X		return(0);
X	}
X	result = a[0];
X	for(i = 1; i <= n; i++)
X	{
X		result *= (double)x;
X		result += (double)a[i];
X	}
X	mauxerr= 0;
X	return(result);
X}
END_OF_FILE
if test 390 -ne `wc -c <'SH/poly.c'`; then
    echo shar: \"'SH/poly.c'\" unpacked with wrong size!
fi
# end of 'SH/poly.c'
fi
if test -f 'SH/stats.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'SH/stats.c'\"
else
echo shar: Extracting \"'SH/stats.c'\" \(351 characters\)
sed "s/^X//" >'SH/stats.c' <<'END_OF_FILE'
X#include"maux.h"
X#include"import.h"
X
int	total_calls = 0;
int	stats_logd = 0;
int	stats_polyd = 0;
X
struct mstats	*maux_stat()
X{
X	extern char	*malloc();
X	struct mstats	*st;
X
X	if((st = (struct mstats *)malloc(sizeof(struct mstats))) == 0)
X		return(0);
X	st->st_polyd = stats_polyd;
X	st->st_logd = stats_logd;
X	st->st_total = total_calls;
X	return(st);
X}
END_OF_FILE
if test 351 -ne `wc -c <'SH/stats.c'`; then
    echo shar: \"'SH/stats.c'\" unpacked with wrong size!
fi
# end of 'SH/stats.c'
fi
echo shar: End of shell archive.
exit 0



More information about the Comp.unix.wizards mailing list