jimb@occs.cs.oberlin.edu (02/21/90)
I believe there is a bug regarding the -nostdlib option in gcc version
1.36. The documentation for this option:
`-nostdlib'
Don't use the standard system libraries and startup files when
linking. Only the files you specify (plus `gnulib') will be
passed to the linker.
I read this to mean that gcc links with gnulib whether -nostdlib is
specified or not. However, gcc does not seem to include gnulib when
the -nostdlib option is given. An annotated transcript, on a Sun 3/60
running SunOS Release 4.0:
betty% ls -l tm.h md
lrwxrwxrwx 1 gnusoft 16 Feb 20 23:09 md -> ./config/m68k.md
lrwxrwxrwx 1 gnusoft 18 Feb 20 23:09 tm.h -> ./config/tm-sun3.h
betty%
These are the linkages for md and tm.h.
betty% cat foo.c
main(int x)
{
return (x-1)/x;
}
betty%
This is a sample program that exacerbates the bug. Note that these
ints are 32 bits, so this will require 32-bit division.
betty% ./gcc -v -m68000 -nostdlib -e _main foo.c -o foo
gcc version 1.36
/usr/users/software/gnusoft/lib/gcc-cpp -v -undef -D__GNUC__ -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__HAVE_68881__ -Dmc68010 foo.c /usr/tmp/cca12192.cpp
GNU CPP version 1.36
/usr/users/software/gnusoft/lib/gcc-cc1 /usr/tmp/cca12192.cpp -quiet -dumpbase foo.c -m68000 -version -o /usr/tmp/cca12192.s
GNU C version 1.36 (68k, MIT syntax) compiled by GNU C version 1.36.
default target switches: -m68020 -mc68020 -m68881 -mbitfield
as -mc68010 -o foo.o /usr/tmp/cca12192.s
ld -o foo -dc -dp -e _main foo.o
Undefined:
___divsi3
betty%
I am using GCC to compile for a 68010. When compiled with the -m68000
flag, gcc generates a call to the gnulib division function, but
doesn't seem to link with gnulib.
betty% ./gcc -v -m68000 -e _main foo.c -o foo
gcc version 1.36
/usr/users/software/gnusoft/lib/gcc-cpp -v -undef -D__GNUC__ -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__HAVE_68881__ -Dmc68010 foo.c /usr/tmp/cca12197.cpp
GNU CPP version 1.36
/usr/users/software/gnusoft/lib/gcc-cc1 /usr/tmp/cca12197.cpp -quiet -dumpbase foo.c -m68000 -version -o /usr/tmp/cca12197.s
GNU C version 1.36 (68k, MIT syntax) compiled by GNU C version 1.36.
default target switches: -m68020 -mc68020 -m68881 -mbitfield
as -mc68010 -o foo.o /usr/tmp/cca12197.s
ld -o foo -dc -dp -e _main /lib/crt0.o /lib/Mcrt1.o foo.o /usr/users/software/gnusoft/lib/gcc-gnulib -lc
betty%
Without the -nostdlib option, things compile fine, so it *is* finding
gnulib normally.
betty% gcc -v -m68000 -nostdlib -e _main foo.c ~gnusoft/lib/gcc-gnulib -o foo
gcc version 1.36
/usr/users/software/gnusoft/lib/gcc-cpp -v -undef -D__GNUC__ -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__HAVE_68881__ -Dmc68010 foo.c /usr/tmp/cca12202.cpp
GNU CPP version 1.36
/usr/users/software/gnusoft/lib/gcc-cc1 /usr/tmp/cca12202.cpp -quiet -dumpbase foo.c -m68000 -version -o /usr/tmp/cca12202.s
GNU C version 1.36 (68k, MIT syntax) compiled by GNU C version 1.36.
default target switches: -m68020 -mc68020 -m68881 -mbitfield
as -mc68010 -o foo.o /usr/tmp/cca12202.s
ld -o foo -dc -dp -e _main foo.o /usr/users/software/gnusoft/lib/gcc-gnulib
betty% ls ~gnusoft/lib
bison.hairy dump.h gcc-cpp* gcc-include/
bison.simple gcc-cc1* gcc-gnulib* window.h
betty%
When one explicitly specifies gnulib with -nostdlib, things work fine.
It seems to me that this is a case of gcc not performing as
documented.
Otherwise, GCC is a pleasure to use.
Jim Blandy - jimb@occs.cs.oberlin.edu