指定pic、pie
错误信息
某些动态库在未使用pic/pie选项的情况下,会报符号表缺失的错误,比如:
undefined reference to `cmsPlugin'
问题介绍
生成动态库与pie可执行文件编译或链接时未带对应pic/pie选项,导致符号表缺失,需要手动指定。
代码示例
执行如下命令检查是否为PIC库,检索到textrel符号则表明是PIC库。
readelf -a libhello.so |grep -i textrel
检查是否为PIE共享文件,使用file命令查看,或者用size --format=sysv查看基地址是否在0附近。
解决方案
编译选项增加-fPIC,链接选项增加-pie。
Clang严格区分编译和链接选项,不能通过cflags将-pie传递给链接器,否则会报错:
clang-10: error: argument unused during compilation: '-pie' [-Werror,-Wunused-command-line-argument]
父主题: 链接问题