1

우분투 15.04를 실행하는 ARM 임베디드 Linux 플랫폼에서 크로스 컴파일합니다. 이전 버전에서는이 프로그램의 정적으로 링크 된 버전이 정상적으로 실행되었습니다. 최근 libproprietary (이 질문에 lib 이름이 바뀌 었습니다.)에 링크해야했습니다. lib 파일은 .so로만 사용할 수 있습니다.동적 링크 된 ARM 실행 파일을 실행할 때 "해당 파일 또는 디렉토리가 없습니다"오류가 발생했습니다.

libproprietary.so 작품; 나는 그것에 의존하는 다른 프로그램을 실행할 수있다.

$ uname -a 
Linux <hostname> 3.10.92-71 #1 SMP PREEMPT Fri Dec 18 00:38:54 BRST 2015 armv7l armv7l armv7l GNU/Linux 

문제 :

$ ./myprogram 
-bash: ./myprogram: No such file or directory 

내가 무엇을 시도했다 :

$ ldd ./myprogram 
libproprietary.so.2 => /usr/lib/libproprietary.so.2 (0xb6bbc000) 
librt.so.1 => /lib/arm-linux-gnueabihf/librt.so.1 (0xb6ba6000) 
libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6b92000) 
libusb-1.0.so.0 => /lib/arm-linux-gnueabihf/libusb-1.0.so.0 (0xb6b72000) 
libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0xb6ab8000) 
libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6a43000) 
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6955000) 
/usr/lib/ld.so.1 => /lib/ld-linux-armhf.so.3 (0xb6f28000) 
libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0xb692c000) 
libudev.so.1 => /lib/arm-linux-gnueabihf/libudev.so.1 (0xb690f000) 

$ file ./myprogram 
./myprogram: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=881d76b2ce20f32aef95796b4fee9f01e492a7d2, not stripped 
$ file /bin/ls 
/bin/ls: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=a687c2baf9963c62c6abd209863d360dd0863686, stripped 

$ readelf -l myprogram| grep interpreter 
    [Requesting program interpreter: /usr/lib/ld.so.1] 

$ strace ./myprogram 
execve("./myprogram", ["./myprogram"...], [/* 21 vars */]) = -1 ENOENT (No such file or directory) 
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory 
) = 40 
exit_group(1)       = ? 
+++ exited with 1 +++ 

$ ls -l myprogram 
-rwxrwxr-x [details snipped] 

$ file /usr/lib/libproprietary.so.<version> 
/usr/lib/libproprietary.so.<version>: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=d9b4ba3b9ec03779792984bc8a89ceede5737455, stripped 

그것은 인터프리터가, /usr/lib/ld.so.1, 존재하지 않는 나타납니다 . 나는 그것이 무엇을/빈/LS가 사용하는 유사해야한다고 생각하는거야 :

$ readelf -l /bin/ls | grep interpreter 
    [Requesting program interpreter: /lib/ld-linux-armhf.so.3] 

내가 그러나 내 링크 단계에서이 문제를 해결하는 방법을 모르겠어요.

ccache arm-linux-gnueabihf-g++ -o myprogram -static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive -Wl,-no-undefined -pthread -Wl,-Bdynamic -lproprietary -Wl,-rpath-link=result/debug/lib -Wl,-rpath=\$ORIGIN/../../../../result/debug/lib variant-dir/debug/core-.o -Lresult/debug/lib -Wl,-Bstatic -l<other libs> 

나는 -Wl, 코어 - .o 인 단어 후 -Bdynamic -lproprietary를 이동하려고 않았다,하지만 아무것도 변경하지 않았다.

답변

0

해석기 /usr/lib/ld.so.1은 존재하지 않는 것으로 보입니다. 나는 그것이/bin/ls가 사용하고있는 것과 유사해야한다고 생각할 것이다 :

맞다. 링크 시간에 -Wl,--dynamic-linker=/lib/ld-linux-armhf.so.3 플래그를 추가하여 인터프리터를 변경할 수 있습니다.

그러나

,

  • 당신의 툴체인은 당신이 실제로 설치 한 하나 libc의 다른 버전을 대상으로 할 수있다 (이 경우 프로그램 것입니다 가능성이 충돌).
  • 이 올바른 경우 libc을 타겟팅하는 인 경우 툴 체인이 잘못 구성되었습니다.
+0

이 도구를 확인/구성하는 방법을 알고 계십니까? 또는 내가 무엇을 올려야하는지 가르쳐 주시겠습니까? – amo

+0

당신이 제안한대로 인터프리터를 변경했는데 예상대로 프로그램이 즉시 allocate_stack에서 어설 션과 충돌합니다. – amo

관련 문제