2009-10-13 3 views
8

내가 LSB SDK를 사용하여 테스트 ELF 프로그램 구축했습니다 (내 질문에 특정하지 않습니다 메모를 LSB는) :어떤 ELF 의존성이 충족되지 않았는지 어떻게 알 수 있습니까?

$ /opt/lsb/bin/lsbcc tst.c 
$ ls -l a.out 
-rwxr-xr-x 1 math math 10791 2009-10-13 20:13 a.out 
$ file a.out 
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped 

하지만 그것을 시작할 수 없습니다입니다 (예, 나는 당신에게에게 보장 파일 디렉토리에 ...)입니다 :

$ ./a.out 
bash: ./a.out: No such file or directory 

$ uname -a 
Linux math 2.6.28-15-generiC#52-Ubuntu SMP Wed Sep 9 10:48:52 UTC 2009 x86_64 GNU/Linux 

나는 충족되지 않은 ELF 의존성이 있다고 생각하지만 난 그것을 발견하는 방법을 모르겠어요. 누락 된 링크를 발견하는 데 사용할 수있는 라이브러리 용 ldd와 유사한 도구가 있습니까? LSB를 컴파일러가 작동하기 때문에

나는 그것이 2.6.15/2.6.28-15 차이와 관련이 있다고 생각하지 않습니다

그냥 경우에, 여기의 ELF 동적 섹션
$ file /opt/lsb/bin/lsbcc 
/opt/lsb/bin/lsbcc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, not stripped 

.out :

0x0000000000000001 (NEEDED)    Shared library: [libpthread.so.0] 
0x0000000000000001 (NEEDED)    Shared library: [libm.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 
0x000000000000000c (INIT)    0x400428 
0x000000000000000d (FINI)    0x400638 
0x0000000000000004 (HASH)    0x400278 
0x0000000000000005 (STRTAB)    0x400350 
0x0000000000000006 (SYMTAB)    0x4002a8 
0x000000000000000a (STRSZ)    121 (bytes) 
0x000000000000000b (SYMENT)    24 (bytes) 
0x0000000000000015 (DEBUG)    0x0 
0x0000000000000003 (PLTGOT)    0x600fe8 
0x0000000000000002 (PLTRELSZ)   24 (bytes) 
0x0000000000000014 (PLTREL)    RELA 
0x0000000000000017 (JMPREL)    0x400410 
0x0000000000000007 (RELA)    0x4003f8 
0x0000000000000008 (RELASZ)    24 (bytes) 
0x0000000000000009 (RELAENT)   24 (bytes) 
0x000000006ffffffe (VERNEED)   0x4003d8 
0x000000006fffffff (VERNEEDNUM)   1 
0x000000006ffffff0 (VERSYM)    0x4003ca 
0x0000000000000000 (NULL)    0x0 

답변

11

이것은 ELF 인터프리터가 누락 된 경우 발생합니다.

/lib/ld-lsb.so.2 (또는 유사하며 LSB 버전 및 아키텍처에 따라 다름)이 있는지 확인하십시오. lddreadelf -l은 실행 파일이 요청하는 ELF 해석기를 보여줄 수 있습니다.

(lsbcc (또는 LSB 툴체인에 뭔가가)) 아마 내가 Glibc의 항상 여기에 매우 뛰어난 하위 호환성을 제공하고 (오히려 어리석은 생각하는 이유는, 컴파일러에 -Wl,--dynamic-linker=/lib/ld-lsb.so.2를 전달하여, 시스템의 기본 /lib/ld-linux.so.2 무시하지만,이 당신은 그것을 가지고 있습니다.)

+0

LSB 인터프리터 (/lib64/ld-lsb-x86-64.so.3)가 시스템에 없습니다. 사실 LSB 전용 인터프리터가 설치해야한다는 것을 모릅니다. LSB SDK의 바이너리가 LSB를 준수하지 않는 것은 재미 있습니다. – math

관련 문제