Ubuntu libfaketime没有';我不能和戈朗一起工作

Ubuntu libfaketime没有';我不能和戈朗一起工作,ubuntu,go,supervisord,Ubuntu,Go,Supervisord,我想我的go程序,运行在ubuntu服务器(14.04)上,通过supervisor后台监控,使用一个假的服务器时间 在我的主管配置中,我使用此命令作为执行命令: “faketime'上周五下午5点'/home/user/main” 程序运行,但显示当前时间 根据这篇文章: libfaketime不能用于静态链接或setuid程序,因为LD_PRELOAD对此类程序不可用 是否有必要让我编译的go程序使用faketime?问题是faketime使用LD_PRELOAD环境变量来指示程序的动态加

我想我的go程序,运行在ubuntu服务器(14.04)上,通过supervisor后台监控,使用一个假的服务器时间

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

“faketime'上周五下午5点'/home/user/main”

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

根据这篇文章:

libfaketime不能用于静态链接或setuid程序,因为LD_PRELOAD对此类程序不可用


是否有必要让我编译的go程序使用faketime?

问题是
faketime
使用
LD_PRELOAD
环境变量来指示程序的动态加载程序在启动时加载
libfaketime
libfaketime
将执行所谓的“插入”(interpositioning)——用这些例程的自身副本替换正常的动态库例程——以便在将来进行动态库调用时,
libfaketime
可以影响所发生的事情。特别是,
libfaketime
插入与时间相关的调用,因此它能够向程序返回假值

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


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

Go编译器默认生成动态链接的二进制文件(除非另有指示)。只要执行
ldd
,您就会看到二进制文件链接到
libc.so
(在Linux上测试)。区别在于它所依赖的go包是以二进制形式捆绑的。但不是系统库。