Raspberry Pi에서 크로스 컴파일된 프로그램을 실행할 때 "해당 파일 또는 디렉터리가 없습니다"가 나타납니다.

Raspberry Pi에서 크로스 컴파일된 프로그램을 실행할 때 "해당 파일 또는 디렉터리가 없습니다"가 나타납니다.

최근에 라즈베리파이를 구입했습니다. 내 데스크탑에 arm's Cross 컴파일러(amd64)를 구성하고 설치했습니다. 간단한 "hello world" 프로그램을 컴파일한 후 .scp ./hello [email protected]:~/hellols -l hello

-rwxr-xr-x 1 david david 6774 Nov 16 18:08 hello

하지만 실행하려고 하면 다음과 같은 결과가 나타납니다.

david@raspberry-pi:~$ ./hello
-bash: ./hello: No such file or directory

david@raspberry-pi:~$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x6a926b4968b3e1a2118eeb6e656db3d21c73cf10, not stripped
david@raspberry-pi:~$ ldd hello 
    not a dynamic executable

답변1

동적 실행 파일이 아닌 경우 ldd잘못된 대상에 대해 컴파일된 것입니다.

file32비트 ARM 실행 파일이므로 크로스 컴파일한 것으로 보입니다 . 그러나 "ARM" 아키텍처가 두 개 이상 있으므로 도구 체인이 올바르게 구성되지 않을 수 있습니다.

crosstool-NG를 사용하는 경우 .config값을 살펴보세요 CT_ARCH_ARCH. Raspberry Pi의 경우 "armv6j" 1이어야 합니다. 또는 적어도 저에게는 이것이 작동합니다. 다른 세부 사항도 있지만 저는생각하다이 정도면 충분합니다. 안타깝게도 문제가 발생하면 이제 다시 빌드해야 합니다.

IMO가 크로스 컴파일러 툴체인을 작동시키는 것은 지루하고 좌절스러울 수 있지만, 호스트가 큰 요소가 아니라고 가정하면(그렇지 않아야 함), 이 경우에는 수행할 수 있습니다. Crosstool-ng는 TLI 구성자를 사용하므로 여러 빌드를 시도해야 하는 경우 매번 선택 사항을 기록하여 어떤 것이 작동하는지 알 수 있습니다.

1 나는 armv7이 더 일반적인 아키텍처(많은 휴대폰 등)라고 생각하므로 일반적인 ARM 크로스 컴파일러라고 생각하는 것을 사용하고 있다면 문제가 될 수 있습니다. 숫자는 혼란스럽습니다. 예를 들어 pi의 프로세서는 다음과 같습니다.ARM11그러나 이 페이지에 따르면 ARM11 프로세서 제품군은 ARMv6 아키텍처를 사용합니다. 즉, ARM11은 ARMv6의 구현입니다.

답변2

문제를 식별하는 방법은 무엇입니까?

file cross_compiled_executable

다음과 유사한 콘텐츠를 포함합니다.

interpreter /lib/ld-uClibc.so.0

문제는 파일이 대상에 존재하지 않는다는 것입니다.

문제를 해결하는 방법?

올바른 컴파일러를 사용하면 다음을 수행할 수 있습니다.

  • 디스크 이미지를 만든 사람은 크로스 컴파일러를 제공하거나 빌드 방법을 정확하게 알려주어야 합니다.크로스툴-ng. RPI를 얻는 방법여기에 물었습니다.
  • 자신만의 이미지와 크로스 컴파일러를 컴파일하세요.루트 구축. 이것은일반적인 QEMU 예. 루트 구축RPI 지원.
  • 대상에서 기본 컴파일러를 사용하십시오. 그러나 일반적으로 대상은 호스트보다 훨씬 느리고 공간이 제한되어 있으므로 아마도 이 작업을 원하지 않을 것입니다.

    QEMU와 같은 기능적 에뮬레이터를 사용하여 빌드한 다음 gem5 이하의 느린 마더보드와 같은 느린 플랫폼에서만 프로그램을 실행할 수도 있습니다.

크래킹만으로는 interpreter충분하지 않을 수 있습니다. 특히 /proc이를 사용하려고 하는 경우에는 -static더욱 그렇습니다(대상 커널이 너무 오래되어 필요한 인터페이스가 포함되어 있지 않을 수 있음). 신뢰할 수 있는 유일한 솔루션은 올바른 툴체인을 사용하는 것입니다.

답변3

먼저 --static옵션을 사용하여 프로그램을 컴파일한 다음 테스트하세요. 라즈베리파이에서 정적으로 작동한다면

cat "programname" | grep "lib*"
/lib/ld-linux.so.3
libc6.so 

그런 다음 모든 라이브러리가 있는지 확인하십시오.

저는 이렇게 해결했습니다. 나는 가지고 있지만 /lib/ld-linux-armhf-so.3그 사이에는 아무것도 /lib/ld-linux.so.3 효과가 없었습니다.ln -s

답변4

대상 시스템의 라이브러리는 실행 파일이 컴파일된 호스트 시스템의 라이브러리와 다릅니다.

make를 사용하는 경우 CFLAGS 및 LDGLAGS에 --static 옵션을 포함해야 합니다. 직접 gcc를 사용하는 경우 --static 옵션을 사용하여 실행 파일을 이식할 수 있습니다.

관련 정보