我如何知道共享对象 (.so) 是否启用了 ASLR?

我如何知道共享对象 (.so) 是否启用了 ASLR?

如果 .so 想要的基地址不是空闲的,会发生什么情况,加载 so 会失败,还是动态加载器会执行重定位?

答案1

您所询问的平台并不明显(例如,Linux 和 Windows 都有共享库和 ASLR,并且在首选地址方面有一些类似的问题),因此我假设是 Linux。

所有 .so 文件都必须进行编译,-fPIC因此它们都支持 ASLR 并且基于地址 0。但是每个 .so 可能是预链接由系统管理员设置,在这种情况下,加载程序将尝试在固定地址加载 .so,从而禁用 ASLR。您可以通过以下方式检查是否属于这种情况

$ readelf -SW path/to/lib.so | grep prelink

如果预链接地址已被占用,加载器会将库重新定位到不同的地址。

Windows DLL 有一个类似的功能,称为首选地址在旧版本中过去默认启用,但据我所知不再启用。

相关内容