I'm back trying to run new programs on ancient linuxes, but this time I'm not going through the recompiling hassles I described here: https://adrianpopagh.blogspot.com/2021/06/installing-borg-backup-on-old-fedora.html
Since I'm getting an error while compiling python3 as described above:
# make
gcc -pthread -Wl,-rpath /usr/local/lib -Xlinker -export-dynamic -o python Programs/python.o -L. -lpython3.9 -lcrypt -lpthread -ldl -lutil -lrt -lm -lm
Programs/python.o(.text+0x1): In function `main':
./Programs/python.c:15: undefined reference to `Py_BytesMain'
collect2: ld returned 1 exit status
make: *** [python] Error 1
... I'm trying to move the compiled code directly on this RHEL4 machine. Without success, sadly:
# /opt/python3/bin/python3
/opt/python3/bin/python3: /lib64/tls/libc.so.6: version `GLIBC_2.7' not found (required by /opt/python3/lib/libpython3.9.so.1.0)
/opt/python3/bin/python3: /lib64/tls/libc.so.6: version `GLIBC_2.6' not found (required by /opt/python3/lib/libpython3.9.so.1.0)
/opt/python3/bin/python3: /lib64/tls/libc.so.6: version `GLIBC_2.4' not found (required by /opt/python3/lib/libpython3.9.so.1.0)
RHEL4's glibc version is 2.3.
In my steps I needed 3 systems:
- the donor (FC8) from which I took /lib and the /opt/python3 directories. This is the original system where I could run python3 on.
- the target (RHEL4). This is the system I want to run python3 on
- the development system (Ubuntu20.04). This is where I'm doing my compiling and patching
So, the plan is to take /lib from the donor to the target and place it in a different directory (/glibc). Then, relink python3 to use the new glibc, so that we don't break existing programs.
1. Copy over /lib:
donor# scp -r /lib/* root@target:/glibc/
2. Compile patchelf (https://github.com/NixOS/patchelf/releases/tag/0.12), so we can change the hardcoded interpreter in the python3 binary. Because of build requirements, this step should be done on a newer linux system, not on the target:
ubuntu# git clone https://github.com/NixOS/patchelf
ubuntu# cd patchelf
ubuntu# ./bootstrap.sh
ubuntu# ./configure
ubuntu# make
ubuntu# make check
ubuntu# make install
3. Copy over the python3 to be patched to the development system
ubuntu# rsync -avht donor:/opt/python3 .
4. Look for binary executables
ubuntu# find python3 -type f -exec file '{}' \; 2>&1 | grep "LSB executable"
python3/bin/python3.9: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.9, BuildID[sha1]=d544c6c7ec7a57aecd5a184ad5cfeb20d3706fae, with debug_info, not stripped
5. For each executable, change the path to the loader from /lib64/ld-linux-x86-64.so.2 to /glibc/ld-linux.so.2, and also change the path to the default libraries
ubuntu# patchelf --set-interpreter /glibc/ld-linux.so.2 --set-rpath /glibc/ python3/bin/python3.9
6. Copy back the patched files to the target:
ubuntu# rsync -avht python3 target:/opt/
7. Profit?
target# LD_LIBRARY_PATH=/glibc:/opt/python3/lib:/lib:/usr/lib:/usr/local/lib /opt/python3/bin/python3
-bash: /opt/python3/bin/python3: Accessing a corrupted shared library
# To be continued...
Comments