2013-12-21 1 views
5

Windows에서 gcc-linaro-arm-linux-gnueabihf-4.8-2013.11을 사용할 수있는 설정을하려고합니다. 뭔가 동적 링크에서 발생합니다gcc arm executable "no such file orr directory", 잘못된 동적 라이브러리

$(CC)-gcc -o test main.c -Wall -lc 

이 프로그램은 잘 컴파일하지만 쇼를 ARM에 배치 할 때 : 문제를 검색 "해당 파일 또는 디렉토리"

는 정적 빌드 작동하지만 실행 파일이 있음을 보인다 거대한 :

이제
$(CC)-gcc -static -o test main.c -Wall -lc 

I가 그것의 자신의 툴체인 (IDE에서) 나는이 내 ARM의 DIST와 아무 잘못없는 생각 때문에 작동 유사한 실행 (소형, 동적)을 구축 설치 VisualGDB 툴체인 갈등.

gcc-linaro-arm-linux-gnueabihf-4.8-2013.11에서 뭔가 잘못되었거나 잘못되었습니다. 사전에 대단히

감사합니다,

하나 개 더 조사 :

file test 

working (compiled with VisualGDB toolchain) 
test: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped 

mot working (compiled with gcc-linaro-arm-linux-gnueabihf-4.8-2013.11) 
test: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.1.1, BuildID[sha1]=0x13accf06af902cd8b96d85b8a412e1d7822a302b, not stripped 

my ARM 
3.8.13 

나는 (비 작업에 대한) -readelf을 실행

Dynamic section at offset 0x474 contains 24 entries: 
    Tag  Type       Name/Value 
0x00000001 (NEEDED)      Shared library: [libc.so.6] 
0x0000000c (INIT)      0x82a0 
0x0000000d (FINI)      0x8434 
0x00000019 (INIT_ARRAY)     0x10468 
0x0000001b (INIT_ARRAYSZ)    4 (bytes) 
0x0000001a (FINI_ARRAY)     0x1046c 
0x0000001c (FINI_ARRAYSZ)    4 (bytes) 
0x00000004 (HASH)      0x8194 
0x00000005 (STRTAB)      0x820c 
0x00000006 (SYMTAB)      0x81bc 
0x0000000a (STRSZ)      65 (bytes) 
0x0000000b (SYMENT)      16 (bytes) 
0x00000015 (DEBUG)      0x0 
0x00000003 (PLTGOT)      0x1055c 
0x00000002 (PLTRELSZ)     32 (bytes) 
0x00000014 (PLTREL)      REL 
0x00000017 (JMPREL)      0x8280 
0x00000011 (REL)      0x8278 
0x00000012 (RELSZ)      8 (bytes) 
0x00000013 (RELENT)      8 (bytes) 
0x6ffffffe (VERNEED)     0x8258 
0x6fffffff (VERNEEDNUM)     1 
0x6ffffff0 (VERSYM)      0x824e 
0x00000000 (NULL)      0x0 

및 작업 :

Dynamic section at offset 0x4d0 contains 24 entries: 
    Tag  Type       Name/Value 
0x00000001 (NEEDED)      Shared library: [libc.so.6] 
0x0000000c (INIT)      0x8274 
0x0000000d (FINI)      0x8490 
0x00000019 (INIT_ARRAY)     0x104c4 
0x0000001b (INIT_ARRAYSZ)    4 (bytes) 
0x0000001a (FINI_ARRAY)     0x104c8 
0x0000001c (FINI_ARRAYSZ)    4 (bytes) 
0x00000004 (HASH)      0x8168 
0x00000005 (STRTAB)      0x81e0 
0x00000006 (SYMTAB)      0x8190 
0x0000000a (STRSZ)      65 (bytes) 
0x0000000b (SYMENT)      16 (bytes) 
0x00000015 (DEBUG)      0x0 
0x00000003 (PLTGOT)      0x105b8 
0x00000002 (PLTRELSZ)     32 (bytes) 
0x00000014 (PLTREL)      REL 
0x00000017 (JMPREL)      0x8254 
0x00000011 (REL)      0x824c 
0x00000012 (RELSZ)      8 (bytes) 
0x00000013 (RELENT)      8 (bytes) 
0x6ffffffe (VERNEED)     0x822c 
0x6fffffff (VERNEEDNUM)     1 
0x6ffffff0 (VERSYM)      0x8222 
0x00000000 (NULL)      0x0 

strace 로그 :

