【问题标题】:Do internal libc function calls have to go through .plt内部 libc 函数调用是否必须通过 .plt
【发布时间】:2019-12-08 05:45:14
【问题描述】:

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

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

【问题讨论】:

    标签: linker libc musl


    【解决方案1】:

    setenv()->malloc() 调用是否总是要经过 plt 才能得到?

    它没有必须,但是许多 libc 实现允许最终用户替换他/她自己的 malloc 实现(例如 TCMallocjemalloc),并调用 malloc来自setenv 直接会严重限制这一点。

    RIP 相对寻址不是更好

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

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

    附:至少 GLIBC 对用户提供的mmap 没有类似的规定,因此直接调用mmap。对于想要通过插入 mmapmunmap 来准确计算进程中使用的所有内存的人来说,这实际上会导致问题。

    【讨论】:

    • 感谢您抽出宝贵时间回答!我会投票,但我还没有足够的声誉。我仍在努力更好地理解这一点,所以如果我错了,请纠正我 - 似乎 libc 实现者使用 -Bsymbolic-Bsymbolic-functions--dynamic-list 的组合来启用这些函数的 .plt 条目,从而允许插值。奇怪的是,当我设置 -Bsymbolic-functions 时,libc.so 中的许多函数仍然存在 .plt 条目,而设置 -Bsymbolic 则删除了它们。除了无法插入这些功能之外,您是否预见到任何陷阱?
    猜你喜欢
    • 1970-01-01
    • 2016-10-09
    • 2012-09-27
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2012-04-25
    相关资源
    最近更新 更多