rp@osc.COM (Rich Patterson) (02/10/90)
Hi,
Here is a problem that I've found in g++/libg++. Flames --> /dev/null.
Synopsis: __CTOR_LIST__ is invalid for the following program (G++-1.36.4/
LIBG++-1.35.3 386 System V GAS and COFF encapsulaton) and dumps
core. Initialized global string constant causes problems.
Description: If I compile the following "3" line program and run it, it dumps
core. I used GDB to detect where, it is happening in __do_global_init
What I noticed is that the __CTOR__LIST__ length and vectors
are garbage. The length is something like 5030 and any vector with
an odd index is an invalid entry. The first entry *ppf[0] is valid
and returns when called. The second entry(*ppf[1]) is 0, and obviously
crashes. If I compile the modified program,ie., take the string
constant and make it local and not a global the program runs fine. The
__CTOR_LIST__ in this case contains two entries both valid.
G++ configuration: Version 1.36.4, i386-sysv-gas (386 System V, GAS COFFencap)
LIBG++: Version 1.36.3
Hardware: 386 IBM/PC clone with 7 megs
Software: Unix System V release 3.0 for the 386 (Microport System V/386)
Submitter: Rich Patterson <osc!rp@pacbell.com>
I've included the test programs plus the assembler output etc. that
exercise the problem. If the program is compiled with g++ 1.35 on a Sun-3
or AT&T C++ 2.0, it runs fine. If you need anymore information, etc. let
me know. I'd like to get the bugs worked out of the 386 version.
Here is the problem test program:
#include <stream.h>
char *tops = "This is a test.";
main()
{
cout << tops;
}
Here is the assembler output:
.file "btest.c"
gcc_compiled.:
.text
.align 4
LC0:
.double 0d0.00000000000000000000e+00
.globl _tops
LC1:
.ascii "This is a test.\0"
.data
.align 4
_tops:
.long LC1
.text
.align 4
.globl _main
_main:
pushl %ebp
movl %esp,%ebp
pushl %edi
pushl %esi
pushl %ebx
call ___main
movl %eax,%eax
movl $_cout,%ebx
movl _tops,%esi
xorl %edi,%edi
cmpl $0,_cout+4
jne L714
pushl %esi
pushl _cout
call _sputs__9streambufPCc
movl %eax,%eax
addl $8,%esp
cmpl $-1,%eax
je L714
jmp L713
.align 4
L714:
movl $1,%edi
L713:
testl %edi,%edi
je L716
movl $2,%eax
orl $2,_cout+4
L717:
L716:
movl $_cout,%eax
jmp L715
.align 4
L715:
jmp L712
.align 4
L712:
xorl %eax,%eax
jmp L711
.align 4
L711:
leal -12(%ebp),%esp
popl %ebx
popl %esi
popl %edi
leave
ret
Here is the version of the program that doesn't dump core:
#include <stream.h>
main()
{
char *tops = "This is a test.";
cout << tops;
}
Here is the assembler produced by that program:
.file "btest.c"
gcc_compiled.:
.text
.align 4
LC0:
.double 0d0.00000000000000000000e+00
LC1:
.ascii "This is a test.\0"
.align 4
.globl _main
_main:
pushl %ebp
movl %esp,%ebp
subl $4,%esp
pushl %edi
pushl %esi
pushl %ebx
call ___main
movl %eax,%eax
movl $LC1,-4(%ebp)
movl $_cout,%ebx
movl -4(%ebp),%esi
xorl %edi,%edi
cmpl $0,_cout+4
jne L714
pushl %esi
pushl _cout
call _sputs__9streambufPCc
movl %eax,%eax
addl $8,%esp
cmpl $-1,%eax
je L714
jmp L713
.align 4
L714:
movl $1,%edi
L713:
testl %edi,%edi
je L716
movl $2,%eax
orl $2,_cout+4
L717:
L716:
movl $_cout,%eax
jmp L715
.align 4
L715:
jmp L712
.align 4
L712:
xorl %eax,%eax
jmp L711
.align 4
L711:
leal -16(%ebp),%esp
popl %ebx
popl %esi
popl %edi
leave
ret
And here is the g++ -v output that was used to compile the program:
/usr2/tmp/g++/g++ -B/usr2/tmp/g++/ -I/usr2/tmp/libg++/g++-include -v -o btest
btest.c
g++ version 1.36.4 (based on GCC 1.36.93)
/usr/local/lib/gcc-cpp -+ -v -I/usr2/tmp/libg++/g++-include -undef -D__GNUC__
-D__GNUG__ -D__cplusplus -Dunix -Di386 -D__unix__ -D__i386__ btest.c
/usr/tmp/cca02562.cpp
GNU CPP version 1.36
/usr2/tmp/g++/cc1plus /usr/tmp/cca02562.cpp -quiet -dumpbase btest.c -version
-o /usr/tmp/cca02562.s
GNU C++ version 1.36.4 (based on GCC 1.36.93) (80386, BSD syntax) compiled by
GNU C version 1.36.
default target switches: -m80387
/usr/local/lib/gcc-as -o btest.o /usr/tmp/cca02562.s
/usr/local/lib/gcc-ld -o btest /usr/local/lib/gcc-crt0.o btest.o -lg++
/usr/local/lib/gcc-gnulib -lcrp@rpx.UUCP (Rich Patterson) (02/11/90)
In article <2019@osc.COM>, rp@osc.COM (Rich Patterson) writes: > Hi, > Here is a problem that I've found in g++/libg++. Flames --> /dev/null. > > Synopsis: __CTOR_LIST__ is invalid for the following program (G++-1.36.4/ > LIBG++-1.35.3 386 System V GAS and COFF encapsulaton) and dumps > core. Initialized global string constant causes problems. > I found the problem. The problem was I was using ld instead of ld++. I had tried ld++ earlier and, ld++ itself core dumped on my while linking. It had something to do with cplus-dem.c. When I built ld++ the first time it needed 'index' (which is incompatible on SysV) instead of strchr. I recompiled it using strchr and both the linker and program work just fine now. Rich P. rp@osc [by day] {pacbell,amdcad}!osc!rp rp@rpx [by night] {pyramid,zycad}!rpx!rp