关于OpenWrt的C链接库变更导致的那些事儿 - dafeiyoung/sguclient GitHub Wiki

瞎比比

OpenWrt大概在15.05版本(不含)之后,已经将默认C链接库(C Library)从原先的uClibc换成了musl。但,使用uClibcSDK编译的二进制文件,是无法在使用musl的系统版本里运行的,反之亦然,会提示not found

所以这里就有一个问题:你要根据你OpenWrt系统的C链接库类型(uClibc或是musl)正确选择对应的二进制文件,才能正常在你OpenWrt系统里跑起来。要是选错了,即使安装成功也是跑不起来的(故障现象是会提示not found)。

对于使用OpenWrt官方固件的用户,这个问题很简单,一般只需要看系统版本(例如OpenWrt 18.06.0)即可得知系统的C库是uClibc或是musl。低于15.05的是uClibc,高于15.05的是musl。然而对于使用第三方编译的OpenWrt固件的用户,看固件版本的方法可能不适用,因为第三方的开发者很可能会更改默认的C库,你猜不到。

因此本文提供一个方法给大家查看当前OpenWrt系统的C库是什么。

教程

使用Putty等虚拟终端软件连接OpenWrt路由器,然后输入:

ls /lib/ld*

提示:是ls,不是1s。实在看不清就复制粘贴吧。

你会看到类似下面的输出:

# 输出1
/lib/ld-musl-mipsel-sf.so.1

或者,类似下面的输出:

# 输出2
/lib/ld-uClibc-0.9.33.2.so  /lib/ld-uClibc.so.0

显然,含有musl字样的(如输出1)即表明你当前的OpenWrt系统使用的是muslC库,你选择muslSDK编译的二进制文件(.ipk)即可;同理含有uClibc字样的(如输出2)即表明你当前的OpenWrt系统使用的是uClibcC库,你选择uClibcSDK编译的二进制文件(.ipk)即可。

讲完。