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.
5 // The entry point for all Mac Chromium processes, including the outer app
6 // bundle (browser) and helper app (renderer, plugin, and friends).
8 #if defined(ADDRESS_SANITIZER)
9 #include <crt_externs.h> // for _NSGetArgc, _NSGetArgv
10 #endif // ADDRESS_SANITIZER
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
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.
21 static const char kNaClDefaultOptions
[] = "handle_segv=0";
22 static const char kNaClFlag
[] = "--type=nacl-loader";
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.
31 __attribute__((visibility("default")))
32 const char* __asan_default_options() {
33 char*** argvp
= _NSGetArgv();
34 int* argcp
= _NSGetArgc();
35 if (!argvp
|| !argcp
) return NULL
;
38 for (int i
= 0; i
< argc
; ++i
) {
39 if (strcmp(argv
[i
], kNaClFlag
) == 0) {
40 return kNaClDefaultOptions
;
45 #endif // ADDRESS_SANITIZER
48 int ChromeMain(int argc
, char** argv
);
51 __attribute__((visibility("default")))
52 int main(int argc
, char* argv
[]) {
53 int rv
= ChromeMain(argc
, argv
);
55 // exit, don't return from main, to avoid the apparent removal of main from
56 // stack backtraces under tail call optimization.