diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2014-12-02 10:58:59 -0800 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@gcc.gnu.org> | 2014-12-02 10:58:59 -0800 |
commit | f1d15bb914e67fa8844bf129775d1b25c728cfbd (patch) | |
tree | c75e433f807c9b3256cd6e445f2d957bc8afe1e1 /gcc/asan.c | |
parent | d455c0b5303ad084c9ac10334cecfd5d7e3e4f19 (diff) | |
download | gcc-f1d15bb914e67fa8844bf129775d1b25c728cfbd.zip gcc-f1d15bb914e67fa8844bf129775d1b25c728cfbd.tar.gz gcc-f1d15bb914e67fa8844bf129775d1b25c728cfbd.tar.bz2 |
asan: support for globals in kernel
2014-12-02 Dmitry Vyukov <dvyukov@google.com>
* asan.c: (asan_finish_file): Use default priority for constructors
in kernel mode.
From-SVN: r218281
Diffstat (limited to 'gcc/asan.c')
-rw-r--r-- | gcc/asan.c | 17 |
1 files changed, 12 insertions, 5 deletions
@@ -1348,7 +1348,9 @@ asan_protect_global (tree decl) the var that is selected by the linker will have padding or not. */ || DECL_ONE_ONLY (decl) - /* Similarly for common vars. People can use -fno-common. */ + /* Similarly for common vars. People can use -fno-common. + Note: Linux kernel is built with -fno-common, so we do instrument + globals there even if it is C. */ || (DECL_COMMON (decl) && TREE_PUBLIC (decl)) /* Don't protect if using user section, often vars placed into user section from multiple TUs are then assumed @@ -2448,6 +2450,13 @@ asan_finish_file (void) nor after .LASAN* array. */ flag_sanitize &= ~SANITIZE_ADDRESS; + /* For user-space we want asan constructors to run first. + Linux kernel does not support priorities other than default, and the only + other user of constructors is coverage. So we run with the default + priority. */ + int priority = flag_sanitize & SANITIZE_USER_ADDRESS + ? MAX_RESERVED_INIT_PRIORITY - 1 : DEFAULT_INIT_PRIORITY; + if (flag_sanitize & SANITIZE_USER_ADDRESS) { tree fn = builtin_decl_implicit (BUILT_IN_ASAN_INIT); @@ -2503,12 +2512,10 @@ asan_finish_file (void) build_fold_addr_expr (var), gcount_tree), &dtor_statements); - cgraph_build_static_cdtor ('D', dtor_statements, - MAX_RESERVED_INIT_PRIORITY - 1); + cgraph_build_static_cdtor ('D', dtor_statements, priority); } if (asan_ctor_statements) - cgraph_build_static_cdtor ('I', asan_ctor_statements, - MAX_RESERVED_INIT_PRIORITY - 1); + cgraph_build_static_cdtor ('I', asan_ctor_statements, priority); flag_sanitize |= SANITIZE_ADDRESS; } |