ld.so.cache 파일은 바이너리 파일이 아닙니다.

ld.so.cache 파일은 바이너리 파일이 아닙니다.

저는 현재 Comptia Linux+ 시험을 준비하고 있으며 공유 라이브러리 장을 공부하고 있습니다. 그 중에는 다음과 같은 말이 있습니다./etc/ld.so.cachefile은 바이너리 파일이지만 제 경우에는 그렇지 않습니다. 이것은 일반 파일이므로 내용을 쉽게 볼 수 있고 라이브러리 위치도 포함되어 있습니다.

ls -l /etc/ld.so.cache 
-rw-r--r--. 1 root root 154135 Feb 11 11:17 /etc/ld.so.cache

일부 자료에서 캐시 파일이 바이너리 파일이라는 것을 봤는데 왜 이런 불일치가 발생하는지 궁금합니다. 파일 형식이 배포판에 따라 달라지나요? 저는 Fedora Workstation 27을 사용하고 있습니다.

답변1

바이너리와 실행(바이너리) 파일의 정의를 혼동하고 있습니다.

이 책에서는 /etc/ld.so.cache바이너리 파일(데이터 파일)을 올바르게 언급하고 있습니다.

보시다시피 달리는 중file /etc/ld.so.cache

$ file /etc/ld.so.cache 
/etc/ld.so.cache: data

에서 man ld.so:

공유 객체 종속성을 해결할 때 동적 링커는 먼저 각 종속성 문자열에 슬래시가 포함되어 있는지 확인합니다. 이는 슬래시가 포함된 공유 객체 경로 이름이 링크 타임에 지정된 경우 발생할 수 있습니다. 슬래시가 발견되면 종속성 문자열은 (상대 또는 절대) 경로 이름으로 해석되고 해당 경로 이름을 사용하여 공유 객체가 로드됩니다.

공유 라이브러리 종속성에 슬래시가 포함되어 있지 않으면 다음 순서로 검색됩니다.

  • 이전에 향상된 라이브러리 경로에서 발견된 후보 공유 객체의 컴파일된 목록이 포함된 캐시 파일 /etc/ld.so.cache에서. 그러나 -z nodeflib 링커 옵션을 사용하여 바이너리를 연결하면 기본 경로의 공유 개체를 건너뜁니다. 하드웨어 기능 디렉터리(아래 참조)에 설치된 공유 개체는 다른 공유 개체보다 우선합니다.

~에서man ldconfig

/etc/ld.so.cache

/etc/ld.so.conf 및 /lib 및 /usr/lib에 지정된 디렉토리에 있는 정렬된 라이브러리 목록이 포함된 파일입니다.

또한 /etc/ld.so.cache런타임 시 다시 생성됩니다 ldconfig. 바라보다ldconfig와 ld.so.cache의 관계

실제로 라이브러리 파일 목록인지 다시 확인하세요.

$ strings /etc/ld.so.cache | head -5
ld.so-1.7.0
glibc-ld.so.cache1.1
libz.so.1
/lib/x86_64-linux-gnu/libz.so.1
libxtables.so.7

또는 다시 사용하십시오 ldconfig -p.

$ ldconfig -p | head -5
227 libs found in cache `/etc/ld.so.cache'
    libz.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libz.so.1
    libxtables.so.7 (libc6,x86-64) => /lib/libxtables.so.7
    libxml2.so.2 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libxml2.so.2
    libxml-security-c.so.17 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libxml-security-c.so.17

답변2

이라는 프로그램을 사용하여 작성된 이진 데이터 구조가 포함되어 있기 때문에 이진 파일입니다 ldconfig. 이 구조(아마도 해시 테이블)는 공유 객체에 대한 경로를 효율적으로 검색하고 찾는 데 사용됩니다. 텍스트 모드로 파일을 열 때 경로가 보이는 이유는 구조의 일부에 문자열이나 문자열 테이블(경로명)이 포함되어 있고, 그것이 ASCII텍스트 편집기가 코드 문자열로 인식할 수 있는 전부이기 때문입니다(그래서 화면에 표시합니다). .

관련 정보