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

编译带DTrace的定制版PostgreSQL时遇未定义引用链接错误

解决PostgreSQL定制版编译--enable-dtrace时的链接符号缺失问题

针对你遇到的postgresql_*_semaphore符号未定义的链接错误,这些符号并非手动实现的代码,而是DTrace/SystemTap探针机制自动生成的占位符号,以下是具体排查和解决方向:

1. 确认探针生成流程是否完整

社区版PostgreSQL中,这些符号由dtrace工具处理src/backend/utils/probes.d文件生成,最终生成的probes.o会被链接到主程序。请检查:

  • 定制版是否保留了src/backend/utils/probes.d文件,且内容与社区版16.4一致;
  • 对比src/backend/utils/Makefile,确保包含探针生成的核心规则:
    probes.h: probes.d
            $(DTRACE) -C -h -s $< -o $@
    probes.o: probes.d
            $(DTRACE) -C -G -s $< -o $@
    
  • 编译过程中是否正确生成了probes.o文件,且链接命令中包含该文件。

2. 检查STAP_SDT_V1宏的定义一致性

从你提供的probes.h代码来看,STAP_SDT_V1宏会改变符号名称的映射规则:

  • 对比社区版和定制版的编译日志,确认编译时是否传递了相同的-DSTAP_SDT_V1参数;
  • 如果定制版中该宏的定义逻辑与社区版不同,会导致实际生成的符号名与代码中引用的不匹配,引发链接错误。

3. 验证链接器对.probes段的处理

这些符号被声明在.probes段中,若定制版修改了链接脚本(如postgres.linker.script),可能导致链接器丢弃该段内容:

  • 检查链接脚本是否保留了对.probes段的处理;
  • 使用nm工具查看probes.o文件,确认是否包含缺失的符号:
    nm probes.o | grep postgresql_transaction__commit_semaphore
    

4. 排查定制代码对探针的修改

如果定制版新增或修改了探针逻辑:

  • 确保所有新增探针都在probes.d中有对应的定义;
  • 检查是否修改了现有探针的名称,导致代码中引用的符号与生成的符号不匹配。

快速验证步骤

  1. 暂时替换定制版的probes.d和src/backend/utils/Makefile为社区版对应文件;
  2. 重新执行./configure --enable-dtrace和编译,观察错误是否消失;
  3. 若问题解决,再逐步对比定制版的修改点,定位具体原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:33:26