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

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.

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

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


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

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

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



不指定a.so时, 照样能链接成功.
GCC/LD编译链接潜规则 (第四弹) : ld 会把所有通过-l指定的动态库全部链接进最终的目标程序中, 无论是否真的用到(导致生产环境加载失败)_第3张图片

961ci+6E0x90ErtT+mK9dwOv7CFr4pCKDoaRbj8j3Ib/KOBXIHo

你可能感兴趣的:(gcc,ldd,ld)