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]

[Fwd: Odd and Odder]




Joel wrote:
> 
> Mark:
> 
> Take a look at your memory map. You'll probably find that section .rodata starts on an odd numbered
> address when it fails.
> 
> This is happening because of where your linker script puts that section.
> (a function of what has occurred in memory in previous sections)
> 
> Take a look the ALIGN instruction under ld
> 
> I think if you added a
>         . = ALIGN(0x4);
> 
> before the
>         *(.rodata)
> 
> in your linker command that "May" fix your problem.
> 
> This will cause the .rodata to be aligned on a long word boundary
> 
> --      joel
> 
> Mark Palmerino wrote:
> >
> > 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

------
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]