저는 한동안 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-elf
ABI,그리고최신에비( arm-eabi
). 동일한 시스템에서 ABI를 혼합할 수 없으므로 ABI에 대한 패키지 소스를 찾아야 합니다(또는 다른 ABI에 대해 시스템을 다시 설치해야 합니다).