diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2013-05-20 14:25:32 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2013-05-20 14:25:32 +0000 |
commit | d5169edc36a2f03c9a52a516f6f4001aaf6eaa1a (patch) | |
tree | a3ada10ce3402b446e3b285ad97323af3df0f897 | |
parent | 312425f32d9be772cfeeff0a907506dde85317dd (diff) | |
download | bcm5719-llvm-d5169edc36a2f03c9a52a516f6f4001aaf6eaa1a.tar.gz bcm5719-llvm-d5169edc36a2f03c9a52a516f6f4001aaf6eaa1a.zip |
[nolibc] Make GetArgsAndEnv libc-independent.
__libc_stack_end is made into a weak symbol if possible. If libc is
not linked, read args and environment from /proc.
llvm-svn: 182276
-rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_linux.cc | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc index f9b20677fd3..741df6e73e3 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc @@ -315,21 +315,11 @@ bool SetEnv(const char *name, const char *value) { } #endif -#ifdef __GLIBC__ - extern "C" { - extern void *__libc_stack_end; -} - -static void GetArgsAndEnv(char ***argv, char ***envp) { - uptr *stack_end = (uptr *)__libc_stack_end; - int argc = *stack_end; - *argv = (char**)(stack_end + 1); - *envp = (char**)(stack_end + argc + 2); + extern void *__libc_stack_end SANITIZER_WEAK_ATTRIBUTE; } -#else // __GLIBC__ - +#if !SANITIZER_GO static void ReadNullSepFileToArray(const char *path, char ***arr, int arr_size) { char *buff; @@ -348,15 +338,25 @@ static void ReadNullSepFileToArray(const char *path, char ***arr, } (*arr)[count] = 0; } +#endif -static void GetArgsAndEnv(char ***argv, char ***envp) { - static const int kMaxArgv = 2000, kMaxEnvp = 2000; - ReadNullSepFileToArray("/proc/self/cmdline", argv, kMaxArgv); - ReadNullSepFileToArray("/proc/self/environ", envp, kMaxEnvp); +static void GetArgsAndEnv(char*** argv, char*** envp) { +#if !SANITIZER_GO + if (&__libc_stack_end) { +#endif + uptr* stack_end = (uptr*)__libc_stack_end; + int argc = *stack_end; + *argv = (char**)(stack_end + 1); + *envp = (char**)(stack_end + argc + 2); +#if !SANITIZER_GO + } else { + static const int kMaxArgv = 2000, kMaxEnvp = 2000; + ReadNullSepFileToArray("/proc/self/cmdline", argv, kMaxArgv); + ReadNullSepFileToArray("/proc/self/environ", envp, kMaxEnvp); + } +#endif } -#endif // __GLIBC__ - void ReExec() { char **argv, **envp; GetArgsAndEnv(&argv, &envp); |