루트 액세스 권한이 없는 시스템에서 glibc를 업그레이드하려고 합니다. 그래서 로컬 접두사에 설치하고 있습니다. 이 기능 설정에 대한 모범 사례를 이해하고 특정 문제를 해결하는 데 도움이 필요합니다. (내 문제에 대한 간략한 요약: lib path에 새로 설치된 glibc lib 경로를 포함하면 LD_LIBRARY_PATH
ls, vim, pwd 등을 포함하여 실행하려고 하는 모든 프로그램에서 segfault가 발생합니다.)
배경 정보:
$ uname -a
Linux 3.13.0-68-generic #111-Ubuntu SMP Fri Nov 6 18:17:06 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
컴파일러/툴체인: 로컬로 컴파일되고 gcc 5.3.0 소스에서 설치된 버전을 실행하고 있습니다. 아주 잘 작동하는 것 같습니다. 이는 다음 위치에 설치됩니다.~/toolchains/gcc_5.3.0
$ ls ~/toolchains/gcc_5.3.0
bin include lib lib32 lib64 libexec share
설치해 보세요: glibc-2.23
소스에서--prefix=~/local/
이 컴퓨터에는 sudo가 없습니다(공유 클러스터입니다. 사용자 정의 기능이 필요한 경우 전략은 저처럼 고유한 도구 체인을 설치하는 것입니다).
$ echo $LD_LIBRARY_PATH
~/toolchains/gcc_5.3.0/lib:~/toolchains/gcc_5.3.0/lib64
시스템에 설치된 glibc 버전은 2.19입니다.
$ ldd --version
ldd (Ubuntu EGLIBC 2.19-0ubuntu6.7) 2.19
(위와 아래에서는 명확성을 위해 위의 절대 경로를 ~로 대체했습니다)
질문:
gcc 5.3.0과 시스템에 설치된 gcc 4.8.4를 사용하여 glibc-2.23을 컴파일하고 설치할 수 있습니다. LD_LIBRARY_PATH
위와 같이 설정 하면 ~/local/에 컴파일하고 설치하면 정상적으로 동작합니다. 그러나 새로운 glibc 라이브러리(~/local/lib에 설치됨)를 활용하기 위해 현재 라이브러리 끝에 ~/local/lib를 추가했습니다 LD_LIBRARY_PATH
.
$ echo $LD_LIBRARY_PATH
~/toolchains/gcc_5.3.0/lib:~/toolchains/gcc_5.3.0/lib64:~/local/lib
이렇게 하면 세그폴트를 실행하려는 모든 것이 실패합니다. ls나 vim을 실행할 수도 없습니다. bash 인쇄 "분할 오류"만 표시됩니다. 내 것을 바꿔야 LD_LIBRARY_PATH
모든 것이 정상으로 돌아갈 것입니다.
무슨 일이 일어나고 있는지 알아내기 위해 gdb나 strace 등을 실행할 수 없습니다(세그폴트도 있습니다).
질문:
여기서 무슨 일이 일어나고 있는지에 대한 아이디어가 있습니까?
LD_LIBRARY_PATH
설치 및/또는 설정 방법이 잘못된 것 같습니다 . 로컬에 설치된 gcc와 로컬에 설치된 glibc에 대한 모범 사례는 무엇입니까? 버전을 더 신중하게 일치시켜야 합니까? 방금 각각의 최신 안정 소스를 확보했습니다.앞으로 내 지식으로는 gdb가 작동하지 않는 경우 세그폴트가 발생하는 위치를 정확히 찾아낼 수 있도록 이런 종류의 디버깅을 수행할 수 있는 다른 방법이 있습니까?
어떤 아이디어라도 감사드립니다.
편집하다: 나는 일반적으로 내 시스템에 업데이트된 도구 세트를 가져오고 필요한 개발 헤더와 라이브러리 등을 가져오려고 노력합니다. 예를 들어, perf_events의 일부 고급 기능을 사용하려면 libaudit와 같은 다른 것들이 필요합니다. 물론 이를 위해서는 ldap, berkeley db 등이 필요합니다. 궁극적으로 최신 버전의 glibc만 제공하는 헤더가 필요했습니다. 예를 들어, 다음은 Berkeley db를 컴파일하려고 할 때 발생하는 오류입니다. 해당 유형은 glibc의 헤더인 dirent.h에 정의된 것 같지만 내 시스템에 설치된 패키지에서는 찾을 수 없습니다.
-fPIC -DPIC -o .libs/os_dir.o
../src/os/os_dir.c: In function '__os_dirlist':
../src/os/os_dir.c:45:2: error: unknown type name 'DIR'
DIR *dirp;
^
내 시스템이 기본적으로 찾을 수 없는 개발 헤더와 라이브러리에 액세스하는 다른 방법이 있는지 알고 싶습니다. 위의 오류는 DIR
아마도 좋은 예일 것입니다.
답변1
ld-linux-x86-64.so.2(man ld.so)와 libc.so 간의 불일치로 인해 발생합니다.
LD_LIBRARY_PATH 설정으로 gdb를 실행하려면 다음을 실행하십시오.
export LD_LIBRARY_PATH=~/local/lib
/lib64/ld-linux-x86-64.so.2 --library-path /lib64 /usr/bin/gdb /bin/ls
그러면 이전 라이브러리 환경에서는 /usr/bin/gdb가 실행되고 새 라이브러리 환경에서는 /bin/ls가 실행됩니다. 마찬가지로 새 라이브러리 환경에서는 다음과 같이 하나의 명령만 실행할 수 있습니다.
export LD_LIBRARY_PATH=~/local/lib
~/local/lib/ld-linux-x86-64.so.2 /bin/echo