内部 libc 函数调用是否必须通过 .plt

Do internal libc function calls have to go through .plt

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

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

Does the setenv()->malloc() call always have to go through the plt and got?

没有,但许多 libc 实现允许最终用户替换 his/her 自己的 malloc 实现(例如 TCMalloc or jemalloc ),并从 setenv 直接 调用 malloc 会严重限制这一点。

Wouldn't RIP relative addressing work better

您需要注意 "work better" 的实际含义,以及您评估它的轴。

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

P.S。至少 GLIBC 对用户提供的 mmap 没有类似的规定,因此直接进行 mmap 调用。这实际上会给那些想要通过插入 mmapmunmap.

来准确说明进程中使用的所有内存的人带来问题