🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: gnu.g++.bug
Article #2186

Global string constant causes core dump g++/libg++ 1.36.x on 386

#2186
From: Rich Patterson
Date: Fri, 09 Feb 1990 22:47
196 lines
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!rp

Show 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