summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2013-05-20 14:25:32 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2013-05-20 14:25:32 +0000
commitd5169edc36a2f03c9a52a516f6f4001aaf6eaa1a (patch)
treea3ada10ce3402b446e3b285ad97323af3df0f897
parent312425f32d9be772cfeeff0a907506dde85317dd (diff)
downloadbcm5719-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.cc36
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);
OpenPOWER on IntegriCloud