Below you see a code snippet:
int foo[262144] __attribute__ ((aligned (8192)));
void
test49()
{
__asm__("movl $0x0, %ecx");
__asm__("movl %0,%%eax"::"r"(&foo));
#ifdef FOREVER
while(1)
{
#else
for(int i=0; i < iters; i++)
{
#endif
__asm__("test_begin: addl $0x1,%ecx;");
__asm__("mov 0x00(%eax),%ebx;\
I get a segmentation fault in line.
__asm__("mov 0x00(%eax),%ebx;\
if I change the array size from 256KB to say 7MB or 6MB; I do not get any error. It can't be the problem that I don't have the space right?
I tried to examine the dump. It does not give me much clue.
Here it is
./microbenchmark 49
Performing Test49
[1] 12011 segmentation fault (core dumped) ./microbenchmark 49
and here is the back trace.
gdb microbenchmark core
GNU gdb (GDB) SUSE (7.5.1-2.1.1)
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-suse-linux".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /MB/test-l2-256/test-hit/microbenchmark...done.
[New LWP 12011]
Missing separate debuginfo for /lib/libc.so.6
Try: zypper install -C "debuginfo(build-id)=7e0834d74d3e93c3210d2405cde86dc995fe476c"
Missing separate debuginfo for /lib/ld-linux.so.2
Try: zypper install -C "debuginfo(build-id)=6a687db0baedc0db516006a7eedaee8f57f955c8"
Core was generated by `./microbenchmark 49'.
Program terminated with signal 11, Segmentation fault.
#0 0x08048603 in test49 () at microbenchmark.c:77
77 __asm__("mov (%eax),%ebx;\
(gdb) bt
#0 0x08048603 in test49 () at microbenchmark.c:77
#1 0x08048538 in main (argc=2, argv=0xfff68fb4) at microbenchmark.c:33
Any idea what the problem could be?
Thanks.
static(with all its side effects taken in consideration)?__asm__blocks. gcc does not perform any analysis of the instructions - it only knowns inputs, outputs, and clobbers. e.g.,%eaxor%ecxmight be used as loop variables.%ebxis also used for PIC in the i386-ELF ABI - but that's a problem for later.