gustav@arp.anu.edu.au (Zdzislaw Meglicki) (03/07/91)
Hi,
I have a problem trying to compile and test libg++-1.39.0 on the
Sequent Symmetry S27 running DYNIX 3.0.17.9. Here is the problem:
When I compile it with
#XTRAFLAGS = -DNO_LIBGXX_MALLOC
i.e., with NO_LIBGXX_MALLOC commented out, then when running the tests
the following programs work:
tBag tBitString tComplex tCurses tDeque tFix tGetOpt tMap tPQ
tQueue tRational tSet tStack tString
and the following dump the core:
tBitSet tFile tFix16 tFix24 tInteger tLList tObstack tPlex
tRandom tVec
When the library is compiled with NO_LIBGXX_MALLOC activated, i.e.:
XTRAFLAGS = -DNO_LIBGXX_MALLOC
then exactly the opposite happens, i.e., programs that worked previously
dump the core and those that dumped the core previously work.
My gcc is _not_ using the supplied malloc relying instead on DYNIX
malloc, i.e., it's been compiled with:
# ALLOCA = alloca.o
# MALLOC = malloc.o
commented out. I am using GNU's assembler and loader, there do not
seem to be any problems with these during the compilation stage.
I have compiled g++ and libg++ twice, the first time with
MALLOC = malloc.o
uncommented, and the second time with MALLOC commented out, but the test
behaviour described above was unchanged. (I have not remade gcc itself
though to use the supplied malloc and alloca).
I would be most grateful for your advice.
=======================================================================
Some simple libg++ bugs report:
=======================================================================
1)
During installation I have found the following problems in g++ source
and libg++ source itself: DYNIX does not provide a header file
string.h
Many files in g++-1.39.0 source tried to include that file regardless.
There is an elegant #ifdef in cplus-dem.c which fixes this problem,
but which does not appear in other files:
#ifdef USG
#include <memory.h>
#include <string.h>
#else
#include <strings.h>
#define memcpy(s1, s2, n) bcopy ((s2), (s1), (n))
#define memcmp(s1, s2, n) bcmp ((s2), (s1), (n))
#define strchr index
#define strrchr rindex
#endif
I have copied and pasted that part of code in place of bare
#include <string.h>
in cplus-lex.c, which is using strchr. As to other files I solved the
problem by making a symbolic link: string.h -> strings.h in my /usr/include.
2)
In libg++-1.39.0/Makefile the line defining "all" was:
all: src tests genclass etc gperf
Yet, genclass is needed during the tests. I have changed that to:
all: src genclass tests # etc gperf
(since I can't get through tests, I didn't bother about etc, and gperf)
=========================================================================
Bug reports about gas-1.38 -> please pass it to the concerned
=========================================================================
1)
The Makefile recommends using for the Sequent:
G0 = -g -I. -DUSE_SYSTEM_HDR -DEXEC_VERSION=1
The option EXEC_VERSION is used _only_ in write.c:
#ifdef EXEC_VERSION
md_number_to_chars((char *)&the_exec.a_version,EXEC_VERSION,sizeof(the_exec.a_
version));
#endif
where (in the same file, i.e., write.c)
static struct exec the_exec;
But in a.out.gnu.h struct exec is defined as follows:
struct exec
{
unsigned long a_info; /* Use macros N_MAGIC, etc for access */
unsigned a_text; /* length of text, in bytes */
unsigned a_data; /* length of data, in bytes */
unsigned a_bss; /* length of uninitialized data area for file, i
n
bytes */
unsigned a_syms; /* length of symbol table data in file, in bytes
*/
unsigned a_entry; /* start address */
unsigned a_trsize; /* length of relocation info for text, in bytes
*
/
unsigned a_drsize; /* length of relocation info for data, in bytes
*
/
};
In other words, there is no member a_version. The word "a_version" is only
used in write.c in the context specified above.
Inspection of the source revealed that the option USE_SYSTEM_HDR is not
used anywhere (sic!) instead the definition of structure exec is flanked
by #ifdef __STRUCT_EXEC_OVERRIDE__. However, that part of the code does
not include appropriate <exec.h> if __STRUCT_EXEC_OVERRIDE__ is activated.
I have replaced the above definition of exec with the following:
---------------------
#ifndef __STRUCT_EXEC_OVERRIDE__
struct exec
{
unsigned long a_info; /* Use macros N_MAGIC, etc for access */
unsigned a_text; /* length of text, in bytes */
unsigned a_data; /* length of data, in bytes */
unsigned a_bss; /* length of uninitialized data area for file, i
n bytes */
unsigned a_syms; /* length of symbol table data in file, in bytes
*/
unsigned a_entry; /* start address */
unsigned a_trsize; /* length of relocation info for text, in bytes
*/
unsigned a_drsize; /* length of relocation info for data, in bytes
*/
};
#else
#include <exec.h>
#define a_info a_magic
#endif /* __STRUCT_EXEC_OVERRIDE__ */
------------------------
Then a couple of lines below:
------------------------
#ifndef __STRUCT_EXEC_OVERRIDE__
#define OMAGIC 0407
#endif
/* Code indicating pure executable. */
#define NMAGIC 0410
/* Code indicating demand-paged executable. */
#ifndef __STRUCT_EXEC_OVERRIDE__
#define ZMAGIC 0413
#endif
-----------------------
and in the Makefile itself:
G0 = -g -I. -DUSE_SYSTEM_HDR -DEXEC_VERSION=1 -D__STRUCT_EXEC_OVERRIDE__
I have then copied a.out.gnu.h modified in this way from the gas directory
to the loader directory, and remade both ld and gas.
==========================================================================
--
Gustav Meglicki, gustav@arp.anu.edu.au,
Automated Reasoning Project, RSSS, and Plasma Theory Group, RSPhysS,
The Australian National University, G.P.O. Box 4, Canberra, A.C.T., 2601,
Australia, fax: (Australia)-6-249-0747, tel: (Australia)-6-249-0158