猿问

libfaketime 不适用于 golang

我希望我的 go 程序在 ubuntu 服务器(14.04)上运行,由主管守护,使用假的服务器时间。

在我的主管配置中,我使用它作为执行命令:

"faketime 'last Friday 5 pm' /home/user/main"

程序运行,但显示当前时间。

libfaketime 不能与静态链接或 setuid 程序一起使用,因为 LD_PRELOAD 对此类程序不可用。

无论如何让我编译的go程序使用faketime?


猛跑小猪
浏览 283回答 1
1回答

呼唤远方

问题是faketime使用LD_PRELOAD环境变量来指示程序的动态加载器libfaketime在启动时加载。libfaketime将执行所谓的“插入” - 用这些例程的自己的副本替换正常的动态库例程 - 这样当将来进行动态库调用时,libfaketime可以影响发生的事情。特别是,libfaketime插入与时间相关的调用,因此它能够向程序返回假值。这适用于大多数程序的原因是它们用于libc进行系统调用。libc提供与系统调用交互的高级函数,使系统编程更容易。在大多数使用 的语言中libc,二进制文件是动态链接的,这意味着它libc实际上并不包含在二进制文件中,而是预期libc在运行二进制文件时系统上将存在(称为“目标文件”)的编译版本,然后就可以加载动态库了。这种动态加载是faketime通过LD_PRELOAD指令实现的,它改变了加载器的行为。然而,Go 有两个不同之处。首先,它是静态链接的,因此没有加载器可以关注LD_PRELOAD. 其次,它不使用libc,因此即使它是动态链接的,并且该LD_PRELOAD技巧有效,libc也永远不会被调用,因此它实际上仍然无法实现欺骗程序使用假时间函数的预期目标。
随时随地看视频慕课网APP

相关分类

Go
我要回答