用于确定性加载程序和共享对象的 LD 选项?

用于确定性加载程序和共享对象的 LD 选项?

我正在 BeagleBone Black 上解决一个不寻常的问题。 “不寻常”的部分是在调试原因下逐步进行,而SIGILL以前并不存在。

由于 PIC 和 PIE,地址会在运行之间移动。我想强制 LD 执行确定性负载。这个想法是做类似的事情:

LD_BASE_ADDRESS=0x1000 ./test.exe

或者可能:

LD_ADDRESS_SEED=0x0000 ./test.exe

然后获得可重现的结果,就像随机数生成器使用相同的种子进行播种一样。

我检查了ld.so(8)手册页,但我没有看到该选项。LD_USE_LOAD_BIAS看起来很接近,但我不清楚它是否提供了确定性行为。

我如何告诉 LD 确定性地加载程序及其所有共享对象?

答案1

这不是由链接器控制的,而是由内核控制的。您可以使用禁用 ASLRrandomize_va_space

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

要重新启用它:

echo 2 | sudo tee /proc/sys/kernel/randomize_va_space

setarch您还可以使用应用适当的个性来对单个进程禁用它:

setarch $(uname -m) -R command

将在没有 ASLR 的情况下运行command

相关内容