DEEJ@MAINE.BITNET (Dj Merrill) (01/08/91)
I am trying to make the gcc compiler under ultrix 4.0 on a decstation 3100. I have followed the instructions (At least I think so.. :-) ) but am having problems compiling with the -g option. If I omit this, the gcc compiler seems to make okay, but when I do the check to see if the files are different, they are. This would indicate an error of some kind. Has anyone run across this problem and have a fix?? I have tried the 'ar rc /usr/local/lib/libg.a' mentioned in the INSTALL file with no luck. +------------------------------+ | Dj Merrill | | Systems and Network Manager | | University of Maine NCGIA | | | | deej@grouse.umesve.maine.edu | | deej@maine.maine.edu | +------------------------------+
meissner@osf.org (Michael Meissner) (01/08/91)
In article <91007.141905DEEJ@MAINE.BITNET> DEEJ@MAINE.BITNET (Dj Merrill) writes: | I am trying to make the gcc compiler under ultrix 4.0 on a decstation 3100. | I have followed the instructions (At least I think so.. :-) ) | | but am having problems compiling with the -g option. If I omit this, the | gcc compiler seems to make okay, but when I do the check to see if the files | are different, they are. This would indicate an error of some kind. | Has anyone run across this problem and have a fix?? | | I have tried the 'ar rc /usr/local/lib/libg.a' mentioned in the | INSTALL file with no luck. Sigh, I seem to make the same explanation about the MIPS object file format every month of so (though in different groups). Here is what I posted to the gnu newsgroup recently (the debug hacks mentioned are the patches available for anonymous FTP from foobar.colorado.edu in the pub/Gnu-For-Pmax directory): | From: rusty@belch.Berkeley.EDU (Rusty Wright) | Newsgroups: gnu.gcc.help | Date: 1 Jan 91 23:32:43 GMT | Distribution: gnu | Organization: Computer Center, UC Berkeley | | The suggested method of doing the compares of the .o files for the | different stages (2 & 3?) no longer works; strip now complains about | not stripping objects with relocation entries in them. Does anybody | have a method for doing the verify? Here is a perl script that I hacked together to compare MIPS objects (ie, on a DECstation), section by section. Without my debug hacks, expect that you will see differences in the local strings section. This is because the assembler puts the filename into the file section, and the filename changes each time, based on the PID of the gcc cover program. My debug hacks strip out this filename, since the compiler provided .file directive identifies the file properly. My script expects you to have done a make stage3 after doing the bootstrap. Alternatively, you could use the fixes the ecoff-cmp that were recently posted. #! /usr/bin/perl # Script to compare gcc binaries in the stage2 and stage3 directories. # Author: Michael Meissner meissner@osf.org sub MAX { local($max) = pop(@_); foreach $foo (@_) { $max = $foo if $max < $foo; } $max; } sub MIN { local($min) = pop(@_); foreach $foo (@_) { $min = $foo if $min > $foo; } $max; } # Arg 1 is the character value as a numeric # Arg 2 is the character value as a string # Arg 3 is prefix string # Arg 4 is suffix string sub PRINT { local ($numeric, $string, $prefix, $suffix) = @_; printf ("%s: 0x%.2x %3d %s%s", $prefix, $numeric, $numeric, ($numeric >= ord (' ') && $numeric <= ord ('~')) ? "'$string'" : " ", $suffix); } # Arg 1 is the offset into the beginning of the bytes to compare # Arg 2 is the length of the bytes to compare # Arg 3 is the name of the section being compared # Arg 4 is the secondary name # Return 1 if the sections are equal, 0 otherwise sub COMPARE_SECTION { local ($offset, $length, $name, $name2) = @_; local ($i, $j, $ch2_str, $ch2, $ch3_str, $ch3, $lines, $max, $max2, $chunk_len); printf ("comparing offset %10d [0x%.8x], length %10d [0x%.8x], name %s%s\n", $offset, $offset, $length, $length, $name, $name2) if ($vflag); if ($length == 0) { return 1; } $max = $offset + $length; die "Offset $offset is out of bounds in $name\n" unless ($offset >= 0 && $offset <= length ($bytes2)); die "Max Offset $max is out of bounds in $name\n" unless ($max >= 0 && $max <= length ($bytes2)); if (substr ($bytes2, $offset, $length) eq substr ($bytes3, $offset, $length)) { return 1; } $lines = 0; for ($i = $offset; $i < $max; $i += 8192) { $chunk_len = ($i + 8192 <= $max) ? 8192 : ($max - $i); if (substr ($bytes2, $i, $chunk_len) ne substr ($bytes3, $i, $chunk_len)) { $max2 = $i + $chunk_len; for ($j = $i; $j < $max2; $j++) { $ch2_str = substr ($bytes2, $j, 1); $ch3_str = substr ($bytes3, $j, 1); $ch2 = ord ($ch2_str); $ch3 = ord ($ch3_str); if ($ch2 != $ch3) { &PRINT ($ch2, $ch2_str, ("\t" . $name . $name2 . ' ' . sprintf ($size_format,$i) . ": stage2"), ' '); &PRINT ($ch3, $ch3_str, "stage3", "\n"); if (++$lines > 20) { print "\tSkipping remaining differences\n"; return 0; } } } } } } # Set up global variables relating to MIPS offsets sub SET_UP_MIPS { local ($i); # Mips filehdr looks like: # unsigned short f_magic 0 magic number # unsigned short f_nscns 2 number of sections # long f_timdat 4 time & date stamp # long f_symptr 8 file pointer to symbolic header # long f_nsyms 12 sizeof(symbolic hdr) # unsigned short f_opthdr 16 sizeof(optional hdr) # unsigned short f_flags 18 flags # 20 size of filehdr $filehdr_unpack = 'SSLLLSS'; $filehdr_size = 20; $i = $[; # array indices after unpacking $f_magic = $i++; $f_nscns = $i++; $f_timdat = $i++; $f_symptr = $i++; $f_nsyms = $i++; $f_opthdr = $i++; $f_flags = $i++; # Each section header looks like # char s_name[8] 0 section name # long s_paddr 8 physical address, aliased s_nlib # long s_vaddr 12 virtual address # long s_size 16 section size # long s_scnptr 20 file ptr to raw data for section # long s_relptr 24 file ptr to relocation # long s_lnnoptr 28 file ptr to gp histogram # unsigned short s_nreloc 32 number of relocation entries # unsigned short s_nlnno 34 number of gp histogram entries # long s_flags 36 flags # 40 size of scnhdr $scnhdr_unpack = 'A8LLLLLLSSL'; $scnhdr_size = 40; $i = $[; # array indices after unpacking $s_name = $i++; $s_paddr = $i++; $s_vaddr = $i++; $s_size = $i++; $s_scnptr = $i++; $s_relptr = $i++; $s_lnnoptr = $i++; $s_nreloc = $i++; $s_nlnno = $i++; $s_flags = $i++; # Each relocation entry looks like # long r_vaddr 0 /* virtual address of reference */ # unsigned r_symndx :24 4 /* index into symbol table */ # unsigned r_reserved : 3 4 # unsigned r_type : 4 4 /* relocation type */ # unsigned r_extern : 1 4 /* ext. sym table vs. section # */ # 8 $reloc_unpack = 'LL'; $reloc_size = 8; $i = $[; # array indices after unpacking $r_vaddr = $i++; $r_index_type_extern = $i++; # Each gp entry looks like: # long g_value; 0 /* real/hypothetical value */ # long bytes; 4 /* section size if hypothetical value */ # 8 $gp_unpack = 'LL'; $gp_size = 8; $i = $[; # array indices after unpacking $g_value = $i++; $g_bytes = $i++; # The symbol table header looks like: # short magic 0 to verify validity of the table # short vstamp 2 version stamp # long ilineMax 4 number of line number entries # long cbLine 8 number of bytes for line number entries # long cbLineOffset 12 offset to start of line number entries # long idnMax 16 max index into dense number table # long cbDnOffset 20 offset to start dense number table # long ipdMax 24 number of procedures # long cbPdOffset 28 offset to procedure descriptor table # long isymMax 32 number of local symbols # long cbSymOffset 36 offset to start of local symbol # long ioptMax 40 max index into optimization symbol entries # long cbOptOffset 44 offset to optimization symbol entries # long iauxMax 48 number of auxillary symbol entries # long cbAuxOffset 52 offset to start of auxillary symbol entries # long issMax 56 max index into local strings # long cbSsOffset 60 offset to start of local strings # long issExtMax 64 max index into external strings # long cbSsExtOffset 68 offset to start of external strings # long ifdMax 72 number of file descriptor entries # long cbFdOffset 76 offset to file descriptor table # long crfd 80 number of relative file descriptor entries # long cbRfdOffset 84 offset to relative file descriptor table # long iextMax 88 max index into external symbols # long cbExtOffset 92 offset to start of external symbol entries # 96 $symhdr_unpack = 'SSL23'; $symhdr_size = 96; $i = $[; # array indices after unpacking $S_magic = $i++; $S_vstamp = $i++; $S_ilineMax = $i++; $S_cbLine = $i++; $S_cbLineOffset = $i++; $S_idnMax = $i++; $S_cbDnOffset = $i++; $S_ipdMax = $i++; $S_cbPdOffset = $i++; $S_isymMax = $i++; $S_cbSymOffset = $i++; $S_ioptMax = $i++; $S_cbOptOffset = $i++; $S_iauxMax = $i++; $S_cbAuxOffset = $i++; $S_issMax = $i++; $S_cbSsOffset = $i++; $S_issExtMax = $i++; $S_cbSsExtOffset = $i++; $S_ifdMax = $i++; $S_cbFdOffset = $i++; $S_crfd = $i++; $S_cbRfdOffset = $i++; $S_iextMax = $i++; $S_cbExtOffset = $i++; # Sizes for the various structures in the symbol table # TODO: provide array indices and unpack info for these $HDRR_size = 96; $DNR_size = 8; $PDR_size = 52; $SYMR_size = 12; $FDR_size = 72; $TIR_size = 4; $RFD_size = 4; # Magic numbers -- don't recognize byte swapped headers $MIPSEBMAGIC = 0x0160; $MIPSELMAGIC = 0x0162; } { require 'stat.pl'; &SET_UP_MIPS; if ($#ARGV >= 0 && $ARGV[0] eq "-v") { $vflag = 1; shift; } else { $vflag = 0; } if ($#ARGV >= 0) { @files = @ARGV; } else { @files = ('gcc', 'cc1', 'cpp'); if (-f "stage2/mips-as") { push(files, ('mips-as', 'mips-tfile', 'mips-tdump')); } } print "\n========== Comparing"; $maxlength = 0; $maxsize = 0; foreach $x (@files) { print " ", $x; $maxlength = &MAX ($maxlength, length ($x)); if (-f "stage2/$x") { &Stat ("stage2/$x"); $maxsize = &MAX ($maxsize, $st_size); } } print " in stage2, stage3 subdirectories\n\n"; $| = 1; $successful = 0; $name_format = '%-' . ($maxlength + 2) . 's'; $size_format = '%' . (length ($maxsize . "")) . 'd'; foreach $x (@files) { printf ($name_format, ($x . ",")); $stage2 = "stage2/" . $x; $stage3 = "stage3/" . $x; if (! -f $stage2) { if (! -f $stage3) { print "Does not exist in either stage2 or stage3\n"; } else { print "Does not exist in stage2\n"; } next; } &Stat ($stage2); $s2 = $st_size; if (! -f $stage3) { print "Does not exist in stage3\n"; next; } &Stat ($stage3); $s3 = $st_size; if ($s2 != $s3) { print "Objects are different sizes (", $s2, ", ", $s3, ")\n"; next; } printf ("$size_format bytes, ", $s2); $mips = 0; $timestamp = 0; $no_diffs = 0; # slurp the files into memory open (FILE2, $stage2) || die "$0: open $stage2: $!\n"; $nread2 = read (FILE2, $bytes2, $s2); close (FILE2) || die "$0: close $stage2: $!\n"; if ($nread2 != $s2) { print "Read ", $nread2, " bytes, expected ", $s2, " in reading $stage2.\n"; next; } open (FILE3, $stage3) || die "$0: open $stage3: $!\n"; $nread3 = read (FILE3, $bytes3, $s3); close (FILE3) || die "$0: close $stage3: $!\n"; if ($nread3 != $s3) { print "Read ", $nread3, " bytes, expected ", $s3, " in reading $stage3.\n"; next; } if ($s2 > $filehdr_size) { @filehdr2 = unpack ($filehdr_unpack, substr ($bytes2, 0, $filehdr_size)); @filehdr3 = unpack ($filehdr_unpack, substr ($bytes3, 0, $filehdr_size)); if (($filehdr2[$f_magic] == $MIPSEBMAGIC || $filehdr2[$f_magic] == $MIPSELMAGIC) && $filehdr2[$f_magic] == $filehdr3[$f_magic] && $filehdr2[$f_nscns] == $filehdr3[$f_nscns] && $filehdr2[$f_symptr] == $filehdr3[$f_symptr] && $filehdr2[$f_nsyms] == $filehdr3[$f_nsyms] && $filehdr2[$f_opthdr] == $filehdr3[$f_opthdr] && $filehdr2[$f_flags] == $filehdr3[$f_flags]) { $mips++; printf "Ecoff symbol table starts at $size_format, ", $filehdr2[$f_symptr]; if ($filehdr2[$f_timdat] != $filehdr3[$f_timdat]) { $timestamp++; substr ($bytes2, 4, 4) = "\000\000\000\000"; substr ($bytes3, 4, 4) = "\000\000\000\000"; } } } # do the big compare (presumably with something fast like memcmp). if ($bytes2 eq $bytes3) { print (($timestamp) ? "Only timestamps differ." : "No differences."); $successful++; } else { print "Differences exist:\n\n"; if (! $mips) { &COMPARE_SECTION (0, $s2, "Offset ", ""); } else { # something's different, go through each section and find what's different &COMPARE_SECTION (20, $filehdr2[$f_opthdr], "a.out", "\theader\t"); $section_offset = 20 + $filehdr2[$f_opthdr]; for ($i = 0; $i < $filehdr2[$f_nscns]; $i++) { @scnhdr2 = unpack ($scnhdr_unpack, substr ($bytes2, $section_offset, $scnhdr_size)); &COMPARE_SECTION ($section_offset, 40, $scnhdr2[$s_name], "\theader\t"); $section_offset += 40; &COMPARE_SECTION ($scnhdr2[$s_scnptr], $scnhdr2[$s_size], $scnhdr2[$s_name], "\tdata\t"); &COMPARE_SECTION ($scnhdr2[$s_relptr], $scnhdr2[$s_nreloc] * $reloc_size, $scnhdr2[$s_name], "\treloc\t"); &COMPARE_SECTION ($scnhdr2[$s_lnnoptr], $scnhdr2[$s_nlnno] * 8, $scnhdr2[$s_name], "\tgp.\t"); } # Compare symbol tables now $symlen = $s2 - $filehdr2[$f_symptr]; if ($symlen > 0) { &COMPARE_SECTION ($filehdr2[$f_symptr], $symhdr_size, "symtbl", "\theader\t"); @symhdr2 = unpack ($symhdr_unpack, substr ($bytes2, $filehdr2[$f_symptr], $symhdr_size)); &COMPARE_SECTION ($symhdr2[$S_cbLineOffset], $symhdr2[$S_cbLine], "symtbl", "\tline #\t"); &COMPARE_SECTION ($symhdr2[$S_cbDnOffset], $symhdr2[$S_idnMax] * $DNR_size, "symtbl", "\tdense #\t"); &COMPARE_SECTION ($symhdr2[$S_cbPdOffset], $symhdr2[$S_ipdMax] * $PDR_size, "symtbl", "\t.proc\t"); &COMPARE_SECTION ($symhdr2[$S_cbSymOffset], $symhdr2[$S_isymMax] * $SYMR_size, "symtbl", "\t.lsym\t"); &COMPARE_SECTION ($symhdr2[$S_cbOptOffset], $symhdr2[$S_ioptMax] * $OPTR_size, "symtbl", "\t.opt\t"); &COMPARE_SECTION ($symhdr2[$S_cbAuxOffset], $symhdr2[$S_iauxMax] * $AUXU_size, "symtbl", "\t.aux\t"); &COMPARE_SECTION ($symhdr2[$S_cbSsOffset], $symhdr2[$S_issMax], "symtbl", "\t.lstr\t"); &COMPARE_SECTION ($symhdr2[$S_cbSsExtOffset], $symhdr2[$S_issExtMax], "symtbl", "\t.estr\t"); &COMPARE_SECTION ($symhdr2[$S_cbFdOffset], $symhdr2[$S_ifdMax] * $FDR_size, "symtbl", "\t.file\t"); &COMPARE_SECTION ($symhdr2[$S_cbRfdOffset], $symhdr2[$S_crfd] * $RFD_size, "symtbl", "\t.rfd\t"); &COMPARE_SECTION ($symhdr2[$S_cbExtOffset], $symhdr2[$S_iextMax] * $EXTR_size, "symtbl", "\t.esym\t"); } } } print "\n"; } exit ( $#files + 1 - $successful ); } -- Michael Meissner email: meissner@osf.org phone: 617-621-8861 Open Software Foundation, 11 Cambridge Center, Cambridge, MA, 02142 Considering the flames and intolerance, shouldn't USENET be spelled ABUSENET? -- Michael Meissner email: meissner@osf.org phone: 617-621-8861 Open Software Foundation, 11 Cambridge Center, Cambridge, MA, 02142 Considering the flames and intolerance, shouldn't USENET be spelled ABUSENET?
mra@srchtec.UUCP (Michael Almond) (01/08/91)
In article <91007.141905DEEJ@MAINE.BITNET> DEEJ@MAINE.BITNET (Dj Merrill) writes: > ... but am having problems compiling with the -g option. If I omit this, the >gcc compiler seems to make okay, but when I do the check to see if the files >are different, they are. This would indicate an error of some kind. >Has anyone run across this problem and have a fix?? The gcc distributed from GNU doesn't support debugging on the DECstations. Thus, it doesn't like the -g option. You'll need to get the version that OSF puts out from foobar.colorado.edu (IP address 128.138.243.105). --- Michael R. Almond (Georgia Tech Alumnus) mra@srchtec.uucp (registered) search technology, inc. mra%srchtec@salestech.com 4725 peachtree corners cir., suite 200 emory!stiatl!srchtec!mra norcross, georgia 30092 (404) 441-1457 (office) [search]: Systems Engineering Approaches to Research and Development
meissner@osf.org (Michael Meissner) (01/10/91)
In article <402@srchtec.UUCP> mra@srchtec.UUCP (Michael Almond) writes: | In article <91007.141905DEEJ@MAINE.BITNET> DEEJ@MAINE.BITNET (Dj Merrill) writes: | > ... but am having problems compiling with the -g option. If I omit this, the | >gcc compiler seems to make okay, but when I do the check to see if the files | >are different, they are. This would indicate an error of some kind. | >Has anyone run across this problem and have a fix?? | | The gcc distributed from GNU doesn't support debugging on the DECstations. | Thus, it doesn't like the -g option. Actually with 1.38, it does support -g to the extent of doing line numbers and tracebacks. Local symbols on the other hand are not supported with the vanilla release, since the assembler provides NO way of setting up the local debug information. | You'll need to get the version that OSF puts out from foobar.colorado.edu | (IP address 128.138.243.105). Here is the canned response I generally send out: As part of my work for the Open Software Foundation, I have been supporting GCC for MIPS based platforms. I have fixed tons of bugs, and added things like full debug support and better code to omit the frame pointer. Dirk Grunwald (grunwald@foobar.colorado.edu) has supplied patches to bring up G++ with this compiler, and Per Bothner (bothner@cs.wisc.edu) provided gdb patches. I maintain a mailing list to get the GCC patches automatically. Send me mail if you want to get on the list. In addition, Dirk has allowed me to put copies of the compiler on his machine (foobar.colorado.edu, IP address 128.138.243.105) if you can get sources via anonymous FTP in the pub/Gnu-For-Pmax directory. Here is a list of available files as of December 15th: -rw-r--r-- 1 0 system 1721295 Nov 11 02:59 g++-osf-1.9.2.11.tar.Z -rw-r--r-- 1 0 system 8944 Nov 11 02:59 gcc-1.8.1.5-Iris3.3.shar.Z -rw-r--r-- 1 ftp system 510215 Dec 15 10:34 gcc-fsf-1.37.1-osf-1.9.2.14.patch.Z -rw-r--r-- 1 0 system 39757 Nov 11 02:59 gcc-osf-1.9.2.12-osf-1.9.2.13.patch.Z -rw-r--r-- 1 ftp system 27219 Dec 15 10:34 gcc-osf-1.9.2.13-osf-1.9.2.14.patch.Z -rw-r--r-- 1 ftp system 1290307 Dec 15 10:49 gcc-osf-1.9.2.14.changed-files.tar.Z -rw-r--r-- 1 ftp system 2788255 Dec 15 10:42 gcc-osf-1.9.2.14.tar.Z -rw-r--r-- 1 0 system 59587 Nov 11 02:59 gdb-3.5-mips.patch.Z -rw-r--r-- 1 ftp system 682738 Dec 31 1990 osfrose-tools.new.tar.Z -rw-r--r-- 1 ftp system 3654053 Dec 13 13:36 osfrose-tools.tar.Z -rw-r--r-- 1 0 system 553 Nov 11 02:59 split.c The currently known bugs are (12/15/1990): 1) malloc.c doesn't work properly in libg++, specify the following in the Makefile: XTRAFLAGS = -DNO_LIBGXX_MALLOC 2) You must configure g++ with the following in Makefile: COFFFLAGS = -DUSE_COLLECT -DEXTENDED_COFF and the all target should be: all: g++ cc1plus collect # crt0+.o crt1+.o 3) G++'s Makefile doesn't run in subdirectories yet. 4) Ignore the messages (best as I can tell) about duplicate functions lmask__Fi, rmask__Fi, BSnew__Fi in libg++ -- these are inlines that aren't getting inlined. 5) The tFix and wrapper libg++ tests are known not to work. I also had problems with tRandom. 6) Debugging isn't completely supported for G++ (it is for GCC). 7) Passing structures that are unaligned (ie, contain only shorts and/or chars) will not generate the correct code. George Hartzell (hartzell@boulder.Colorado.EDU) and Peter Ham (ham@cs.stanford.edu) were looking into better G++ debug support. -- Michael Meissner email: meissner@osf.org phone: 617-621-8861 Open Software Foundation, 11 Cambridge Center, Cambridge, MA, 02142 Considering the flames and intolerance, shouldn't USENET be spelled ABUSENET?