为什么 Golang 实现的程序不使用 libc.so.6 的功能,例如 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

这是屏幕截图。在此处输入图像描述再次感谢。

为什么Go[…]实现的程序不使用libc.so.6的函数。

因为Go使用对底层操作系统的直接系统调用。

相关内容

最新更新