change nvim glibc library path

# rocky8 의 기본 glibc 는 2.28 다.
# glibc 2.28
ldd --version
ldd (GNU libc) 2.28

# 최신 nvim(0.10.x)부터는 glibc 2.29 이상이 필요해 nvim 0.9.5 버전을 사용하고 있었다.
# 그런데 nvim 플러그인에서 에러가 많이 발생해 nvim 0.10.x 으로 교체가 필요했다.

# 최신 nvim(0.10.x)을 $HOME 에 설치하고 환경변수 PATH 에 추가했다.
export PATH=$HOME/nvim-linux-x86_64/bin:$PATH

# nvim 실행하면 다음과 같이 /lib64 에 없는 glibc 2.29 버전을 찾으려 해서 실행되지 않는다.
nvim: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by nvim)

# nvim 0.10.x 에서 사용하는 shared library 를 확인해보자.
# 필요한 shared library 확인
readelf -d ~/nvim-linux-x86_64/bin/nvim

# 필요한 shared library 경로까지 확인하려면
ldd nvim-linux-x86_64/bin/nvim
nvim-linux-x86_64/bin/nvim: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by nvim-linux-x86_64/bin/nvim)
        linux-vdso.so.1 (0x00007fff849d5000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fa9f40f8000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fa9f3ef4000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fa9f3cd4000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fa9f3abc000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fa9f36e6000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa9f4b5f000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007fa9f34e2000)

# rocky8 의 기본 빌드환경(gcc,glibc...)은 유지가 필요해 최신 glibc(2.41)을 $HOME 에 설치한다.

# nvim 에서 libgcc_s.so.1 도 필요해 최신 gcc(14.2.0) 로 $HOME 에 설치한다.

# libgcc_s.so.1 는 gcc 를 별도 설치후 glibc lib 에 복사해둔다.
cp -v ~/gcc-14.2.0/lib64/libgcc_s.so.1  ~/glibc-2.41/build/lib

# LD_LIBRARY_PATH 로 shared library path 을 다음과 같이 변경하면 현재 시스템 기본 ld(동적 라이브러리 링크/로드) 2.28 버전과 맞지 않아 프롬프트가 갱신될 때마다 다음과 같은 에러가 발생한다.
export LD_LIBRARY_PATH=$HOME/glibc-2.41/build/lib
date: /lib64/ld-linux-x86-64.so.2: version `GLIBC_2.35' not found (required by /home/ysoftman/glibc-2.41/build/lib/libc.so.6)

# 방법1 - 실행은 되지만 비정상 종료
# 다음과 같이 수동설치된 glibc ld 로 library path 를 지정해서 nvim 을 실행
~/glibc-2.41/build/lib/ld-linux-x86-64.so.2 --library-path ~/glibc-2.41/build/lib ~/nvim-linux-x86_64/bin/nvim

# 방법2
# 현재 시스템의 동적 링크 환경을 변경하지 않고 nvim 자체의 동적 링크를 변경해보자.
# patchelf 툴을 사용하면 ELF(Executable and Linkable Format) 의 동적링크 경로등을 수정할 수 있다.
sudo dnf install patchelf

# patchelf 로 rpath(LD_LIBRARY_PATH보다 먼저 검색된다)를 변경하면 모두 변경된다.
# 참고로 rpath 설정시 경로에 해당 파일이 없으면 그 파일은 변경이 안된다.
patchelf --set-rpath ~/glibc-2.41/build/lib ~/nvim-linux-x86_64/bin/nvim

# 실행하면 nvim > glibc 를 사용하는데 glibc 에서 /lib64 경로를 바라 보고 있어 에러가 발생한다.
nvim: /lib64/ld-linux-x86-64.so.2: version `GLIBC_2.35' not found (required by /home/ysoftman/glibc-2.41/build/lib/libc.so.6)

# glibc > libc.so.6 는 변경이 안되고 nvim 에서 ld-linux-x86-64.so.2 를 다음으로 수정한다.
patchelf --set-interpreter ~/glibc-2.41/build/lib/ld-linux-x86-64.so.2 ~/nvim-linux-x86_64/bin/nvim

# 이제 ldd 로 보면 /home/ysoftman/glibc-2.41/build/lib/ld-linux-x86-64.so.2 로 변경되었다.
# libc.so.6 에서 not found 에러가 나도 nvim 을 ld-linux-x86.so.2 경로를 변경해서 실행할 수 있다.
ldd ~/nvim-linux-x86_64/bin/nvim
/home/ysoftman/nvim-linux-x86_64/bin/nvim: /lib64/ld-linux-x86-64.so.2: version `GLIBC_2.35' not found (required by /home/ysoftman/glibc-2.41/build/lib/libc.so.6)
        linux-vdso.so.1 (0x00007ffc6fdc3000)
        libm.so.6 => /home/ysoftman/glibc-2.41/build/lib/libm.so.6 (0x00007f6ceebc9000)
        libdl.so.2 => /home/ysoftman/glibc-2.41/build/lib/libdl.so.2 (0x00007f6cee9c7000)
        libpthread.so.0 => /home/ysoftman/glibc-2.41/build/lib/libpthread.so.0 (0x00007f6cee7c5000)
        libgcc_s.so.1 => /home/ysoftman/glibc-2.41/build/lib/libgcc_s.so.1 (0x00007f6cee598000)
        libc.so.6 => /home/ysoftman/glibc-2.41/build/lib/libc.so.6 (0x00007f6cee1b8000)
        /home/ysoftman/glibc-2.41/build/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f6cef993000)
        libutil.so.1 => /home/ysoftman/glibc-2.41/build/lib/libutil.so.1 (0x00007f6cedfb6000)

# 이제 실행하면 잘된다. 
nvim

comments:

댓글 쓰기