hlu@yoda.eecs.wsu.edu (Hongjiu Lu) (06/10/91)
In my previous article I sent, I forgot mentioning the machine I am trying to build g++ 1.39.1 and libg++ 1.39.0 on, which is an AT386 and running AT&T UNIX System V/386 Release 3.2.2. I am using the native assembler and linker come with the system. I finaly managed to compile everthing. After playing around for serveral days I finally passed all the tests of libg++. Also it works fine now, I still have somethngs I don't understand. It seems that the output of ld -r cannot be used with the later ld run everytime. Some of them will produce the error message "Bus error - core dumped" during the final ld run to create the executable file. Here is the example of a ld run. g++ -v -o tPQ tPQ.o -L. -L../src -ltest -lg++ -lm -lc_s g++ version 1.39.1 (based on GCC 1.39) ld -r -o /usr/tmp/cca00467.R /lib/crt1.o -L. -L../src tPQ.o -ltest -lg++ -lm -lc_s -lg++ /usr/local/lib/gcc-gnulib -lc /lib/crtn.o /usr/local/lib/gcc-collect -o /usr/tmp/cca00467.s /usr/tmp/cca00467.R as /usr/tmp/cca00467.s -o /usr/tmp/cca00467.O ld -o ttt /usr/tmp/cca00467.R /usr/tmp/cca00467.O g++: Program ld got fatal signal 10. I was wondering under what condition ld will cause the bus error when doing a ld -o xxx xxx.o xxx.o Could anyone give me a hint? I got around this by relink everything. But I still want to know why I have to do this. Thanks in advance. H.J. Lu
silber@m.cs.uiuc.edu (Ami A. Silberman) (06/18/91)
hlu@yoda.eecs.wsu.edu (Hongjiu Lu) writes: >In my previous article I sent, I forgot mentioning the machine I am >trying to build g++ 1.39.1 and libg++ 1.39.0 on, which is an AT386 and >running AT&T UNIX System V/386 Release 3.2.2. I am using the native >assembler and linker come with the system. >I finaly managed to compile everthing. After playing around for >serveral days I finally passed all the tests of libg++. Also it works >fine now, I still have somethngs I don't understand. >It seems that the output of ld -r cannot be used with the later ld run >everytime. Some of them will produce the error message "Bus error - core >dumped" during the final ld run to create the executable file. Here is >the example of a ld run. >g++ -v -o tPQ tPQ.o -L. -L../src -ltest -lg++ -lm -lc_s >g++ version 1.39.1 (based on GCC 1.39) > ld -r -o /usr/tmp/cca00467.R /lib/crt1.o -L. -L../src tPQ.o -ltest -lg++ -lm -lc_s -lg++ /usr/local/lib/gcc-gnulib -lc /lib/crtn.o > /usr/local/lib/gcc-collect -o /usr/tmp/cca00467.s /usr/tmp/cca00467.R > as /usr/tmp/cca00467.s -o /usr/tmp/cca00467.O > ld -o ttt /usr/tmp/cca00467.R /usr/tmp/cca00467.O >g++: Program ld got fatal signal 10. >I was wondering under what condition ld will cause the bus error when >doing a > ld -o xxx xxx.o xxx.o >Could anyone give me a hint? I got around this by relink everything. >But I still want to know why I have to do this. >Thanks in advance. >H.J. Lu What probably happened was that, due to a bug in your native C compiler, lines 530-about 532 of expr.c in the gnu assembler code were miscompiled. the lines read: "if (expressionP -> X_subtract_symbol == expressionP ->X_addsymbol || (expressionP->X_subtract_symbol->sy_frag==expressionP->X_add_symbol->sy_frag and the next line is similar. If expressionP->X_subtract_symbol == 0, and expressionP->X_addsymbol != 0, then there will be an attempted access down a nul pointer and a resulting bus error, signal 10. The fix is to add the following two lines before the above expression if (expressionP-> X_subtract_symbol == NULL) {break;} if (expressionP-> X_add_symbol == NULL) {break;} I found that this works fine. -- ami silberman - janitor of lunacy silber@cs.uiuc.edu