为什么golang实现的程序不用socket()等libc.so.6的函数?
Why don't the programs implemented by Golang use the functions of libc.so.6, such as socket()?
感谢您回答我的问题。我最近在为一个项目工作。在这个项目中,我编写了一个共享库并将 LD_PRELAOD
设置为共享库的路径。我想通过这个共享库来拦截一些程序的系统调用,比如socket(), bind(), send()
。它适用于 C 程序和 Python 程序,但不适用于 Golang 程序。后来我知道 Go 程序遵循静态库。
所以我尝试了这个命令:go build -linkshared <test-name>
,不幸的是,它失败了。
最后,我使用命令 nm
检查应用程序中的符号。
我发现了这些:
# nm -Do <go-program-name> | grep socket
# results are as follows
<go-program-name>: <address> T net.socket
<go-program-name>: <address> D net.socektFunc
<go-program-name>: <address> T syscall.socket
# nm -Do <C-program-name> | grep socket
<C-program>: U socket
这是截图。
enter image description here
再次感谢。
Why don't the programs implemented by Go[...] use the functions of libc.so.6.
因为 Go 使用直接系统调用底层 OS。
感谢您回答我的问题。我最近在为一个项目工作。在这个项目中,我编写了一个共享库并将 LD_PRELAOD
设置为共享库的路径。我想通过这个共享库来拦截一些程序的系统调用,比如socket(), bind(), send()
。它适用于 C 程序和 Python 程序,但不适用于 Golang 程序。后来我知道 Go 程序遵循静态库。
所以我尝试了这个命令:go build -linkshared <test-name>
,不幸的是,它失败了。
最后,我使用命令 nm
检查应用程序中的符号。
我发现了这些:
# nm -Do <go-program-name> | grep socket
# results are as follows
<go-program-name>: <address> T net.socket
<go-program-name>: <address> D net.socektFunc
<go-program-name>: <address> T syscall.socket
# nm -Do <C-program-name> | grep socket
<C-program>: U socket
这是截图。 enter image description here 再次感谢。
Why don't the programs implemented by Go[...] use the functions of libc.so.6.
因为 Go 使用直接系统调用底层 OS。