Home | History | Annotate | Download | only in app
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // The entry point for all Mac Chromium processes, including the outer app
      6 // bundle (browser) and helper app (renderer, plugin, and friends).
      7 
      8 #if defined(ADDRESS_SANITIZER)
      9 #include <crt_externs.h>  // for _NSGetArgc, _NSGetArgv
     10 #include <string.h>
     11 #endif  // ADDRESS_SANITIZER
     12 #include <stdlib.h>
     13 
     14 #if defined(ADDRESS_SANITIZER)
     15 // NaCl requires its own SEGV handler, so we need to add handle_segv=0 to
     16 // ASAN_OPTIONS. This is done by injecting __asan_default_options into the
     17 // executable.
     18 // Because there's no distinct NaCl executable on OSX, we have to look at the
     19 // command line arguments to understand whether the process is a NaCl loader.
     20 
     21 static const char kNaClDefaultOptions[] = "handle_segv=0";
     22 static const char kNaClFlag[] = "--type=nacl-loader";
     23 
     24 extern "C"
     25 // __asan_default_options() is called at ASan initialization, so it must
     26 // not be instrumented with ASan -- thus the "no_sanitize_address" attribute.
     27 __attribute__((no_sanitize_address))
     28 // The function isn't referenced from the executable itself. Make sure it isn't
     29 // stripped by the linker.
     30 __attribute__((used))
     31 __attribute__((visibility("default")))
     32 const char* __asan_default_options()  {
     33   char*** argvp = _NSGetArgv();
     34   int* argcp = _NSGetArgc();
     35   if (!argvp || !argcp) return NULL;
     36   char** argv = *argvp;
     37   int argc = *argcp;
     38   for (int i = 0; i < argc; ++i) {
     39     if (strcmp(argv[i], kNaClFlag) == 0) {
     40       return kNaClDefaultOptions;
     41     }
     42   }
     43   return NULL;
     44 }
     45 #endif  // ADDRESS_SANITIZER
     46 
     47 extern "C" {
     48 int ChromeMain(int argc, char** argv);
     49 }  // extern "C"
     50 
     51 __attribute__((visibility("default")))
     52 int main(int argc, char* argv[]) {
     53   int rv = ChromeMain(argc, argv);
     54 
     55   // exit, don't return from main, to avoid the apparent removal of main from
     56   // stack backtraces under tail call optimization.
     57   exit(rv);
     58 }
     59