Article View: gnu.g++.bug
Article #2186Global string constant causes core dump g++/libg++ 1.36.x on 386
From: Rich Patterson
Date: Fri, 09 Feb 1990 22:47
Date: Fri, 09 Feb 1990 22:47
196 lines
5452 bytes
5452 bytes
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 -lc
Technical Details
Message-ID:
<2019@osc.COM>Path:
arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!uwm.edu!rpi!zaphod.mps.ohio-state.edu!uakari.primate.wisc.edu!ames!pacbell!osc!rpShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!uwm.edu!rpi!zaphod.mps.ohio-state.edu!uakari.primate.wisc.edu!ames!pacbell!osc!rp From: rp@osc.COM (Rich Patterson) Newsgroups: gnu.g++.bug,gnu.g++.lib.bug Subject: Global string constant causes core dump g++/libg++ 1.36.x on 386 Keywords: G++ LIBG++ 386 System V Message-ID: <2019@osc.COM> Date: 9 Feb 90 22:47:36 GMT Followup-To: poster Organization: Object Sciences Corp., Menlo Park, CA Lines: 196