GCC/LD编译链接潜规则 (第四弹) : ld 会把所有通过-l指定的动态库全部链接进最终的目标程序中, 无论是否真的用到(导致生产环境加载失败)

来源:互联网 发布:淘宝小白是什么意思啊 编辑:程序博客网 时间:2024/06/09 22:58

GCC/LD编译链接潜规则 (第四弹) : ld 会把所有通过-l指定的动态库全部链接进最终的目标程序中, 无论是否真的用到(导致生产环境加载失败)

  • nemozhang
  • 2012-06-25 16:28
961ci+6E0x90ErtT+mK9dwOv7CFr4pCKDoaRbj8j3Ib/KOBXIHo

潜规则: ld 会把所有通过-l指定的动态库全部链接进最终的目标程序中, 无论是否真的用到.这会导致额外链接进去一些无用的库.


经常发现这样的情况, 在开发环境编译好的so或exe, 放到环境之后, 会提示加载失败, 原因是缺少某些依赖的so. 最常见的是找不到mysql.so. 因为开发环境有mysql.so, 而生产环境木有.

解决办法: 不要通过-l链接无用的so.

下面是当前目录的文件, 以及各个文件的内容.



下面是测试过程, 结果是, 虽然ld_so.cpp没有用到liba.so的任何东西, 却还是把liba.so的信息链进来了, 导致运行时加载so失败.


把当前目录设为动态库的搜索路径之后, OK了.



不指定a.so时, 照样能链接成功.

961ci+6E0x90ErtT+mK9dwOv7CFr4pCKDoaRbj8j3Ib/KOBXIHo
原创粉丝点击