1

与 libc.so 链接的程序通过 plt 调用 libc 函数,比如说 setenv()。在 setenv() 内部,它调用 malloc(),至少根据 musl libc。

setenv()->malloc() 调用是否总是必须通过 plt 并得到?RIP 相对寻址不会更好吗,因为即使启用了 ASLR,您也只是移动整个 VMA?

4

1 回答 1

2

setenv()->malloc() 调用是否总是必须通过 plt 并得到?

不一定,但许多libc 实现允许最终用户替换他/她自己的malloc实现(例如TCMallocjemalloc),直接调用malloc会严重限制这一点。setenv

RIP 相对寻址不是更好吗

您需要注意“更好地工作”的实际含义,以及您沿着哪个轴评估它。

IP相对调用(即直接调用)会更快更高效,但对于符号插入根本不起作用。

PS 至少 GLIBC 对 user-provided 没有类似的规定mmap,因此mmap直接拨打电话。mmap对于想要通过插入和来准确计算进程中使用的所有内存的人来说,这实际上会导致问题munmap

于 2019-12-08T16:57:51.613 回答