【发布时间】:2017-08-30 21:44:16
【问题描述】:
Linux 内核有一个alternative()macro,它允许开发人员为一系列代码指定多个实现,并在运行时选择特定的替代方案(在启动过程的早期在内核alternative()宏的情况下)。
对于用户模式应用程序是否有合理的方法来实现类似的功能?特别是替代位置和运行时补丁代码的记录。
它可能对半静态检测很有用:检测可以在运行时启用或禁用,但仍仅“编译”到特定位置。
【问题讨论】:
-
查找“GNU IFUNC”
-
我看不出您要求的内容与简单的
if声明有何不同。读取环境变量或命令行标志,并在上面加上if? -
@Aganju:功能上,没有区别。这只是为了性能。
-
显然可执行文件的“文本”通常是 MAP_SHARED,加载后修改指令需要私有映射(因为您不希望它更改磁盘上的内容)。我认为你可以用
mprotect做到这一点,如果你以与 Linux(内核)相同的方式实现它。当然,内核的代码没有块设备支持,所以它可以在早期启动时自行编辑,它是主副本。 -
参见
ld.so(1)手册页...您可以在比IFUNC 更粗略的级别上为多个子架构完全重新编译代码。虽然我怀疑经过适当优化的 IFUNC 几乎是一回事。
标签: linux performance x86 instrumentation