Re: Direct assignment of code to function pointer: not working in gcc 4.x

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

 



   Hi,
Thank you for your response, Ian. The system is GNU/Linux, so I did as you said, and used "-z execstack" option for the linker, and now the code works properly. It seems then that GCC 4.x is more restrictive about executing things from the stack than GCC 3.x.
   Kind regards,

   Aníbal.

Ian Lance Taylor wrote:
Anibal Caceres Hernando <anibal.caceres@xxxxxxxxxxxx> writes:

int main() {
   char *code = new char[5];
   int codeIndex = 0;
   printf("Start!!\n");

   code[codeIndex++]=0x55; //push %ebp
   code[codeIndex++]=0x89; //mov    %esp,%ebp
   code[codeIndex++]=0xe5;    //"

   code[codeIndex++]=0xc9; //LEAVE
   code[codeIndex++]=0xc3; //RET

   FunctionType invoke=(FunctionType)&code[0];
   invoke();

   printf("Finish!!\n");
   return 0;
}

   If this is compiled with gcc 3.3.3 it executes without any problem:
prints "Start!!", then executes invoke(), which does nothing, as you
can see (the assembler is just a call to an empty function), and
finally it prints "Finish!!".
   But the problem happens when I compile this using gcc 4.1.2 (and
the same happens with 4.2.2): prints "Start!!", and it gives a
Segmentation Violation when it starts executing invoke (I've seen
using the gdb that the SIGSEGV happens just in the first instruction,
in the "push %ebp").

This program requires an executable stack.  You neglected to mention
which system you are running on.  If it is GNU/Linux, see the
execstack(8) man page.

Ian


[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