libfaketime不适用于golang

时间:2016-03-16 00:41:20

标签: ubuntu go supervisord

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

在我的超级用户配置中,我将其用作执行命令:

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

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

根据这篇文章: Changing what time a process thinks it is with libfaketime

  

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

有没有让我编译的go程序使用faketime?

1 个答案:

答案 0 :(得分:5)

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

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

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