왜 `/lib`와 `/lib64`는 있는데 `/bin`만 있습니까?

왜 `/lib`와 `/lib64`는 있는데 `/bin`만 있습니까?

내 노트북에서:

$ cat /etc/issue  
Ubuntu 18.04 LTS \n \l

x86라이브러리 및 다음에는 두 가지 폴더가 있습니다 x86_64.

~$ ls -1 /  
bin
lib
lib64
sbin
...

바이너리의 경우 디렉토리가 하나만 존재하는 이유는 무엇입니까?

추신: 저는 Android에도 관심이 있지만 그 대답도 같기를 바랍니다.

답변1

/lib첫째, 왜 별도의 및가 있습니까 /lib64?

그만큼파일 시스템 계층 표준 다음과 같은 이유로 분리되어 존재한다고 언급 /lib합니다 /lib64.

10.1. 별도의 라이브러리가 필요한 둘 이상의 바이너리 형식을 지원하는 시스템에는 /lib 디렉토리의 변형이 하나 이상 있을 수 있습니다. (...) 이는 여러 바이너리 형식을 지원하지만 동일한 이름의 라이브러리가 필요한 시스템에서 64비트 또는 32비트 지원에 일반적으로 사용됩니다. 이 경우 /lib32 및 /lib64는 라이브러리 디렉토리이고 /lib는 이들 중 하나에 대한 심볼릭 링크일 수 있습니다.

예를 들어 내 Slackware 14.2에는 FHS 조각에서 제안하는 것처럼 심볼릭 링크는 아니지만 각각 32비트 및 64비트 라이브러리에 대한 디렉토리가 /lib있습니다 ./lib64/lib

$ ls -l /lib/libc.so.6
lrwxrwxrwx 1 root root 12 Aug 11  2016 /lib/libc.so.6 -> libc-2.23.so
$ ls -l /lib64/libc.so.6
lrwxrwxrwx 1 root root 12 Aug 11  2016 /lib64/libc.so.6 -> libc-2.23.so

libc.so.6에는 두 개의 라이브러리 가 있습니다 ./lib/lib64

각각 동적으로 구축됨 ELF 바이너리 인터프리터에 대한 하드코드된 경로가 포함되어 있습니다. 이 경우 /lib/ld-linux.so.2또는 다음 중 하나입니다 /lib64/ld-linux-x86-64.so.2.

$ file main
main: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, not stripped
$ readelf  -a main  | grep 'Requesting program interpreter'
      [Requesting program interpreter: /lib/ld-linux.so.2]

$ file ./main64
./main64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, not stripped
$ readelf  -a main64  | grep 'Requesting program interpreter'
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

인터프리터의 임무는 필요한 공유 라이브러리를 로드하는 것입니다. 바이너리 LD_TRACE_LOADED_OBJECTS=1나 래퍼 를 실행하지 않고도 로드할 라이브러리가 무엇인지 GNU 인터프리터에게 물어볼 수 있습니다 ldd.

$ LD_TRACE_LOADED_OBJECTS=1 ./main
        linux-gate.so.1 (0xf77a9000)
        libc.so.6 => /lib/libc.so.6 (0xf760e000)
        /lib/ld-linux.so.2 (0xf77aa000)
$ LD_TRACE_LOADED_OBJECTS=1 ./main64
        linux-vdso.so.1 (0x00007ffd535b3000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f56830b3000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f568347c000)

보시다시피 특정 인터프리터는 라이브러리를 찾을 위치를 정확히 알고 있습니다. 32비트 버전은 에서 라이브러리를 찾고 /lib64비트 버전은 에서 라이브러리를 찾습니다 /lib64.

FHS 표준은 다음에 대해 다음과 같이 말합니다 /bin.

/bin에는 시스템 관리자와 사용자 모두 사용할 수 있지만 다른 파일 시스템이 마운트되지 않은 경우(예: 단일 사용자 모드)에 필요한 명령이 포함되어 있습니다. 또한 스크립트에서 간접적으로 사용되는 명령이 포함될 수도 있습니다.

IMO에서는 별도의 디렉터리가 없는 이유 /bin/bin64이 두 디렉터리 모두에 동일한 이름을 가진 파일이 있으면 에 /binor 를 /bin64먼저 넣어야 하기 때문에 간접적으로 그 중 하나를 호출할 수 없기 때문입니다 $PATH.

그러나 위의 내용은 단지 관례일 뿐이라는 점에 유의하십시오. Linux 커널은 별도의 /bin/bin64. 원하는 경우 이를 생성하고 그에 따라 시스템을 설정할 수 있습니다.

또한 Android에 대해서도 언급하셨습니다. 수정된 Linux 커널을 실행하는 것 외에는 Ubuntu와 같은 GNU 시스템과 아무 관련이 없습니다. glibc나 bash가 없으며(기본적으로 수동으로 컴파일하고 배포할 수 있음) 디렉토리 구조도 있습니다. 완전히 다릅니다.

답변2

그 이유는 lib/lib64 디렉토리에 우연히 동일한 파일이 포함될 수 있기 때문입니다.이름왜냐하면 그것은 다양한 프로그램과 공유되는 라이브러리이기 때문입니다. 이를 별도의 디렉토리에 넣으면 충돌이 해결됩니다. (보통...) 32/64비트인 동일한 시스템에 동일한 이름의 실행 파일을 배포할 타당한 이유가 없지만 실행 파일이 혼합될 수 있으므로 공유 라이브러리를 제공해야 합니다.

관련 정보