与 libc.so 链接的程序通过 plt 调用 libc 函数,比如说 setenv()。在 setenv() 内部,它调用 malloc(),至少根据 musl libc。
setenv()->malloc() 调用是否总是必须通过 plt 并得到?RIP 相对寻址不会更好吗,因为即使启用了 ASLR,您也只是移动整个 VMA?
setenv()->malloc() 调用是否总是必须通过 plt 并得到?
不一定,但许多libc 实现允许最终用户替换他/她自己的malloc
实现(例如TCMalloc或jemalloc),直接调用malloc
会严重限制这一点。setenv
RIP 相对寻址不是更好吗
您需要注意“更好地工作”的实际含义,以及您沿着哪个轴评估它。
IP相对调用(即直接调用)会更快更高效,但对于符号插入根本不起作用。
PS 至少 GLIBC 对 user-provided 没有类似的规定mmap
,因此mmap
直接拨打电话。mmap
对于想要通过插入和来准确计算进程中使用的所有内存的人来说,这实际上会导致问题munmap
。