While cross-compiling, I encountered gawk: error while loading shared libraries: libreadline.so.4: cannot open shared object file: No such file or directory. The current build environment is x86_64, Ubuntu 20.04, the target runtime environment is mips32. The first thing I thought of when I encountered this problem was to install this lib.
On Ubuntu, we can use the apt-file program to find out where this library is installed. If you don’t have apt-file installed on your system, you need to install apt-file first, and then run it as follows:
$sudo apt-file update
$sudo apt-file search libreadline.so.4 #find no results
$sudo apt-file search libreadline.so #returns the following
lib32readline-dev: /usr/lib32/libreadline.so
lib32readline8: /lib32/libreadline.so.8
lib32readline8: /lib32/libreadline.so.8.0
libreadline-dev: /usr/lib/x86_64-linux-gnu/libreadline.so
libreadline-gplv2-dev: /usr/lib/x86_64-linux-gnu/libreadline.so
libreadline5: /lib/x86_64-linux-gnu/libreadline.so.5
libreadline5: /lib/x86_64-linux-gnu/libreadline.so.5.2
libreadline5-dbg: /usr/lib/debug/libreadline.so.5
libreadline5-dbg: /usr/lib/debug/libreadline.so.5.2
libreadline8: /lib/x86_64-linux-gnu/libreadline.so.8
libreadline8: /lib/x86_64-linux-gnu/libreadline.so.8.0
libreadline.so.4 is a very old library and is no longer available on Ubuntu’s library sources, but try the later versions. Since the source code is developed and compiled on 32bit centos, choose the 32bit library: lib32readline8.
Run as below:
$sudo apt install lib32readline8
After installation, enter the /lib32 directory and you can see libreadline.so.8 and libreadline.so.8.0.
lrwxrwxrwx 1 root root 18 Feb 25 2020 /lib32/libreadline.so.8 -> libreadline.so.8.0
-rw-r--r-- 1 root root 311884 Feb 25 2020 /lib32/libreadline.so.8.0
Then run:
$ sudo ln -sv /lib32/libreadline.so.8.0 /lib32/libreadline.so.4
In $ls -l you can see that the symbolic link has been created.
However, running the cross-compilation task still reports the same error. After posting this issue on stack overflow, someone left a comment below reminding me to fix not libreadline.so.4, but the gawk version being too old.
I ran $gawk which prompted no such command, so
$sudo apt install gawk
Then Enter $gawk –version to check the other version, and return
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
Enter $whereis gawk to find its installation path:
gawk: /usr/bin/gawk /usr/lib/x86_64-linux-gnu/gawk /usr/share/man/man1/gawk.1.gz
The path is /usr/bin, and running the cross-compile job again still gives the same error, which means that there is another gawk installed in a directory that is called first when running the cross-compile. And this directory is not in the $PATH, or if it is, it is after /usr/bin.
I found the possible installation directory of gawk in the configuration file of the source code to be compiled, cd to that directory, run $gawk, and report the same error, and here it is. Run the following command:
$cp /usr/bin/gawk gawk
Run gawk in the current directory again to confirm that it has been updated to the latest version.
Run cross compilation again without error. The problem has been solved.