이 도구를 사용하여 원치 않는 종속성을 제거하기 위해 개발 서버에서 여러 라이브러리를 패치하고 있습니다 patchelf
. RPM으로 패키지되어 런타임 시스템에 설치됩니다. 설치 후 ldconfig
호출되며 이상한 링크가 생성됩니다.
런타임 시스템에서 패치된 라이브러리의 위치는 /usr1/blah/lib
여러 하위 폴더처럼 보입니다. 하위 폴더의 위치와 위치는 /etc/ld.so.conf
내 파일에 지정됩니다. 실행하면 ldconfig
다음과 같이 이상한 이름을 가진 링크가 많이 생성됩니다.
?N -> libFoo.so
??r? -> libBar.so
그리고 이름이 라이브러리에 있는 함수의 함수 이름의 일부인 링크, 예를 들어 이렇게 하고 objdump -x
함수 이름을 보면 링크는 함수의 일부를 이름으로 갖게 됩니다.
내 이해는 ldconfig가 SONAME
라이브러리 이름을 보고 해당 이름으로 링크를 생성한다는 것입니다. 그러나 objdump -x
영향을 받은 모든 라이브러리에 대해 an 및 grep을 수행 하면 SONAME
이상한 점이 하나도 없고 모두 .so로 끝나며 이상한 물음표도 없습니다.
ldconfig -v
유용한 정보가 제공되지 않습니다.
무슨 일이 일어나고 있는지에 대한 아이디어가 있습니까? 어쩌면 SONAME
내가 뭔가를 놓치고 있는 게 아닐까 ? 도움을 주셔서 감사합니다.
편집: 패치 프로세스의 일부로 종속성을 제거하면(예: 호출만 하면 이 문제가 발생하지 않습니다 . 이 문제는 patchelf --remove-needed <dependency> <lib name>
해당 플래그를 사용할 경우 에만 발생합니다.--add-needed
편집 2: 정크 종속성을 추가하고 제거하면(예: patchelf --add-needed garbage libFoo.so
바로 뒤에 ) patchelf --remove-needed garbage libFoo.so
이상한 연결 문제가 발생합니다 . 각 라이브러리의 최종 종속성 목록은 정확히 동일하며 --remove-needed
해당 플래그를 사용할 때 작동하므로 문제는 해당 --add-needed
플래그와 patchelf
헤더에 수행되는 모든 작업에 있다고 생각하게 됩니다.
편집 3: 이 시점에서는 이것이 patchelf 또는 ldconfig의 버그라고 가정합니다. 우리는 glibc
2012년경부터 버전 2.17을 사용하고 있기 때문에 후자일 것이라고 추측합니다. 하지만 patchelf
... 아마도 ELF 표준이 변경되었을 수도 있습니다.
tl;dr patchelf 버전 0.10 및 glibc 버전 2.17에서 --add-needed 옵션이 ELF를 망쳐 ldconfig가 일부 불안정한 링크를 생성하게 만드는 것 같습니다.
답변1
ldconfig
일부 부분을 변경한 후(특히 soname 또는 rpath 추가/변경/제거) ELF 형식을 올바르게 읽을 수 있을 만큼 똑똑할 뿐만 아니라.
라이브러리 자체는 완벽하지만 그게 ldconfig
문제일 뿐입니다.