libfaketime不适用于golang

Mik*_*ike 3 ubuntu go supervisord

我希望我的go程序在虚假的服务器时间上运行,该程序在由超级用户守护程序的ubuntu服务器(14.04)上运行。

在我的主管配置中,我将其用作执行命令:

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

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

根据本文介绍: 使用libfaketime更改进程认为现在的时间

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

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

jos*_*hlf 5

问题是faketime使用LD_PRELOAD环境变量来指示程序的动态加载器libfaketime在启动时加载。libfaketime将执行所谓的“插入”操作-用其自己的例程副本替换常规动态库例程-以便将来进行动态库调用时,libfaketime可以影响发生的情况。特别是,libfaketime插入与时间有关的调用,因此可以将伪值返回到程序。

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

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