最近几天一直在弄qemu方针integratorcp开发板,遇到了很多问题,其中一个就是这个。
出现这种错误,一般肯定是首先检查库是否存在,是否在文件搜索路径中。
我出现这个错误的情况可能有点不一样,是在系统启动过程中提示的,由于该错误,系统未启动成功,init进程被杀死,但内核已经启动完成。
查看/lib目录,发现libm.so.6文件存在,是个链接文件,指向libm-2.17.so。然后就一直纳闷儿,那是什么原因导致init进程无法启动,提示找不到libm库呢?
负责查找库的程序是ld-linux.so.3,问题就出在该文件上。由于在init进程启动前,需要加载相应的动态库,动态库的加载和初始化任务都是由ld-linux.so.3来完成,而此时由于init进程还未启动,所以添加的环境变量全部无效,只有默认环境变量有效,即正常情况下默认库搜索路径应该为 /lib:/usr/lib。 但实际上,正是由于默认库搜索路径有误,所以才导致lib目录下明明存在libm.so.6文件,ld-linux.so任然提示“No such file or directory ”。出现该问题的原因:ld-linux.so.3文件有问题,默认库搜索路径应该是上面提到的两个目录。
解决办法:重新编译glibc。找到elf/Makefile文件,定位到"gen_trusted_dirs.awk"上一行,修改为"echo '/lib:/usr/lib'"问题追踪:ld-linux.so.3->_dl_map_object(elf/dl-load.c)->SYSTEM_DIRS(elf/trusted_dirs.h)->elf/Makefile