为了账号安全,请及时绑定邮箱和手机立即绑定

libfaketime 不适用于 golang

libfaketime 不适用于 golang

Go
猛跑小猪 2021-12-20 19:26:16
我希望我的 go 程序在 ubuntu 服务器(14.04)上运行,由主管守护,使用假的服务器时间。在我的主管配置中,我使用它作为执行命令:"faketime 'last Friday 5 pm' /home/user/main"程序运行,但显示当前时间。libfaketime 不能与静态链接或 setuid 程序一起使用,因为 LD_PRELOAD 对此类程序不可用。无论如何让我编译的go程序使用faketime?
查看完整描述

1 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

问题是faketime使用LD_PRELOAD环境变量来指示程序的动态加载器libfaketime在启动时加载。libfaketime将执行所谓的“插入” - 用这些例程的自己的副本替换正常的动态库例程 - 这样当将来进行动态库调用时,libfaketime可以影响发生的事情。特别是,libfaketime插入与时间相关的调用,因此它能够向程序返回假值。

这适用于大多数程序的原因是它们用于libc进行系统调用。libc提供与系统调用交互的高级函数,使系统编程更容易。在大多数使用 的语言中libc,二进制文件是动态链接的,这意味着它libc实际上并不包含在二进制文件中,而是预期libc在运行二进制文件时系统上将存在(称为“目标文件”)的编译版本,然后就可以加载动态库了。这种动态加载是faketime通过LD_PRELOAD指令实现的,它改变了加载器的行为。

然而,Go 有两个不同之处。首先,它是静态链接的,因此没有加载器可以关注LD_PRELOAD. 其次,它不使用libc,因此即使它是动态链接的,并且该LD_PRELOAD技巧有效,libc也永远不会被调用,因此它实际上仍然无法实现欺骗程序使用假时间函数的预期目标。


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 282 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信