libfaketime 不适用于 golang

libfaketime doesn't work with golang

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

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

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

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

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

libfaketime cannot be used with statically linked or setuid programs, because LD_PRELOAD is not available to such programs.

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

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

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

然而,Go 在两个方面有所不同。首先,它是静态链接的,因此没有加载程序可以关注 LD_PRELOAD。其次,它不使用 libc,所以即使它是动态链接的,并且 LD_PRELOAD 技巧起作用了,libc 也永远不会被调用,所以它仍然不会真正完成欺骗程序使用假时间函数的预期目标。