一个链接到 libc.so 的程序通过plt调用libc函数,假设setenv((。在setenv((内部,它调用malloc((,至少根据musl libc。
setenv((->malloc(( 调用是否总是必须通过 plt 并得到?RIP 相对寻址不是更好吗,因为即使启用了 ASLR,您也只会移动整个 VMA?
setenv((->malloc(( 调用是否总是必须通过 plt 并得到?
它不必这样做,但许多libc实现允许最终用户替换他/她自己的malloc
实现(例如TCMalloc或jemalloc(,并且直接从setenv
调用malloc
会严重限制这一点。
RIP 相对寻址不是更好吗
你需要小心"工作得更好"的实际含义,以及你评估它的轴。
IP 相对调用(即直接调用(会更快、更高效,但它根本不适用于符号插入。
附言至少GLIBC对用户提供的mmap
没有类似的规定,因此直接进行mmap
调用。这实际上给那些想要通过插入mmap
和munmap
来准确解释过程中使用的所有内存的人带来了问题。