diff options
| author | Russ Cox <rsc@golang.org> | 2014-11-24 12:07:11 -0500 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2014-11-24 12:07:11 -0500 |
| commit | b8540fc28867623b23c23e97108a6e975e8a49e7 (patch) | |
| tree | e5c56e6595f5ebf90fc796a7699e53da94076c84 /src/runtime/malloc.go | |
| parent | 273507aa8f17b2b619934ae63c99a2e31a4df5e2 (diff) | |
| parent | a236804c764c9aa1fb293c24be9c571de5795d05 (diff) | |
| download | go-b8540fc28867623b23c23e97108a6e975e8a49e7.tar.xz | |
[dev.garbage] all: merge dev.cc (493ad916c3b1) into dev.garbage
TBR=austin
CC=golang-codereviews
https://golang.org/cl/179290043
Diffstat (limited to 'src/runtime/malloc.go')
| -rw-r--r-- | src/runtime/malloc.go | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/runtime/malloc.go b/src/runtime/malloc.go index 86e20b2490..e9fec7bb14 100644 --- a/src/runtime/malloc.go +++ b/src/runtime/malloc.go @@ -546,6 +546,8 @@ func GC() { // linker-provided var noptrdata struct{} +var enoptrdata struct{} +var noptrbss struct{} var enoptrbss struct{} // SetFinalizer sets the finalizer associated with x to f. @@ -622,8 +624,13 @@ func SetFinalizer(obj interface{}, finalizer interface{}) { // func main() { // runtime.SetFinalizer(Foo, nil) // } - // The segments are, in order: text, rodata, noptrdata, data, bss, noptrbss. - if uintptr(unsafe.Pointer(&noptrdata)) <= uintptr(e.data) && uintptr(e.data) < uintptr(unsafe.Pointer(&enoptrbss)) { + // The relevant segments are: noptrdata, data, bss, noptrbss. + // We cannot assume they are in any order or even contiguous, + // due to external linking. + if uintptr(unsafe.Pointer(&noptrdata)) <= uintptr(e.data) && uintptr(e.data) < uintptr(unsafe.Pointer(&enoptrdata)) || + uintptr(unsafe.Pointer(&data)) <= uintptr(e.data) && uintptr(e.data) < uintptr(unsafe.Pointer(&edata)) || + uintptr(unsafe.Pointer(&bss)) <= uintptr(e.data) && uintptr(e.data) < uintptr(unsafe.Pointer(&ebss)) || + uintptr(unsafe.Pointer(&noptrbss)) <= uintptr(e.data) && uintptr(e.data) < uintptr(unsafe.Pointer(&enoptrbss)) { return } gothrow("runtime.SetFinalizer: pointer not in allocated block") |
