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 #endif // ADDRESS_SANITIZER 11 #include <stdlib.h> 12 #include <string.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