ps: incorrect dereference of implicit memcpy

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



tested with a cross-compiler
i686-pc-linux-gnu-gcc (GCC) 3.4.4
and the suse 10.1 native
gcc (GCC) 4.1.0 (SUSE Linux) 
 

-----Original Message-----
From: gcc-help-owner@xxxxxxxxxxx [mailto:gcc-help-owner@xxxxxxxxxxx] On
Behalf Of Woytech Karl-Heinz
Sent: Donnerstag, 05. Oktober 2006 11:35
To: gcc-help@xxxxxxxxxxx
Subject: incorrect dereference of implicit memcpy

Hello,

I am working on an x86 embedded system where we do not have ld/libc
onboard. our OS provides basic libc functions and does it's own dynamic
linking for the applications. 

Basic function dereferencing works properly, our problem is with the
implicit function calls that gcc makes for copying structs.

When the application code below gets started our OS finds the 'imex'
structure and correctly fills out the required function pointers so that
calls to the fn's result in the code provided by the os getting called.

Thus the explicit call
  jimbob(815);
translates to 
  push   $0x32f
  call   *0x804912c

  memcpy (dest, src, 20);
translates to 
  push   $0x14
  push   %ebx
  lea    0xffffff61(%ebp),%eax
  push   %eax
  call   *0x8049128

which is also good
BUT the structure copy x=y becomes
  push   $0x16
  push   %eax
  push   %edx
  call   8049128  <- no '*'

which is a direct jump into memory instead of a jump to the dereference
of the memory location. as of that moment the application crashes. below
are our build commands and the program.

Am I doing something wrong here, or do i have incorrect cflags/ldflags?
ie can i get gcc to produce the same derefecenced call as per the
explicit calls?

Thanks in advance for any input
  Charlie  



gcc testjmp.c -c -o testjmp.o -ffreestanding -march=i386 -g -Os
-fno-builtin ld testjmp.o -o testjmp -static -nostdlib objdump testjmp
-DSx > testjmp.dis

testjmp.c:

// structure def for our import/export table typedef struct imex_s {
  char name[16];
  void *ptr;
  } imex_t;

// fixed typedefs for our funcions
typedef int  (*jimbob_t)(int jb);
typedef void (*memcpy_t)(char *d, char *s, int l);

// memory space for the to be linked fn's will be in .bss jimbob_t
jimbob; memcpy_t memcpy;

// our import table will be in .const
const imex_t imex[] =
 {
   { "jimbob", (void*)&jimbob},
   { "memcpy", (void*)&memcpy}
 };

// test struct for x=y
typedef struct
   {
   char Bytes[22];
   } structure_t;

int main(int argc, char *argv[])
  {
  char dest[100];
  char src[] = {"hello pdts"};
  volatile structure_t X, Y;

  jimbob(815);

  memcpy (dest, src, 20);
  X = Y; /* gcc creates a memcpy here */

  return 0;
  }// main


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux