Given the following c code from sysvinit's init.c: if (ch->action == SYSINIT) strcpy(ch->rlevel, "#");
gcc is producing the correct set of instructions for little endian arm, but incorrect set of instructions for big endian arm. That line when compiled with -mlittle-endian (correct): ldr r1, [r5, #40] cmp r1, #13 moveq r3, #35 moveq r2, #0 streqb r3, [r5, #28] streqb r2, [r5, #29] That line when compiled with -mbig-endian (wrong): ldr r1, [r5, #40] cmp r1, #13 moveq r3, #0 streqb r3, [r5, #29] streqb r3, [r5, #28] This results in ch->rlevel[0] set to zero instead of '#'. Offsets/enums are correct (40 for action, 28 for start of rlevel, and 13 for SYSINIT). I can post entire preprocessed and compiled output if needed. compile line is: arm-linux-gcc -c -mlong-calls -fPIC -mbig-endian -Wall -O2 -D_GNU_SOURCE init.c gcc version 3.3.6 -- Summary: [ARM EB] strcpy() of small string constant produces wrong instructions Product: gcc Version: 3.3.6 Status: UNCONFIRMED Severity: normal Priority: P2 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: djohnson+gcc at sw dot starentnetworks dot com GCC build triplet: i686-linux GCC host triplet: i686-linux GCC target triplet: arm-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24528