Когда я запускаю одно из своих пользовательских приложений с именем «myfile».
$ ./myfile
Я получаю следующий вывод
bash: ./myfile: cannot execute binary file
Мой пользователь ожидает запуска двоичного файла. Я предполагаю, что это ошибка компиляции, но не могу ее подтвердить. Я запустил команду файла
$ file myfile
myfile: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
Моя ОС RHEL6 64-битная
$ uname -p -o
x86_64 GNU/Linux
Мне кажется, что это было сделано для правильной архитектуры. Я не понимаю, что означает «перемещаемый» в выводе команды file, и не смог получить объяснение из справочных страниц.
Для хорошей меры я проверил зависимости общей библиотеки
$ ldd myfile
not a dynamic executable
Есть ли способ запустить этот файл или дать пользователю конструктивную информацию о том, почему он не запускается (например, ему нужно перекомпилировать с помощью x)?
$ 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) = ?
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)
Похоже, что relocatable имеет отношение к объектному файлу, который не является исполняемым.
Исполняемые файлы должны выглядеть так
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=a8ff57737fe60fba639d91d603253f4cdc6eb9f7, stripped
Объектные файлы выглядят так
# file /usr/lib/x86_64-linux-gnu/crtn.o /usr/lib/x86_64-linux-gnu/crtn.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
При необходимости вы также можете получить дополнительную информацию этим способом
# objdump -x myfile
Или разобрать
# objdump -d myfile
Список символов из объектного файла (без удаления)
# nm /usr/lib/x86_64-linux-gnu/gcrt1.o U atexit 0000000000000000 b called.4237 0000000000000000 D __data_start 0000000000000000 W data_start U etext 0000000000000030 T __gmon_start__ 0000000000000000 R _IO_stdin_used U __libc_csu_fini U __libc_csu_init U __libc_start_main U main U _mcleanup U __monstartup 0000000000000000 T _start
Попытка перечислить символы из исполняемого файла (вырезано)
# nm /bin/bash nm: /bin/bash: no symbols