execve("/usr/bin/test", ["test"], [/* 15 vars */]) = 0 
brk(0)         = 0x17000 
uname({sys="Linux", node="beaglebone", ...}) = 0 
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f8a000 
access("/etc/ld.so.preload", R_OK)  = -1 ENOENT (No such file or directory) 
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 
fstat64(3, {st_mode=S_IFREG|0644, st_size=54751, ...}) = 0 
mmap2(NULL, 54751, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6f57000 
close(3)        = 0 
open("/lib/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3 
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\[email protected]\321\0\0004\0\0\0"..., 512) = 512 
fstat64(3, {st_mode=S_IFREG|0644, st_size=1505830, ...}) = 0 
mmap2(NULL, 152384, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6f31000 
mprotect(0xb6f4f000, 28672, PROT_NONE) = 0 
mmap2(0xb6f56000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1d) = 0                     xb6f56000 
close(3)        = 0 
open("/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\210\177\1\0004\0\0\0"..., 512) = 512 
fstat64(3, {st_mode=S_IFREG|0755, st_size=1205468, ...}) = 0 
mmap2(NULL, 1246600, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6e00000 
mprotect(0xb6f24000, 28672, PROT_NONE) = 0 
mmap2(0xb6f2b000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x123) =                     0xb6f2b000 
mmap2(0xb6f2e000, 9608, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb                     6f2e000 
close(3)        = 0 
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f89000 
set_tls(0xb6f896d0, 0xb6f89da8, 0xb6f8c058, 0xb6f896d0, 0xb6f8c058) = 0 
mprotect(0xb6f2b000, 8192, PROT_READ) = 0 
mprotect(0xb6f8b000, 4096, PROT_READ) = 0 
munmap(0xb6f57000, 54751)    = 0 
brk(0)         = 0x17000 
brk(0x38000)       = 0x38000 
close(1)        = 0 
close(2)        = 0 
exit_group(1)       = ? 
+++ exited with 1 +++ 

답변

8

어쨌든 지원해 주셔서 감사합니다.

Linaro의 크로스 컴파일러가 /lib/ld-linux-armhf.so.3과 같은 새로운 lib 이름 (Debian의 일부 이름이 변경됨)과 연결되지만 BBB (기본) 배포본은 이전 이름 ​​/ lib /ld-linux.so.3. 두 이름 모두 BBB에서 실제 사용 된 라이브러리 인 ld-2.16.so를 가리켜 야합니다.

그래서 다른 심볼릭 링크를 만들면됩니다.

ln -s /lib/ld-2.16.so /lib/ld-linux-armhf.so.3 

-rwxr-xr-x 1 root root 130304 Mar 20 2013 /lib/ld-2.16.so 
lrwxrwxrwx 1 root root  15 Dec 24 23:14 /lib/ld-linux-armhf.so.3 -> /lib/ld-2.16.so   <-- new one 
lrwxrwxrwx 1 root root  10 Jun 19 2013 /lib/ld-linux.so.3 -> ld-2.16.so 

안부와 모두에게 메리 크리스마스, 나는 리눅스 옹스트롬에 대한 창에 크로스 컴파일하려고

+1

젠장, 시간 낭비했습니다. 다른 툴체인에서 비슷한 문제가있는 사람은 "strings"명령을 사용하여 libs를 확인할 수 있습니다. ~/개발/test.elf | 그렙 LIB /lib/ld-linux-armhf.so.3 된 libstdC++ so.6 libm.so.6 libgcc_s.so.1 libc.so.6으로 __libc_start_main). – John

0

나는 전에 비슷한 문제가 있다고 생각할 수 있습니다.

팔 배포에는 배포 또는 다른 폴더에서/usr/lib 또는/lib와 같은 폴더에 필요한 라이브러리가 있으며 컴파일 환경에 다른 위치에 있습니다. 이 다음 중 하나

  • 가 LD_LIBRARY_PATH 환경 변수를 사용하여 라이브러리 경로를 설정하는 경우 (또는 .bashrc에) 당신은 또한
도움이 될 수 있습니다 시스템에 가지고
  • 을 돕거나 같은 폴더 구조를 만들 수 있습니다 경우

    크로스 컴파일은 하드웨어 관련 라이브러리를 고려하지 않고 새로운 하드웨어의 시스템 라이브러리 일뿐입니다.

    물론 제가 암 하드웨어 또는 에뮬레이터에서 프로그램을 실행 가능하게 만들기 위해 chmod를 수행했다고 가정합니다.

  • +0

    그래, 난에 대한 + X : – user1797147

    1

    배포 컴퓨터에 누락 된 공유 라이브러리가있을 수 있습니다.

    $(CC)-readelf -d your-binary | grep NEEDED을 실행 해보십시오. 그러면 필수 공유 라이브러리의 이름이 표시됩니다. 해당 컴퓨터가 대상 컴퓨터에 있는지 확인하십시오.

    ldd you-binary을 대상 컴퓨터에서 실행 해보십시오. 필요한 동적 라이브러리 및 발견 된 경우보고해야합니다.

    추신. strace your-binary으로 대상에서 프로그램을 실행하십시오. open 또는 access 호출을 찾고 오류 ENOENT을 반환합니다.

    +0

    이 -readelf가 – user1797147

    +0

    strace를 위 참조 위 참조 (감사했다 나를 가리키는 도구, 훌륭한 도구) 오류를 이해하는 데 약간의 도움이 될 수 있습니까? /etc/ld.so.preload가 빠져있는 것 같습니다 (또는 제 libc가 거기에서 몇 개의 심볼을 포함 시켰습니다). – user1797147

    +0

    아니요, ld.so.preload는 꼭 필요한 것은 아닙니다. 이 strace 출력에서 ​​아무 것도 잘못 볼 수 없습니다. ( – chill

    관련 문제