You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GLIBC存在多份函数定义时,函数何时生成.plt条目?

问题1:既然ld.so可以直接从libc.so获取_dl_signal_exception实现,为什么它自身还要定义该函数?

ld.so是Linux系统的动态链接器本身,它的启动优先级远高于libc.so:内核拉起用户进程时,会先把ld.so映射到进程地址空间并执行它的初始化逻辑,此时libc.so还没有被加载、也没有完成重定位,完全不可用。
而_dl_signal_exception是动态链接流程中处理异常、信号上报的核心函数,ld.so在初始化阶段(比如解析依赖库出错、处理加载阶段的信号)就需要调用这个函数,因此必须自带一份独立实现,保证初始化阶段的功能可用。
等ld.so完成所有依赖库的加载、libc.so就绪之后,全局符号表中libc.so的_dl_signal_exception优先级更高,后续所有跨库调用都会统一使用libc.so的实现,避免多份实现带来的逻辑不一致。

问题2:为什么libc.so中没有_dl_signal_exception对应的.plt条目?

首先_dl_signal_exception是标记了GLIBC_PRIVATE的私有符号,仅允许GLIBC内部组件调用,不对外暴露、也不支持外部符号插入。
GLIBC在编译libc.so时,对于同库内的私有符号调用会做优化:不需要走PLT/GOT的间接跳转,直接通过PC相对寻址完成直接调用,既提升了调用性能,也不需要生成对应的PLT条目。只有需要对外导出、支持符号插入的公共函数,同库调用时才会生成PLT条目。


内容的提问来源于stack exchange,提问作者peachykeen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:39:03