glibc默认系统库目录问题2

lib64/lp64d符号链接问题

RISC-V 规范了lp64d、lp64、ilp32等诸多ABI。Oerv当前做法同fedora一样(其它发行版也这样?),共享库目录/usr/lib64/lp64d → . 是个指向/usr/lib64的符号链接,理由如RISC-V官网“Default library path”所描述的:glibc’s default library path includes a subdirectory for the actual ABI (e.g. “/usr/lib64/lp64d” for LP64D)

  1. 目录结构存在循环,导致有的命令会出错。目录遍历/usr/lib64时,因为lp64d → . ,因此是个死循环。表现:在oemaker制作镜像时,用到了find命令以清除无效的符号链接,形如:
find -L somedir -type l

命令报错导致制作失败:find: File system loop detected; ‘somedir/somesymbolic’ is part of the same file system loop as ‘somedir’.

  1. /usr/lib64字面上不在“标准”搜索目录内,导致有的软件包configure出不同的行为。表现:在guile构建时,configure时会用gcc -print-search-dirs命令检测库目录,并匹配lib64结尾,形如:
             if test -d "$searchdir"; then
               case "$searchdir" in
                 */lib32/ | */lib32 ) acl_libdirstem2=lib32 ;;
                 */lib64/ | */lib64 ) acl_libdirstem3=lib64 ;;
                 */../ | */.. )
                 ;;

gcc的输出如:

libraries: =/usr/lib/gcc/riscv64-openEuler-linux/12/:/usr/lib/gcc/riscv64-openEuler-linux/12/../../../../riscv64-openEuler-linux/lib/riscv64-openEuler-linux/12/:/usr/lib/gcc/riscv64-openEuler-linux/12/../../../../riscv64-openEuler-linux/lib/:/lib64/lp64d/riscv64-openEuler-linux/12/:/lib64/lp64d/:/usr/lib64/lp64d/riscv64-openEuler-linux/12/:/usr/lib64/lp64d/:/lib/riscv64-openEuler-linux/12/:/lib/:/usr/lib/riscv64-openEuler-linux/12/:/usr/lib/

由于没有以lib64结尾的(而是以lib64/lp64d结尾),因此匹配失败,而导致configure走向了不同的
分支,编译出的库带上了RPATH字段

[ 2154s] checking how to link with libunistring... /usr/lib64/libunistring.so -Wl,-rpath -Wl,/usr/lib64

而x86/arm均没有上述-Wl,-rpath -Wl,/usr/lib64字眼。

这个问题咋认识和处理?