2009-10-13 12 views
8

tôi đã xây dựng một chương trình thử nghiệm ELF sử dụng LSB SDK (lưu ý rằng câu hỏi của tôi là không cụ thể cho LSB):Làm thế nào tôi có thể tìm thấy sự phụ thuộc ELF nào không được đáp ứng?

$ /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 

Nhưng tôi không thể khởi động nó (có, tôi đảm bảo với bạn tập tin trong thư mục ...):

$ ./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 

tôi nghĩ rằng có một sự phụ thuộc ELF mà không được đáp ứng nhưng tôi không biết làm thế nào để tìm thấy nó. Có một công cụ tương tự như ldd cho các thư viện có thể được sử dụng để tìm thấy các liên kết còn thiếu?

Tôi không nghĩ rằng nó có liên quan đến sự khác biệt 2.6.15/2.6.28-15 vì LSB biên dịch đang làm việc:

$ 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 

Chỉ trong trường hợp, đây là phần năng động ELF của một .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 

Trả lời

11

Điều này giống như những gì xảy ra khi trình thông dịch viên ELF bị thiếu.

Đảm bảo rằng /lib/ld-lsb.so.2 (hoặc tương tự; thay đổi theo phiên bản và kiến ​​trúc LSB) tồn tại. lddreadelf -l sẽ có thể hiển thị thông dịch viên ELF mà bạn có thể yêu cầu.

(lsbcc (hoặc cái gì đó trong LSB toolchain) sẽ ghi đè của hệ thống mặc định /lib/ld-linux.so.2, có lẽ bằng cách thông qua -Wl,--dynamic-linker=/lib/ld-lsb.so.2 để trình biên dịch, vì lý do tôi nghĩ là khá ngớ ngẩn (Glibc luôn cung cấp khá xuất sắc ngược tương thích ở đây), nhưng có bạn có nó.)

+0

Đó là nó, tôi không có trình thông dịch LSB (/lib64/ld-lsb-x86-64.so.3) trên hệ thống. Trong thực tế, tôi không biết có một thông dịch viên LSB cụ thể mà tôi cần phải cài đặt ... Thật buồn cười khi các tệp nhị phân trong LSB SDK không tuân thủ LSB. – math