This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Cygwin.dll crash, alloca and custom stack


Bitmead, Chris <Chris.Bitmead <at> ag.gov.au> writes:

> 
> 
> I'm writing an implemention of a scheme interpreter in C, and as people
> familiar with that language know, it requires some stack manipulation. Now
> to test this out I wrote a little program....
> 
> #include <stdio.h>
> 
> int main() {
> 	char * st1;
> 	st1 = (void *)malloc(5000) + 5000;
> 	asm("mov %0, %%esp" : : "r" (st1)); 
> 	fprintf(stderr, "hello\n");
> }
> 
> This program crashes silently and prints nothing under cygwin. However this
> kind of thing works fine under Linux.
> 
> Now if I run it under gdb it says 0x610dfbb3 in cygwin1!_alloca () from
> /usr/bin/cygwin1.dll
> 
> Which seems to indicate that the problem has something to do with alloca.
> 
> Q1. Does cygwin and gcc have a real stack based alloca, or is it a fake
> simulation? Intuitively I assume that this kind of error would be caused by
> the latter.
> 
> Q2. Why does this problem occur? My vague guess is that something in the
> bootstrap code for cygwin calls alloca, and because of the memory layout of
> stack and heap, creating a heap based stack makes it free it prematurely.
> 
> Q3. Shouldn't this be fixed in cygwin? While this is an unusual case, it
> seems reasonable to me that a program should be able to create a new stack
> if it wants to.
> 
> Q4. Is there any work around? I'm guessing that if cygwin uses a fake
> alloca, then a better implementation would fix it, but is there any way to
> substitute another one without actually rebuilding cygwin.dll (which I am
> loath to do).
> 
> -----------------------------------------------------------------
> If you have received this transmission in error please notify us 
> immediately by return e-mail and delete all copies. If this e-mail 
> or any attachments have been sent to you in error, that error does 
> not constitute waiver of any confidentiality, privilege or copyright 
> in respect of information in the e-mail or attachments. 
> 
> 



Do you mean the following:

=====================================================================
[ito2@intra C++]$ cat stack.c
#include <stdio.h>

int main() 
{
  char * st1;
  st1 = (void *)malloc(5000) + 5000;
  asm("mov %0, %%esp" : : "r" (st1)); 
  fprintf(stderr, "hello\n");
}
[ito2@intra C++]$ rm stack
[ito2@intra C++]$ cat stack.c
#include <stdio.h>

int main() 
{
  char * st1;
  st1 = (void *)malloc(5000) + 5000;
  asm("mov %0, %%esp" : : "r" (st1)); 
  fprintf(stderr, "hello\n");
}
[ito2@intra C++]$ make stack
cc     stack.c   -o stack
[ito2@intra C++]$ ./stack 
Segmentation fault

=====================================================================

I just can see that your code crashes there in both cygwin and linux.


Jason



--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


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