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

使用gcc与-ldl链接dlfcn函数失败,求解决办法

问题解决:链接器无法找到dladdr()的原因及修复

问题根源

链接器的选项处理顺序有严格要求:库引用选项(-lxxx)必须放在需要调用该库符号的源文件/目标文件之后。你在Makefile里把-ldl写进了CFLAGS,导致编译时-ldl出现在inst.c之前,链接器此时还未处理到包含dladdr调用的目标文件,不会去libdl库中查找对应符号,最终触发未定义引用错误。

修复方法

修改Makefile,将-ldl从CFLAGS中移出,放到链接阶段的源文件之后:

CFLAGS += -O0 -g -finstrument-functions -rdynamic

inst: inst.c
    gcc $(CFLAGS) $^ -o $@ -ldl

验证修复

重新执行make命令,编译链接会正常完成。运行生成的inst程序,会输出函数地址、所在文件名及函数名的跟踪信息。

补充优化建议

  • 建议将编译选项和链接选项分开管理,用LDFLAGS专门存放链接参数,让Makefile结构更清晰:
    CFLAGS += -O0 -g -finstrument-functions -rdynamic
    LDFLAGS += -ldl
    
    inst: inst.c
        gcc $(CFLAGS) $^ -o $@ $(LDFLAGS)
    
  • -rdynamic选项不可或缺,它会把程序内部的符号表导出到动态符号表,确保dladdr能正确解析出函数名称。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:10:26