我正在 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
。