title: "Illegal instruction: 4" shows up in OS X Lion
body: <p>Some C++ application compiled and run seamlessly in OS X Snow Leopard, but I changed recently to OS X Lion, and here, although there is no compilation error, when I try to run it I get the error "Illegal instruction: 4", I have no clue, what could be the reason?</p>
  
  <p>PS: </p>
  
  <p>These are the linking flags I use</p>
  
  <pre><code>-Wl,-stack_size,0x10000000,-stack_addr,0xc0000000 
  </code></pre>
  
  <p>This is the output I get when I do <code>sudo truss executable</code></p>
  
  <pre><code>setrlimit returned result = -1
      SYSCALL(args)        = return
  getpid(0x0, 0x0, 0x0)        = 32993 0
  __sysctl(0xBFFFF5EC, 0x3, 0xBFFFF5E8)        = 0 0
  issetugid(0xBFFFF5EC, 0x3, 0xBFFFF5E8)       = 0 0
  csops(0x0, 0x0, 0xBFFFF65C)      = 0 0
  shared_region_check_np(0xBFFFD5E0, 0x0, 0xBFFFF65C)      = 0 0
  stat64("/usr/lib/dtrace/libdtrace_dyld.dylib\0", 0xBFFFE830, 0xBFFFF65C)         = 0 0
  open("/usr/lib/dtrace/libdtrace_dyld.dylib\0", 0x0, 0x0)         = 3 0
  pread(0x3, "\312\376\272\276\0", 0x1000, 0x0)        = 4096 0
  pread(0x3, "\316\372\355\376\a\0", 0x1000, 0x6000)       = 4096 0
  mmap(0x4D3000, 0x2000, 0x1, 0x12, 0x3, 0x3)      = 0x4D3000 0
  mmap(0x4D5000, 0x1000, 0x3, 0x12, 0x3, 0x3)      = 0x4D5000 0
  mmap(0x4D6000, 0x1EF0, 0x1, 0x12, 0x3, 0x3)      = 0x4D6000 0
  close(0x3)       = 0 0
  stat64("/usr/lib/libstdc++.6.dylib\0", 0xBFFFE690, 0x1)      = 0 0
  stat64("/usr/lib/libgcc_s.1.dylib\0", 0xBFFFE690, 0x1)       = 0 0
  stat64("/usr/lib/libSystem.B.dylib\0", 0xBFFFE560, 0x1)      = 0 0
  stat64("/usr/lib/libc++abi.dylib\0", 0xBFFFE5D0, 0x1)        = 0 0
  stat64("/usr/lib/system/libcache.dylib\0", 0xBFFFE360, 0x1)      = 0 0
  stat64("/usr/lib/system/libcommonCrypto.dylib\0", 0xBFFFE360, 0x1)       = 0 0
  stat64("/usr/lib/system/libcompiler_rt.dylib\0", 0xBFFFE360, 0x1)        = 0 0
  stat64("/usr/lib/system/libcopyfile.dylib\0", 0xBFFFE360, 0x1)       = 0 0
  stat64("/usr/lib/system/libdispatch.dylib\0", 0xBFFFE360, 0x1)       = 0 0
  stat64("/usr/lib/system/libdnsinfo.dylib\0", 0xBFFFE360, 0x1)        = 0 0
  stat64("/usr/lib/system/libdyld.dylib\0", 0xBFFFE360, 0x1)       = 0 0
  stat64("/usr/lib/system/libkeymgr.dylib\0", 0xBFFFE360, 0x1)         = 0 0
  stat64("/usr/lib/system/liblaunch.dylib\0", 0xBFFFE360, 0x1)         = 0 0
  stat64("/usr/lib/system/libmacho.dylib\0", 0xBFFFE360, 0x1)      = 0 0
  stat64("/usr/lib/system/libmathCommon.A.dylib\0", 0xBFFFE360, 0x1)       = 0 0
  stat64("/usr/lib/system/libquarantine.dylib\0", 0xBFFFE360, 0x1)         = 0 0
  stat64("/usr/lib/system/libremovefile.dylib\0", 0xBFFFE360, 0x1)         = 0 0
  stat64("/usr/lib/system/libsystem_blocks.dylib\0", 0xBFFFE360, 0x1)      = 0 0
  stat64("/usr/lib/system/libsystem_c.dylib\0", 0xBFFFE360, 0x1)       = 0 0
  stat64("/usr/lib/system/libsystem_dnssd.dylib\0", 0xBFFFE360, 0x1)       = 0 0
  stat64("/usr/lib/system/libsystem_info.dylib\0", 0xBFFFE360, 0x1)        = 0 0
  stat64("/usr/lib/system/libsystem_kernel.dylib\0", 0xBFFFE360, 0x1)      = 0 0
  stat64("/usr/lib/system/libsystem_network.dylib\0", 0xBFFFE360, 0x1)         = 0 0
  stat64("/usr/lib/system/libsystem_notify.dylib\0", 0xBFFFE360, 0x1)      = 0 0
  stat64("/usr/lib/system/libsystem_sandbox.dylib\0", 0xBFFFE360, 0x1)         = 0 0
  stat64("/usr/lib/system/libunc.dylib\0", 0xBFFFE360, 0x1)        = 0 0
  stat64("/usr/lib/system/libunwind.dylib\0", 0xBFFFE360, 0x1)         = 0 0
  stat64("/usr/lib/system/libxpc.dylib\0", 0xBFFFE360, 0x1)        = 0 0
  open("/dev/dtracehelper\0", 0x2, 0xBFFFF5B0)         = 3 0
  ioctl(0x3, 0x80086804, 0xBFFFF540)       = 0 0
  close(0x3)       = 0 0
  __sysctl(0xBFFFF1FC, 0x2, 0xBFFFF1F4)        = 0 0
  bsdthread_register(0x92C9F6BC, 0x92C9F6E0, 0x1000)       = 0 0
  thread_selfid(0x92C9F6BC, 0x92C9F6E0, 0x1000)        = 2500945 0
  mmap(0x0, 0x2000, 0x3, 0x1002, 0x1000000, 0xAC308375)        = 0x4D8000 0
  mprotect(0x4D8000, 0x44, 0x1)        = 0 0
  mmap(0x0, 0xD000, 0x3, 0x1002, 0x1000000, 0x4D8034)      = 0x4DA000 0
  mprotect(0x4DA000, 0x1000, 0x0)      = 0 0
  mprotect(0x4E6000, 0x1000, 0x0)      = 0 0
  mmap(0x0, 0xD000, 0x3, 0x1002, 0x1000000, 0x4DB000)      = 0x4E7000 0
  mprotect(0x4E7000, 0x1000, 0x0)      = 0 0
  mprotect(0x4F3000, 0x1000, 0x0)      = 0 0
  mmap(0x0, 0x1000, 0x3, 0x1002, 0x1000000, 0x4E8000)      = 0x4F4000 0
  mprotect(0x4F4000, 0x1000, 0x1)      = 0 0
  mprotect(0x4D8000, 0x44, 0x3)        = 0 0
  mmap(0x0, 0x200000, 0x3, 0x1002, 0x7000000, 0x4F4000)        = 0x4F5000 0
  munmap(0x4F5000, 0xB000)         = 0 0
  munmap(0x600000, 0xF5000)        = 0 0
  mprotect(0x4D8000, 0x44, 0x1)        = 0 0
  getpid(0x4D8000, 0x44, 0x1)      = 32993 0
  __mac_syscall(0x973E8E8E, 0x2, 0xBFFFF0C8)       = 0 0
  stat64("/AppleInternal\0", 0xBFFFF130, 0xBFFFF0C8)       = -1 Err#2
  audit_session_self(0x92C1F4B6, 0xBFFFF130, 0xBFFFF0C8)       = 5635 0
  geteuid(0x92C1F4B6, 0xBFFFF130, 0xBFFFF0C8)      = 0 0
  getegid(0x92C1F4B6, 0xBFFFF130, 0xBFFFF0C8)      = 0 0
  getaudit_addr(0xBFFFF0A8, 0x30, 0xBFFFF0C8)      = 0 0
  csops(0x80E1, 0x7, 0xBFFFECF8)       = 0 0
  mmap(0x0, 0x2000, 0x3, 0x1002, 0x1000000, 0xACA5EB00)        = 0x4F5000 0
  mprotect(0x4F5000, 0x44, 0x1)        = 0 0
  mmap(0x0, 0xD000, 0x3, 0x1002, 0x1000000, 0x4F5034)      = 0x600000 0
  mprotect(0x600000, 0x1000, 0x0)      = 0 0
  mprotect(0x60C000, 0x1000, 0x0)      = 0 0
  mmap(0x0, 0xD000, 0x3, 0x1002, 0x1000000, 0x601000)      = 0x60D000 0
  mprotect(0x60D000, 0x1000, 0x0)      = 0 0
  mprotect(0x619000, 0x1000, 0x0)      = 0 0
  mprotect(0x4F4000, 0x1000, 0x3)      = 0 0
  mprotect(0x4F4000, 0x1000, 0x1)      = 0 0
  mprotect(0x4F5000, 0x44, 0x3)        = 0 0
  mmap(0x0, 0x200000, 0x3, 0x1002, 0x7000000, 0x4F4004)        = 0x61A000 0
  munmap(0x61A000, 0xE6000)        = 0 0
  munmap(0x800000, 0x1A000)        = 0 0
  mprotect(0x4F5000, 0x44, 0x1)        = 0 0
  getrlimit(0x1003, 0xBFFFF8DC, 0x1)       = 0 0
  setrlimit(0x1003, 0xBFFFF8DC, 0x1)       = -1 Err#22
  getrlimit(0x1008, 0xBF835C60, 0x1)       = 0 0
  fstat64(0x1, 0xBF836090, 0x1F)       = 0 0
  mmap(0x0, 0x1000000, 0x3, 0x1002, 0x2000000, 0xACA5B3E0)         = 0x800000 0
  munmap(0x1000000, 0x800000)      = 0 0
  </code></pre>
  
  <p>PS2: If I remove the previously mentioned linking flag, the program runs, with no error. But when I input real data to the program, then I get </p>
  
  <pre><code>Segmentation fault: 11
  </code></pre>
  
  <p>I remember that this program had a problem with the stack, so it had to be increased. In Linux I did this and works </p>
  
  <pre><code>       const rlim_t kStackSize = 256L * 1024L * 1024L;   // min stack size = 64 Mb
      struct rlimit rl;
      int result;
  
      result = getrlimit(RLIMIT_STACK, &amp;rl);
      if (result == 0)
      {
              if (rl.rlim_cur &lt; kStackSize)
              {
                      rl.rlim_cur = kStackSize;
                      result = setrlimit(RLIMIT_STACK, &amp;rl);
                      if (result != 0)
                      {
                              fprintf(stderr, "setrlimit returned result = %d\n", result);
                      }
              }
      }
  </code></pre>
  
  <p>but in OS X, since that did not work, I used the previously mentioned linking flag, and had no problem is OS X Snow Leopard, so it seems I still have the stack overflow problem in OS X Lion but the linking flag does not solve this. What could I do?</p>