|
34 | 34 | #endif
|
35 | 35 |
|
36 | 36 | // This function is defined elsewhere if we intercepted pthread_attr_getstack.
|
37 |
| -SANITIZER_WEAK_ATTRIBUTE |
38 |
| -int __sanitizer_pthread_attr_getstack(void *attr, void **addr, size_t *size) { |
39 |
| - return pthread_attr_getstack((pthread_attr_t*)attr, addr, size); |
| 37 | +extern "C" SANITIZER_WEAK_ATTRIBUTE int |
| 38 | +__sanitizer_pthread_attr_getstack(void *attr, void **addr, size_t *size); |
| 39 | + |
| 40 | +static int my_pthread_attr_getstack(void *attr, void **addr, size_t *size) { |
| 41 | + if (__sanitizer_pthread_attr_getstack) |
| 42 | + return __sanitizer_pthread_attr_getstack((pthread_attr_t *)attr, addr, |
| 43 | + size); |
| 44 | + |
| 45 | + return pthread_attr_getstack((pthread_attr_t *)attr, addr, size); |
40 | 46 | }
|
41 | 47 |
|
42 | 48 | namespace __sanitizer {
|
@@ -80,7 +86,7 @@ void GetThreadStackTopAndBottom(bool at_initialization, uptr *stack_top,
|
80 | 86 | CHECK_EQ(pthread_getattr_np(pthread_self(), &attr), 0);
|
81 | 87 | uptr stacksize = 0;
|
82 | 88 | void *stackaddr = 0;
|
83 |
| - __sanitizer_pthread_attr_getstack(&attr, &stackaddr, (size_t*)&stacksize); |
| 89 | + my_pthread_attr_getstack(&attr, &stackaddr, (size_t*)&stacksize); |
84 | 90 | pthread_attr_destroy(&attr);
|
85 | 91 |
|
86 | 92 | CHECK_LE(stacksize, kMaxThreadStackSize); // Sanity check.
|
@@ -276,7 +282,7 @@ void AdjustStackSizeLinux(void *attr_) {
|
276 | 282 | pthread_attr_t *attr = (pthread_attr_t *)attr_;
|
277 | 283 | uptr stackaddr = 0;
|
278 | 284 | size_t stacksize = 0;
|
279 |
| - __sanitizer_pthread_attr_getstack(attr, (void**)&stackaddr, &stacksize); |
| 285 | + my_pthread_attr_getstack(attr, (void**)&stackaddr, &stacksize); |
280 | 286 | // GLibC will return (0 - stacksize) as the stack address in the case when
|
281 | 287 | // stacksize is set, but stackaddr is not.
|
282 | 288 | bool stack_set = (stackaddr != 0) && (stackaddr + stacksize != 0);
|
|
0 commit comments