gpt4 book ai didi

我能否以编程方式更改全局偏移表/GOT 或程序链接表/PLT?

转载 作者:太空狗 更新时间:2023-10-29 17:11:44 24 4
gpt4 key购买 nike

某些特定于平台的功能(例如 SSE 或 AVX)的可用性可以在运行时确定,如果不想为不同的功能编译和发布不同的对象,这将非常有用。

例如,以下代码允许我检查 AVX 并使用 gcc 进行编译,它提供了 cpuid.h header :

 #include "stdbool.h"
#include "cpuid.h"

bool has_avx(void)
{
uint32_t eax, ebx, ecx, edx;
__get_cpuid(1, &eax, &ebx, &ecx, &edx);
return ecx & bit_AVX;
}

与其在代码中乱扔运行时检查,如上面那样,重复执行检查,速度慢并引入分支(可以缓存检查以减少开销,但仍然会有分支),我认为我可以使用动态链接器/加载器提供的基础结构。

在带有 ELF 的平台上调用具有外部链接的函数已经是间接的,并且通过过程链接表/PLT 和全局偏移表/GOT。

假设有两个内部函数,一个基本的 _do_something_basic 总是和一个以某种方式优化的版本 _do_something_avx,它使用 AVX。我可以导出一个通用的 do_something 符号,并将其别名为基本添加:

static void _do_something_basic(…) {
// Basic implementation
}


static void _do_something_avx(…) {
// Optimized implementation using AVX
}

void do_something(…) __attribute__((alias("_do_something_basic")));

在我的库或程序加载期间,我想使用 has_avx 检查一次 AVX 的可用性,并根据检查点的结果 do_something _do_something_avx 的符号。

更好的是,如果我可以将 do_something 符号的初始版本指向一个自修改函数,该函数使用 has_avx 检查 AVX 的可用性并替换自身使用 _do_something_basic_do_something_avx

理论上这应该是可能的,但我如何以编程方式找到 PLT/GOT 的位置?是否有提供 ELF 加载器的 ABI/API,例如ld-linux.so.2,我可以用它吗?我是否需要链接描述文件来获取 PLT/GOT 位置?出于安全考虑,如果我获得指向它的指针,我什至可以写入 PLT/GOT 吗?

也许某些项目已经完成了这个或非常类似的事情。

我完全清楚,该解决方案将高度特定于平台,但由于我已经不得不处理特定于低级平台的细节,例如指令集的功能,所以这很好。

最佳答案

正如其他人所建议的那样,您可以使用特定于平台的库版本。或者,如果您愿意坚持使用 Linux,则可以使用(相对)新的 IFUNC relocations这正是你想要的。

编辑:正如 Sebastian 所指出的,IFUNC 似乎也受到其他平台(FreeBSD、Android)的支持。但请注意,该功能并未得到广泛使用,因此可能会有一些粗糙的边缘。

关于我能否以编程方式更改全局偏移表/GOT 或程序链接表/PLT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40526753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com