我希望我的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?
答案 0 :(得分:5)
问题是faketime
使用LD_PRELOAD
环境变量来指示程序的动态加载程序在启动时加载libfaketime
。 libfaketime
将执行所谓的“插入” - 将正常的动态库例程替换为其自己的例程副本 - 以便在进行未来的动态库调用时,libfaketime
可以影响发生的情况。特别是,libfaketime
设置了与时间相关的调用,因此它能够将假值返回给程序。
这对大多数程序起作用的原因是它们使用libc
来进行系统调用。 libc
提供了与系统调用交互的高级函数,使系统编程变得更容易。在大多数使用libc
的语言中,二进制文件是动态链接的,这意味着libc
实际上不包含在二进制文件中,而是预期编译版本的libc
(称为运行二进制文件时,系统上将存在“目标文件”,并且可以在该点加载动态库。这种动态加载使得faketime
通过LD_PRELOAD
指令成为可能,这会改变加载器的行为。
LD_PRELOAD
。其次,它不使用libc
,所以即使它是动态链接的,并且LD_PRELOAD
技巧有效,libc
也永远不会被调用,所以它仍然无法实现欺骗程序使用假时间函数的预期目标。