laplante@iro.umontreal.ca (Pierre Laplante) (09/26/89)
I have the following error when compiling on a NeXT running mach 0.9.
Script started on Tue Sep 26 11:30:13 1989
habitant> make
cc -g -Bstatic -o bash shell.o y.tab.o general.o make_cmd.o print_cmd.o dispose_cmd.o execute_cmd.o variables.o builtins.o copy_cmd.o flags.o jobs.o subst.o glob.o hash.o mailcheck.o test.o trap.o alias.o alloc-files/malloc.o braces.o unwind_prot.o bas
hline.o version.o readline/libreadline.a /usr/lib/libtermcap.a
ld: multiple definitions of symbol _realloc
ld: multiple definitions of symbol _malloc
ld: multiple definitions of symbol _free
Undefined symbols:
lmodt
lmult
ldivt
*** Exit 1
Stop.
Here is the Makefile
habitant> cat Makfiler
Makfiler: No such file or directory
habitant> cat Makefile
## -*- text -*- ####################################################
# #
# Makefile for bash, the Bourne Again SHell. #
# #
# Do: #
# make To make `bash' in current directory #
# make install To make bash and install it in DESTDIR #
# make newversion To update the version of the shell #
# make distribution If you are a wizard #
# make bash.tar.Z If you are a normal person #
# make clone To make a clone of the bash distribution. #
# #
# The file `config.h' contains some defines for controlling #
# various features. #
# #
# #
####################################################################
# Here is a rule for making .o files from .c files that doesn't force
# the type of the machine (like -sun3) into the flags.
.c.o:
$(CC) -c $(CFLAGS) $(CPPFLAGS) $*.c
# Of course, you cannot do this the first time through...
#SHELL=/usr/gnu/bin/bash
SHELL=/bin/sh
# FLAGS THAT REFER TO THE DESTINATION SYSTEM
####################################################################
#
# The variables in this box can (and should) be changed to match the
# system that you are compiling the shell on.
#
# The mailing address of you, the local maintainer. This *must* be
# enclosed in double quotes. Until I make a better Makefile.
MAINTAINER = '"bfox@ai.mit.edu"'
# Destination installation directory. The shell is copied here if
# you do a `make install'. The directory name does NOT end in a slash.
DESTDIR = /usr/local/bin
# The name of the target hardware. It makes a difference. If your
# machine doesn't seem to be represented by one of the machines here,
# try one and see how well you do.
# Use i386 for PC type 386 boxes. (Compaq, etc.)
# SUN3, SUN4, SUN386i, VAX, SONY, CONVEX, HP, HP9KS300, i386, NeXT, AIX,
# ATT3B, ATT386
TARGET = NeXT
# The name of the target operating system. There isn't such a big
# difference between SUNOS3 and Bsd. But there might be in the future.
# SUNOS3, SUNOS4, SYSV, Bsd, HPUX, UNIXPC
OS = BSD
# You only need this if you are hacking the shell in a location
# that doesn't do enough backups, or does a poor job. In that
# case, BACKUP_DIR should be the name of a directory on another
# device (i.e. different than the one you are building the shell
# on), and you should do `make backup' at least once a day.
BACKUP_DIR = /home/gogol/bash
#
####################################################################
# FLAGS THAT REFER TO THE COMPILATION PROCESS
####################################################################
#
# PROFILE_FLAGS is either -pg, to generate profiling info for use
# with gprof, or nothing (the default).
PROFILE_FLAGS=
# HP-UX compilation requires the BSD library.
#LOCAL_LIBS = -lBSD
# Xenix requires -lx -ldir. It is also required in the readline Makefile.
#LOCAL_LIBS = -lx -ldir
GCC_SUNOS4_FLAG = -Bstatic
DEBUG_FLAGS = $(PROFILE_FLAGS) -g $(GCC_SUNOS4_FLAG)
LDFLAGS = $(DEBUG_FLAGS)
CFLAGS = $(DEBUG_FLAGS) -D${TARGET} -DTARGET=${TARGET} -D${OS}
CPPFLAGS= -I$(LIBSRC)
# If you don't have Bison use "yacc". Otherwise use "bison -y".
BISON = bison -y
# If you don't have Gcc use cc.
CC = cc
####################################################################
# These are required for sending bug reports.
SYSTEM_NAME = '"$(TARGET)"'
OS_NAME = '"$(OS)"'
# The name of this program.
PROGRAM = bash
# The default primary and secondary prompts.
PPROMPT = '"${PROGRAM}\\$$ "'
SPROMPT = '"${PROGRAM}>"'
# The group of configuration flags. These are for shell.c
CFG_FLAGS = -DMAINTAINER=$(MAINTAINER) -DPPROMPT=$(PPROMPT)\
-DSPROMPT=$(SPROMPT) -DOS_NAME=$(OS_NAME)\
-DSYSTEM_NAME=$(SYSTEM_NAME)
# The directory which contains the source for malloc. The name must
# end in a slash, as in `./alloc-files/'
ALLOC_SOURCE = ./alloc-files/
# Our malloc.
MALLOC = $(ALLOC_SOURCE)malloc.o
MALLOC_FLAGS = -Drcheck -Dbotch=programming_error
#MALLOC= $(ALLOC_SOURCE)malloc.o
#ALLOCA= $(ALLOC_SOURCE)alloca.o
ALLOC_HEADERS = $(ALLOC_SOURCE)getpagesize.h
ALLOC_FILES = $(ALLOC_SOURCE)malloc.c $(ALLOC_SOURCE)alloca.c\
$(ALLOC_SOURCE)i386-alloca.s
# Anticipated library for alloca if you do not use an alloc from this package.
# E.g. "-lPW" for AT&T 3B's. The AT&T 6386 systems can use i386-alloca.o.
# If you are using gcc, then leave ALLOCA_LIB undefined, as __builtin_alloca
# will do the trick.
#ALLOCA_LIB = -lPW
ALLOCA_LIB =
# If your system doesn't have a sys_siglist, then define SIGLIST
# as siglist.o
#SIGLIST = siglist.o
RM = rm
AR = ar
RANLIB = ranlib
# Support libraries required. Termcap and Readline.
# We would like to use GNU's termcap library. Where is it?
# If you don't have -ltermcap, you might try -lcurses.
TERMCAP = /usr/lib/libtermcap.a
READLINE= ./readline/libreadline.a
# The source code for the support libraries.
LIBSRC = ./
HISTORY_SOURCE = $(LIBSRC)readline/history.c $(LIBSRC)readline/history.h
RLIBSRC = $(LIBSRC)readline/
READLINE_SOURCE = $(RLIBSRC)readline.c $(RLIBSRC)readline.h\
$(RLIBSRC)chardefs.h $(RLIBSRC)keymaps.h\
$(RLIBSRC)funmap.c $(RLIBSRC)emacs_keymap.c\
$(RLIBSRC)vi_keymap.c $(RLIBSRC)keymaps.c\
$(HISTORY_SOURCE)
TERMCAP_SOURCE =
READLINE_DOC = $(RLIBSRC)readline.texinfo\
$(RLIBSRC)inc-readline.texinfo
HISTORY_DOC = $(RLIBSRC)history.texinfo\
$(RLIBSRC)inc-history.texinfo
TERMCAP_DOC =
LIBRARY_SOURCE = $(READLINE_SOURCE) $(TERMCAP_SOURCE)
LIBRARY_DOC = $(READLINE_DOC) $(HISTORY_DOC) $(TERMCAP_DOC)
LIBRARY_SUPPORT = $(RLIBSRC)Makefile $(RLIBSRC)ChangeLog
LIBRARY_TAR = $(LIBRARY_SOURCE) $(LIBRARY_DOC) $(LIBRARY_SUPPORT)
# The order is important. Most dependent first.
LIBRARIES = $(READLINE) $(TERMCAP)
CSOURCES = shell.c parse.y general.c make_cmd.c print_cmd.c\
dispose_cmd.c execute_cmd.c variables.c builtins.c\
copy_cmd.c flags.c subst.c glob.c hash.c mailcheck.c\
test.c trap.c jobs.c nojobs.c $(ALLOC_FILES) braces.c\
unwind_prot.c siglist.c bashline.c version.c
HSOURCES = shell.h flags.h trap.h hash.h jobs.h builtins.h alias.c \
alias.h general.h variables.h config.h $(ALLOC_HEADERS) \
version.h quit.h
SOURCES = $(CSOURCES) $(HSOURCES)
OBJECTS = shell.o y.tab.o general.o make_cmd.o print_cmd.o\
dispose_cmd.o execute_cmd.o variables.o builtins.o copy_cmd.o\
flags.o jobs.o subst.o glob.o hash.o mailcheck.o test.o\
trap.o alias.o $(MALLOC) $(ALLOCA) braces.o unwind_prot.o\
$(SIGLIST) bashline.o version.o
# Documentation for the shell.
DOCDIR = ./documentation/
BASHDOCS = $(DOCDIR)*.texinfo $(DOCDIR)texinfo.tex
DOCUMENTATION = README FEATURES $(BASHDOCS) $(LIBRARY_DOCS)
# Some example files
EXAMPLES = examples/*
SUPPORT = COPYING Makefile newversion.c make-tarfile mail-shell inform \
$(DOCUMENTATION) ChangeLog .distribution $(EXAMPLES)
MAIL = shell-mail
# BAGGAGE consists of things that you want to keep with the shell for some
# reason, but don't actually use; old source code, etc.
BAGGAGE = longest_signal_desc.c
THINGS_TO_TAR = $(SOURCES) $(LIBRARY_TAR) $(SUPPORT) $(BAGGAGE)
$(PROGRAM): .build $(OBJECTS) $(LIBRARIES) Makefile
$(CC) $(LDFLAGS) -o $(PROGRAM) $(OBJECTS) \
$(LIBRARIES) $(LOCAL_LIBS) $(ALLOCA_LIB)
$(RM) .make
.build: newversion.aux .make $(SOURCES)
if newversion.aux -build; then mv -f newversion.h version.h; fi
.make:
touch .make
version.h: newversion.aux
if newversion.aux -build; then mv -f newversion.h version.h; fi
shell.h: general.h variables.h config.h
touch shell.h
y.tab.c: parse.y shell.h
-if test -f y.tab.h; then mv -f y.tab.h old-y.tab.h; fi
$(BISON) -d parse.y
-if cmp -s old-y.tab.h y.tab.h; then mv old-y.tab.h y.tab.h; fi
$(READLINE): $(READLINE_SOURCE)
(cd $(RLIBSRC); $(MAKE) $(MFLAGS) CC='$(CC)'\
CFLAGS='$(CFLAGS) -DSHELL')
$(TERMCAP): $(TERMCAP_SOURCE)
(cd $(LIBSRC); $(MAKE) $(MFLAGS) CC='$(CC)'\
CFLAGS='$(CFLAGS) -I.')
shell.o: shell.h flags.h shell.c
$(CC) $(CFG_FLAGS) $(CFLAGS) $(CPPFLAGS) -c shell.c
braces.o: braces.c
$(CC) $(CFLAGS) -DSHELL -c braces.c
keymaps.c: emacs_keymap.c vi_keymap.c
touch keymaps.c
$(MALLOC): $(ALLOC_FILES)
$(CC) -I$(ALLOC_SOURCE) $(CFLAGS) $(MALLOC_FLAGS) -c $*.c &&\
mv `basename $*`.o $(MALLOC)
#$(ALLOCA): $(ALLOC_FILES)
# $(CC) -I$(ALLOC_SOURCE) $(CFLAGS) -o $(ALLOCA) -c $*.c
bashline.o: bashline.c config.h $(RLIBSRC)readline.h
$(CC) -I../ $(CFLAGS) $(CPPFLAGS) -c bashline.c
bashline.o: variables.h builtins.h
jobs.o: jobs.c nojobs.c jobs.h config.h
version.o: version.h version.c .build
general.o: general.c shell.h
y.tab.h: y.tab.c
alias.o: alias.h alias.c
subst.o: subst.c shell.h
make_cmd.o: shell.h config.h make_cmd.c
print_cmd.o: shell.h y.tab.h print_cmd.c
execute_cmd.o: shell.h y.tab.h builtins.h flags.h config.h execute_cmd.c
dispose_cmd.o: shell.h dispose_cmd.c
copy_cmd.o: shell.h copy_cmd.c
builtins.o: shell.h flags.h trap.h builtins.h jobs.h config.h builtins.c
flags.o: flags.h flags.c config.h
hash.o: hash.h hash.c
trap.o: shell.h trap.h config.h trap.c
variables.o: variables.h flags.h
$(PROGRAM).tar: $(THINGS_TO_TAR) .distribution
make-tarfile $(PROGRAM) `cat .distribution` $(THINGS_TO_TAR)
$(PROGRAM).tar.Z: $(PROGRAM).tar
compress -f $(PROGRAM).tar
clone:
mkdir clone; \
(cd clone; for i in $(THINGS_TO_TAR); \
do file=`basename $$i`; \
dir=`echo $$i | sed "s/$$file\$$//" | sed 's@\(.*\)/\$$@\1@'`; \
if [ "$$dir" = "" ]; then dir="."; fi; \
if [ "$$dir" != "." ]; then \
if [ ! -d "$$dir" ]; then mkdir "$$dir"; fi; \
if [ "$$file" = Makefile ]; \
then cp ../$$i $$i; \
else ln -s ../../$$i $$i; \
fi; \
else if [ "$$file" = Makefile ]; then cp ../$$i $$i; \
else ln -s ../$$i $$i; fi; \
fi; \
done)
# Make `backup' be a link to a directory on another device.
backup: $(PROGRAM).tar.Z
if [ ! -h backup ]; then ln -s $(BACKUP_DIR) backup; fi
cp $(PROGRAM).tar.Z backup/$(PROGRAM).tar.Z
install: $(PROGRAM)
-mv $(DESTDIR)/$(PROGRAM) $(DESTDIR)/$(PROGRAM).old
cp $(PROGRAM) $(DESTDIR)/$(PROGRAM)
rm -f installed-$(PROGRAM)
ln -s $(DESTDIR)/$(PROGRAM) installed-$(PROGRAM)
mailable: distribution
/bin/rm -rf uuencoded
mkdir uuencoded
$(SHELL) -c 'f=$(PROGRAM)-`cat .distribution`.tar.Z;uuencode $$f $$f | split -800 - uuencoded/$$f.uu.'
.distribution: newversion.aux
newversion.aux -dist `$(PROGRAM) -c 'echo $$BASH_VERSION'`
distribution: $(PROGRAM).tar.Z .distribution
cp $(PROGRAM).tar.Z $(PROGRAM)-`cat .distribution`.tar.Z
newversion.aux: newversion.c
$(CC) -g -o newversion.aux newversion.c
newversion: newversion.aux
rm -f .build
newversion.aux -dist
mv -f newversion.h version.h
make $(PROGRAM)
documentation:
(cd $(DOCDIR); makeinfo *.texinfo)
tags: $(SOURCES) $(LIBRARY_SOURCE)
etags $(SOURCES) $(LIBRARY_SOURCE)
clean:
rm -f $(OBJECTS) $(PROGRAM) y.tab.c y.tab.h newversion.aux
(cd $(LIBSRC); rm *.o *.a)
dist-clean:
rm -f $(OBJECTS) $(PROGRAM) y.tab.c newversion.aux
rm -rf uuencoded
habitant>
script done on Tue Sep 26 11:31:05 1989
--
Pierre Laplante
Universite de Montreal, Dep. I.R.O. X-220, C.P. 6128, succursale A
Montreal (Quebec) H3C 3J7, (514) 343-6830, laplante@iro.umontreal.ca jacob@gore.com (Jacob Gore) (09/26/89)
/ gnu.bash.bug / laplante@iro.umontreal.ca (Pierre Laplante) / Sep 26, 1989 / > I have the following error when compiling on a NeXT running mach 0.9. > > Script started on Tue Sep 26 11:30:13 1989 > habitant> make > cc -g -Bstatic -o bash shell.o y.tab.o general.o make_cmd.o print_cmd.o > dispose_cmd.o execute_cmd.o variables.o builtins.o copy_cmd.o flags.o > jobs.o subst.o glob.o hash.o mailcheck.o test.o trap.o alias.o > alloc-files/malloc.o braces.o unwind_prot.o bashline.o version.o > readline/libreadline.a /usr/lib/libtermcap.a > ld: multiple definitions of symbol _realloc > ld: multiple definitions of symbol _malloc > ld: multiple definitions of symbol _free > Undefined symbols: > lmodt > lmult > ldivt NeXT's cc, by default, links with the shared library /lib/libsys_s.a, and the loader does not allow symbols in .o files to overrule those in shared libraries (in 0.9, anyway -- I don't know about 1.0 yet). Using /lib/libc.a instead should get rid of the "multiple definitions" problem. I don't know about the undefined symbols. I just use the version of malloc in the shared library (just set MALLOC and MALLOC_FLAGS to nothing in the Makefile). Jacob -- Jacob Gore Jacob@Gore.Com boulder!gore!jacob