今天在ARM板上测试一个串口性能测试工具linux-serial-test时,提示 "version `GLIBC_2.17' not found",这个问题还是第一次见,简单查了一下资料,基本确定是应用程序所依赖的glibc环境在目标平台上不支持。可是,之前使用同一交叉编译器编译出来的程序一直没问题。看了一下linux-serial-test的源码,也没有地方声明使用了Glibc-2.17相关的环境。但是,应用程序既然报了这类错误,其肯定依赖了GLIBC-2.17相关的内容,猜想可以通过arm-none-linux-gnueabi-nm工具查看linux-serial-test所包含的所有符号信息,果然,找到了依赖于GLIBC-2.17的函数,如下所示:
arm-none-linux-gnueabi-nm linux-serial-test | grep 2.17 U clock_gettime@@GLIBC_2.17
可以确定,是clock_gettime函数依赖于GLIBC_2.17环境,通过man clock_gettime查看得知如下信息:
Link with -lrt (only for glibc versions before 2.17).
可以确定对于clock_gettime的函数导致的问题,glibc 2.17之前的clock_gettime编译需要-lrt连接属性,回想之前的linux-serial-test的编译方式,如下:
arm-none-linux-gnueabi-gcc linux-serial_test.c -o linux-serial_test
所以,上述编译方式所生成的应用程序依赖于GLIBC_2.17(及以上)环境。重新编译如下:
arm-none-linux-gnueabi-gcc linux-serial_test.c -o linux-serial_test -lrt
再次通过arm-none-linux-gnueabi-nm查看linux-serial_test的符号依赖环境,确定其不再依赖于GLIBC_2.17, 至此,问题解决。
注:本人上述的解决办法,只依赖于本人所遇到的类似问题。但是该问题的本质原因就是应用程序所依赖的GLIBC环境与运行环境中GLIBC版本不匹配导致的,解决方式无非两种:
- 修改应用程序编译的选项或配置,使其去掉较高本的环境依赖,类似于本次解决方式;
- 重新配置运行环境的glibc,使其适应应用程序的依赖环境。