Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / app / chrome_exe_main_mac.cc
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 }