Optware가 설치된 바이너리에 "해당 파일이나 디렉터리가 없습니다"라고 표시됩니다.

Optware가 설치된 바이너리에 "해당 파일이나 디렉터리가 없습니다"라고 표시됩니다.

저는 한동안 Optware를 사용하여 ARM 기반 NAS에 Transmission, Samba 등과 같은 일반적인 패키지를 설치해 왔습니다. 그런데 시작하자마자 전송이 멈추는 문제가 발생했습니다. 한동안 솔루션을 검색하다가 마침내 내가 사용하고 있던 Optware 피드가 내 NAS 상자에 설정되어 있지 않다는 것을 발견했습니다. 소스를 전환하고 모든 패키지를 다시 설치했지만 이제 다시 설치한 항목을 실행하려고 하면 다음 오류가 발생합니다.

$ smbd
-bash: /opt/sbin/smbd: No such file or directory
$ transmission-daemon
-bash: /opt/bin/transmission-daemon: No such file or directory
$ unrar
-bash: /opt/bin/unrar: No such file or directory

확인해 보니 /opt/bin실행 /opt/sbin파일이 확실히 존재합니다. 그러면 실제 문제는 무엇입니까?

$ ldd /opt/bin/transmission-daemon
/usr/bin/ldd: line 116: /opt/bin/transmission-daemon: No such file or directory

$ file /opt/bin/transmission-daemon
/opt/bin/transmission-daemon: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), stripped

$ readelf - l /opt/sbin/smbd
readelf: error while loading shared libraries: libc.so.0: cannot open shared object file: No such file or directory

$ cat /proc/$$/maps
40084000-4019e000 r-xp 00000000 09:01 112594 /lib/libc-2.7.so

이것이 무엇을 의미하는지 잘 모르겠지만 문서가거기죠? 아니면 공유 라이브러리와 관련이 있나요?

답변1

"로더"에 의존하는 파일을 실행할 수 없는 경우 수신되는 오류는 실행 중인 파일이 아닌 로더와 관련이 있을 수 있습니다.

  • 동적으로 링크된 기본 실행 파일의 로더는 동적 라이브러리 로드를 담당하는 시스템의 일부입니다. 이는 /lib/ld.so또는 실행 파일과 유사 /lib/ld-linux.so.2하며 실행 파일이어야 합니다.
  • /bin/sh스크립트의 로더는 로 시작하는 스크립트 와 같이 shebang 줄에 언급된 프로그램입니다 #!/bin/sh.

오류 메시지는 오해의 소지가 있으며 로더에 문제가 있음을 나타내지 않습니다. 불행히도 커널 인터페이스에는 숫자 오류 코드를 보고할 공간만 있고 오류가 실제로 다른 파일과 관련되어 있음을 나타낼 공간이 없기 때문에 이 문제를 해결하는 것은 어렵습니다. 일부 쉘은 스크립트 자체에 대해 이 작업을 수행하지만( #!스크립트의 줄을 읽고 오류 조건을 다시 평가) 네이티브 바이너리에 대해 동일한 작업을 수행하려는 쉘은 본 적이 없습니다.

ldd또한 일부 특수 환경 변수를 설정한 다음 프로그램을 실행하고 로더가 작업을 수행하도록 함으로써 작동하기 때문에 바이너리에서는 작동하지 않습니다. strace또한 커널이 보고하는 것 이상을 보고하지 않기 때문에 의미 있는 정보도 제공하지 않습니다. 그리고 우리가 본 것처럼 커널은 알고 있는 모든 것을 보고할 수 없습니다.

여기서 다시 설치하려는 실행 파일( smbd, transmission-daemon등)이 시스템에 존재하지 않는 로더를 요청하고 있습니다. 따라서 새 피드도 귀하의 시스템에 적합하지 않습니다.

이는 일반적으로 올바른 시스템(또는 시스템 제품군) 및 슈퍼 아키텍처에 대해 바이너리를 실행하려고 하지만 잘못된 하위 아키텍처에 대해 실행하려고 할 때 발생합니다. 여기에는 이를 필요로 하는 시스템에 ELF 바이너리가 있으므로 커널은 이를 제대로 로드할 수 있습니다. 이는 ARM 프로세서에서 실행되는 ARM 바이너리이므로 이러한 명령어는 의미가 있으며 프로그램이 해당 로더를 찾을 수 있도록 합니다. 하지만 이것은 잘못된 로더입니다.

이제 추측하기 시작했지만 새 피드가 잘못된 ARM에 대한 것 같습니다.ABI. ABI는 프로시저 간 호출, 특히 라이브러리 함수 호출을 위한 범용 언어입니다. 일부 프로세서 아키텍처에는 여러 가지 ABI 선택이 가능하며 하나를 선택하여 일관되게 사용해야 합니다. 현재 Linux 배포판에는 두 가지 ARM ABI가 있습니다. 기존 arm-elfABI,그리고최신에비( arm-eabi). 동일한 시스템에서 ABI를 혼합할 수 없으므로 ABI에 대한 패키지 소스를 찾아야 합니다(또는 다른 ABI에 대해 시스템을 다시 설치해야 합니다).

관련 정보