This is the mail archive of the crossgcc@sources.redhat.com mailing list for the crossgcc project.

See the CrossGCC FAQ for lots more information.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Odd and Odder


Again, many thanks to everyone who offered suggestions for the problem I'm
running into.

I've tried many of them and now have one piece of "odd" information that I
don't quite understand what to do with, but I'm hoping someone will. Also,
what I thought worked before (e.g., char const) doesn't work all the time -
read on for more details.

Quick Problem Description: References to strings in the following fashion
cause the program to bomb:
strcpy(stringVar, "this is text");
lcd_print("this is text");

Here is a summary of the ideas (and please forgive me if I didn't fully
understand some of them):

1. Jim Bates (and others): check where strings are being stored. Also, try
-traditional and -fwritable-strings
2. Stefan Peters: take a look at the assembler code to see what makes things
different (i.e., the times when it works, and the times when it doesn't).
Specifically, check on the 'alignment of the data'.
3. Yves Rutschle: had some ideas about why the code was working when I
included a printf
4. Jay Kulpinski: try -fno-writable-strings, also check where the strings
get stored (might have to change linker script to get them into .rodata
section).

(Again, please forgive me if I either misrepresented anyone's suggestion or
missed a suggestion!)

I see two themes here - first, check the assembly output and second, try
different compilation flags.

I have tried a few things. Before I go into a more detailed explanation, I
did find the following in my experiments:

If the referenced string is an odd number of characters, the program does
*not* bomb.  For example, the following works:

lcd_print("123");

And the following does not work:

lcd_print("12");

The following works:

lcd_print("12\0");  //That's a backslash-zero for a Null, is interpreted as
1 char

And the following does not work:

lcd_print("123\0");

I'm guessing this gives credence to this being an 'alignment' problem.
Unfortunately, I don't know what to do about it.

Here is a simple test c program:

#include <string.h>
#include <stdio.h>

int main(void) {
      int i;
      char someText[256];

      strcpy(someText,"12");
}

and here is the assembly that is produced by m68k-elf-gcc -S test.c

      .file   "alcdtest.c"
gcc2_compiled.:
.globl __main
.section        .rodata
.LC0:
      .string "12"
.text
.globl main
      .type    main,@function
main:
      link.w %a6,#-260
      jsr __main
      pea .LC0
      move.l %a6,%d0
      add.l #-260,%d0
      move.l %d0,-(%sp)
      jsr strcpy
      addq.l #8,%sp
.L2:
      unlk %a6
      rts
.Lfe1:
      .size    main,.Lfe1-main
      .ident  "GCC: (GNU) 2.95.2 19991024 (release)"

When compiled and downloaded, this program bombs with the following output
from cpu32bug:

Exception: Address Error
Format/Vector=C00C
SSW=00D6  Fault Addr.=00090CB9  Data=00007FEC  Cur. PC=00090120  Cnt.
Reg.=0001
PC   =00090126 SR   =2704=TR:OFF_S_7_..Z..   VBR  =00000000
SFC  =5=SD     DFC  =5=SD     USP  =0000FC00 SSP* =00007FD4
D0   =00000000 D1   =01D6FFFF D2   =00000000 D3   =00000000
D4   =00000000 D5   =00000000 D6   =00000000 D7   =00000000
A0   =0000315E A1   =00003156 A2   =0000315A A3   =00000000
A4   =00000000 A5   =00000000 A6   =00007FF8 A7   =00007FD4
00090126 48780000           PEA.L       ($0).W


Now, if I change the string from "12" to "123", the program does not bomb.

I tried compiling with -fno-writable-strings and this made no difference.
Also, if I do the following with char const, the program bombs:

char const footext[] = "12";
.
.
.
strcpy(someText,footext);

However, building the string up in the following manner, does work
regardless of the number of characters that end up in the string:

int main(void) {
      int i;
      char someText[256];
      char footext[256];

footext[0] = '1';
footext[1] = '2';
footext[2] = '3';
footext[3] = '4';
footext[4] = '\0';

      strcpy(someText,footext);
}


So, with this new information, does anyone have any ideas for how to fix the
problem?

Again, many, many thanks!




------
Want more information?  See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sourceware.cygnus.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]