【发布时间】:2021-07-08 07:34:15
【问题描述】:
_cgo_topofstack@@Base 在来自 Go 的剥离二进制文件的上下文中是什么意思?
$ cat simple.go
package main
import
(
"net"
"time"
"strconv"
)
func main() {
tcpAddr, _ := net.ResolveTCPAddr("tcp4", ":7777")
listener, _ := net.ListenTCP("tcp", tcpAddr)
conn, _ := listener.Accept()
daytime := time.Now().String()+strconv.Itoa(0xdeadface)
conn.Write([]byte(daytime))
}
代码应该被剥离 - _cgo_topofstack@@Base 是什么意思?
$ go build -gcflags=-l -ldflags "-s -w" -o simple_wo_symbols simple.go
$ objdump -D -S simple_wo_symbols > simple_wo_symbols.human
$ sed -n "198899,198904p" simple_wo_symbols.human
4b9860: e8 db c1 fb ff callq 475a40 <_cgo_topofstack@@Base+0xe4c0>
4b9865: 48 8b 44 24 18 mov 0x18(%rsp),%rax
4b986a: 48 89 44 24 70 mov %rax,0x70(%rsp)
4b986f: 48 8b 4c 24 20 mov 0x20(%rsp),%rcx
4b9874: 48 89 4c 24 40 mov %rcx,0x40(%rsp)
4b9879: ba ce fa ad de mov $0xdeadface,%edx
EDIT(更好地说明问题):
- 为什么这个符号存在于剥离二进制文件中?
- 批准peter-cordes 声明:调用的函数与
_cgo_topofstack@@Base处的函数完全无关,添加此(不相关且冗余)信息是objdump(奇怪?)的事情 - 可能与this(?)有关:有Go惯用的剥离方式吗?!
【问题讨论】:
-
我对 Go 不太了解,但
_cgo_topofstack@@Base是一个仍然存在的符号。该调用是对地址0xe4c0之外的地址,无论那里存在什么功能。 -
您还想了解什么?实际函数
_cgo_topofstack@@Base与您调用的内容无关,但是从实际目标地址向后搜索时,这是找到的最新objdump。如果您对_cgo_topofstack@@Base之类的函数会做什么感到好奇,它可能会返回 RSP(或者不会,鉴于 VonC 的回答;“顶部”和“底部”对于向下增长的堆栈并不总是明确的术语)。如果您想知道@@恰好是符号名称的一部分,您应该编辑您的问题。 -
我编辑了我的问题以便更好地解释它。
标签: go x86 disassembly strip objdump