Soru Yürütülmeyen bir ikili dosya hakkında nasıl bilgi edinebilirim?


Kullanıcılarımdan biri olan "myfile" adlı uygulamalardan birini çalıştırdığımda.

$ ./myfile

Aşağıdaki çıktıyı alıyorum

bash: ./myfile: cannot execute binary file

Kullanıcımın çalışması için ikili dosya bekliyor. Bunun bir derleme hatası olduğunu kabul ediyorum, ancak bunu doğrulayamıyorum. Dosya komutunu çalıştırdım

$ file myfile
myfile: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

RHEL6 İşletim Sistemim 64 bit

$ uname -p -o
x86_64 GNU/Linux

Yani bana doğru mimariye uyulduğu gibi görünüyor. Dosya komutunun çıktısında "yeniden yüklenebilir" ifadesinin ne anlama geldiğini anlamıyorum ve adam sayfalarını açıklama formu bulamadı.

İyi bir ölçüm için Paylaşılan Kitaplık Bağımlılıkları'nı kontrol ettim

$ ldd myfile 
not a dynamic executable

Bu dosyayı çalıştırabilmem veya kullanmam için neden bazı yapıcı bilgiler verebileceğimi gösteren bir yol var mı (x kullanarak yeniden derlemesi gerekiyor)?

strace

$ strace ./myfile
execve("./myfile", ["./myfile"], [/* 22 vars */]) = -1 ENOEXEC (Exec format error)
dup(2)                                  = 3
fcntl(3, F_GETFL)                       = 0x8002 (flags O_RDWR|O_LARGEFILE)
fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7a9fc93000
lseek(3, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
write(3, "strace: exec: Exec format error\n", 32strace: exec: Exec format error
) = 32
close(3)                                = 0
munmap(0x7f7a9fc93000, 4096)            = 0
exit_group(1)                           = ?

çıktı çıktı

readelf -S ./myfile    There are 13 section headers, starting at offset 0x1e8:

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .text             PROGBITS         0000000000000000  00000040
       0000000000000098  0000000000000000  AX       0     0     4
  [ 2] .rela.text        RELA             0000000000000000  000006e0
       0000000000000120  0000000000000018          11     1     8
  [ 3] .data             PROGBITS         0000000000000000  000000d8
       0000000000000010  0000000000000000  WA       0     0     4
  [ 4] .bss              NOBITS           0000000000000000  000000e8
       0000000000000000  0000000000000000  WA       0     0     4
  [ 5] .rodata           PROGBITS         0000000000000000  000000e8
       0000000000000033  0000000000000000   A       0     0     1
  [ 6] .comment          PROGBITS         0000000000000000  0000011b
       000000000000002d  0000000000000001  MS       0     0     1
  [ 7] .note.GNU-stack   PROGBITS         0000000000000000  00000148
       0000000000000000  0000000000000000           0     0     1
  [ 8] .eh_frame         PROGBITS         0000000000000000  00000148
       0000000000000038  0000000000000000   A       0     0     8
  [ 9] .rela.eh_frame    RELA             0000000000000000  00000800
       0000000000000018  0000000000000018          11     8     8
  [10] .shstrtab         STRTAB           0000000000000000  00000180
       0000000000000061  0000000000000000           0     0     1
  [11] .symtab           SYMTAB           0000000000000000  00000528
       0000000000000180  0000000000000018          12     9     8
  [12] .strtab           STRTAB           0000000000000000  000006a8
       0000000000000037  0000000000000000           0     0     1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

5
2017-10-22 16:32


Menşei


Eğer varsa strace yüklü, çalıştırmayı deneyin strace ./myfile. Son birkaç satır, altta yatan sorunun bir göstergesidir. Ayrıca, dosyanın, yüklü olan birimde bulunmadığından emin olun. noexec bayrağı. - James Sneeringer
@JamesSneeringer Teşekkürler Strace çıktısını ekledim. - Eric
Tercümanını kaçırıyor gibi görünüyor. Eğer böyle koşarsan ne olur? /lib64/ld-linux-x86-64.so.2 ./executable? - Matthew Ife
@MatthewIfe Dosya, paylaşılan bir kitaplık yürütülebilir değil. Önerdiğiniz komutun ortaya çıkardığı hata "sadece ET_DYN ve ET_EXEC yüklenebilir" Bu, bu dosyanın yürütülebilir bir dosya olmadığını kanıtlar. - Eric
Lütfen çıkışını sağlayın readelf -S ./executable - Matthew Ife


Cevaplar:


Yeniden yüklenebilir bir yürütülebilir dosya olmayan bir nesne dosyası ile ilgisi var gibi geliyor.

Yürütülebilir bu gibi görünmelidir

ELF 64 bit LSB yürütülebilir, x86-64, sürüm 1 (SYSV), dinamik olarak bağlanmış, yorumlayıcı / lib64/ld-linux-x86-64.so.2, GNU / Linux için 2.6.32, BuildID [sha1] = a8ff57737fe60fba639d91d603253f4cdc6eb9f7 , soyulmuş

Nesne dosyaları böyle görünüyor

# dosya /usr/lib/x86_64-linux-gnu/crtn.o
/usr/lib/x86_64-linux-gnu/crtn.o: ELF 64 bit LSB yeniden düzenlenebilir, x86-64, sürüm 1 (SYSV), soyulmamış

Gerekirse, bu şekilde daha fazla bilgi alabilirsiniz

# objdump -x myfile

Ya da sökmeye

# objdump -d myfile

Bir nesne dosyasındaki sembollerin listesi (soyulmamış)

# nm /usr/lib/x86_64-linux-gnu/gcrt1.o
                 U atexit
0000000000000000000 b denir.4237
0000000000000000 D __data_start
0000000000000000 W data_start
                 U et
0000000000000030 T __gmon_start__
0000000000000000 R _IO_stdin_used
                 U Instagram Hesabındaki Resim ve Videoları __libc_csu_fini
                 U __libc_csu_init
                 U __libc_start_main
                 Ana
                 U _mcleanup
                 U __monstartup
0000000000000000 T _start

Sembolleri yürütülebilir dosyadan listelemeye çalışmak (elimden)

# nm / bin / bash
nm: / bin / bash: sembol yok

8
2017-10-22 17:06



Herhangi bir zamanda yeniden yüklenebilir diyerek sonuca varmaktan çıkarıyorum dosya çıktılarında dosya bir Object dosyasıdır ve yürütülebilir bir dosya değil midir? - Eric
Olabilir :). Google'da insanların neler söylediğini ve sistemimdeki hangi dosyaları rapor ettiğimi gidiyorum. - Ryan Babchishin
uygun Ubuntu forumları konu. Ryan’a katılıyorum myfile bir nesne dosyası gibi görünüyor ve yürütülebilir değil, ve sadece normal yoksundur .o uzantı. Kullanıcınız, programlarını yanlışlıkla bir nesne olarak derlemiş olabilir (ör. -c ile gcc sahip olmamalılarsa). - James Sneeringer