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?
问题是faketime使用LD_PRELOAD环境变量来指示程序的动态加载器libfaketime在启动时加载。libfaketime将执行所谓的“插入”操作-用其自己的例程副本替换常规动态库例程-以便将来进行动态库调用时,libfaketime可以影响发生的情况。特别是,libfaketime插入与时间有关的调用,因此可以将伪值返回到程序。
之所以适用于大多数程序,是因为它们用于libc进行系统调用。libc提供用于与syscall进行交互的高级功能,从而使系统编程更加容易。在大多数使用的语言中libc,二进制文件是动态链接的,这意味着二进制文件中libc实际上并未包含二进制文件,但是,期望libc运行二进制文件时系统上将存在的编译版本(称为“目标文件”)。 ,然后可以加载动态库。这种动态加载是faketime通过LD_PRELOAD伪指令实现的,该伪指令改变了加载程序的行为。
但是,Go在两个方面有所不同。首先,它是静态链接的,因此没有任何加载程序可以关注LD_PRELOAD。其次,它不使用libc,因此即使它是动态链接的,并且该LD_PRELOAD技巧已奏效,libc也无论如何也不会被调用,因此,它实际上仍无法实现诱使程序使用假时间函数的预期目标。