diff options
author | Russ Cox <rsc@golang.org> | 2014-05-20 11:35:20 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2014-05-20 11:35:20 -0400 |
commit | a4a1fadfa2bdb4f6cfb1ed1dcf6b4bb0cd58060f (patch) | |
tree | 223d1a2376c4bb0f40cf139f22d02da7cb809f3a | |
parent | 9cd759aecc97c2044df015d624d323277444740f (diff) | |
download | go-a4a1fadfa2bdb4f6cfb1ed1dcf6b4bb0cd58060f.tar.gz go-a4a1fadfa2bdb4f6cfb1ed1dcf6b4bb0cd58060f.zip |
cmd/ld: make lldb happy with Mach-O 6.out files
Apparently all the __DWARF sections need addresses
even though they are marked as "do not load from disk".
Continue the address numbering from the data segment.
With this change:
g% lldb helloworld
Current executable set to 'helloworld' (x86_64).
(lldb) b main.main
Breakpoint 1: where = helloworld`main.main + 25 at helloworld.go:12, address = 0x0000000000002019
(lldb) r
Process 68509 launched: '/Users/rsc/g/go/src/cmd/6l/helloworld' (x86_64)
1 location added to breakpoint 1
(lldb)
[KProcess 68509 stopped
* thread #1: tid = 0x8b7a27, 0x0000000000002019 helloworld`main.main + 25 at helloworld.go:12, stop reason = breakpoint 1.2
frame #0: 0x0000000000002019 helloworld`main.main + 25 at helloworld.go:12
9 package main
10
11 func main() {
-> 12 print("hello, world\n")
13 }
(lldb) bt
* thread #1: tid = 0x8b7a27, 0x0000000000002019 helloworld`main.main + 25 at helloworld.go:12, stop reason = breakpoint 1.2
* frame #0: 0x0000000000002019 helloworld`main.main + 25 at helloworld.go:12
(lldb) disas
helloworld`main.main at helloworld.go:11:
0x2000: movq %gs:0x8a0, %rcx
0x2009: cmpq (%rcx), %rsp
0x200c: ja 0x2015 ; main.main + 21 at helloworld.go:11
0x200e: callq 0x20da0 ; runtime.morestack00_noctxt at atomic_amd64x.c:28
0x2013: jmp 0x2000 ; main.main at helloworld.go:11
0x2015: subq $0x10, %rsp
-> 0x2019: leaq 0x2c2e0, %rbx
0x2021: leaq (%rsp), %rbp
0x2025: movq %rbp, %rdi
0x2028: movq %rbx, %rsi
0x202b: movsq
0x202d: movsq
0x202f: callq 0x10300 ; runtime.printstring at compiler.go:1
0x2034: addq $0x10, %rsp
0x2038: ret
0x2039: addb %al, (%rax)
0x203b: addb %al, (%rax)
0x203d: addb %al, (%rax)
(lldb) quit
Quitting LLDB will kill one or more processes. Do you really want to proceed: [Y/n] y
g%
Fixes #7070.
LGTM=iant
R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/93510043
-rw-r--r-- | src/cmd/ld/dwarf.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/cmd/ld/dwarf.c b/src/cmd/ld/dwarf.c index 4ed63525b4..cee591ffa6 100644 --- a/src/cmd/ld/dwarf.c +++ b/src/cmd/ld/dwarf.c @@ -2353,31 +2353,37 @@ dwarfaddmachoheaders(void) ms = newMachoSeg("__DWARF", nsect); ms->fileoffset = fakestart; ms->filesize = abbrevo-fakestart; + ms->vaddr = ms->fileoffset + segdata.vaddr - segdata.fileoff; msect = newMachoSect(ms, "__debug_abbrev", "__DWARF"); msect->off = abbrevo; msect->size = abbrevsize; + msect->addr = msect->off + segdata.vaddr - segdata.fileoff; ms->filesize += msect->size; msect = newMachoSect(ms, "__debug_line", "__DWARF"); msect->off = lineo; msect->size = linesize; + msect->addr = msect->off + segdata.vaddr - segdata.fileoff; ms->filesize += msect->size; msect = newMachoSect(ms, "__debug_frame", "__DWARF"); msect->off = frameo; msect->size = framesize; + msect->addr = msect->off + segdata.vaddr - segdata.fileoff; ms->filesize += msect->size; msect = newMachoSect(ms, "__debug_info", "__DWARF"); msect->off = infoo; msect->size = infosize; + msect->addr = msect->off + segdata.vaddr - segdata.fileoff; ms->filesize += msect->size; if (pubnamessize > 0) { msect = newMachoSect(ms, "__debug_pubnames", "__DWARF"); msect->off = pubnameso; msect->size = pubnamessize; + msect->addr = msect->off + segdata.vaddr - segdata.fileoff; ms->filesize += msect->size; } @@ -2385,6 +2391,7 @@ dwarfaddmachoheaders(void) msect = newMachoSect(ms, "__debug_pubtypes", "__DWARF"); msect->off = pubtypeso; msect->size = pubtypessize; + msect->addr = msect->off + segdata.vaddr - segdata.fileoff; ms->filesize += msect->size; } @@ -2392,6 +2399,7 @@ dwarfaddmachoheaders(void) msect = newMachoSect(ms, "__debug_aranges", "__DWARF"); msect->off = arangeso; msect->size = arangessize; + msect->addr = msect->off + segdata.vaddr - segdata.fileoff; ms->filesize += msect->size; } @@ -2400,6 +2408,7 @@ dwarfaddmachoheaders(void) msect = newMachoSect(ms, "__debug_gdb_scripts", "__DWARF"); msect->off = gdbscripto; msect->size = gdbscriptsize; + msect->addr = msect->off + segdata.vaddr - segdata.fileoff; ms->filesize += msect->size; } } |