С бинарным, я получаю другой вывод из GDB:
(gdb) r
Starting program: /tmp/sample.elf.bad
During startup program terminated with signal SIGKILL, Killed.
Глядя на двоичном:
readelf -l sample.elf
Elf file type is EXEC (Executable file)
Entry point 0x8048080
There are 1 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x000054 0x08048080 0x00000000 0x0000c 0x0000c R E 0x1000
Здесь вы просите, чтобы ядро mmap
сегмент с файлом смещения 0x54
в виртуальный адрес 0x08048080
.
Поскольку эти два числа не равны друг другу по модулю размера страницы, ядро отказывается:
strace ./sample.elf
execve("./sample.elf", ["./sample.elf"], [/* 42 vars */] <unfinished ...>
+++ killed by SIGKILL +++
Killed
Над трассированием означает, что ядро пытались создать процесс, не нравится то, что он видел, и прекращается это с предубеждением. Выполнена ни одна инструкция вашего двоичного файла.
Закрепление виртуальный адрес LOAD
и точку входа, чтобы быть 0x08048054
производит необходимое рабочее исполняемым:
strace ./sample.elf
execve("./sample.elf", ["./sample.elf"], [/* 42 vars */]) = 0
[ Process PID=23172 runs in 32 bit mode. ]
_exit(0) = ?
+++ exited with 0 +++
Вот шестнадцатеричного для него:
hd ./sample.elf
00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 10 |.ELF............|
00000010 02 00 03 00 01 00 00 00 54 80 04 08 34 00 00 00 |........T...4...|
00000020 00 00 00 00 00 00 00 00 34 00 20 00 01 00 28 00 |........4. ...(.|
00000030 00 00 00 00 01 00 00 00 54 00 00 00 54 80 04 08 |........T...T...|
00000040 00 00 00 00 0c 00 00 00 0c 00 00 00 05 00 00 00 |................|
00000050 00 10 00 00 b8 01 00 00 00 bb 00 00 00 00 cd 80 |................|
00000060
Возможный дубликат [Как сделать исполняемый файл ELF-файл в Linux с помощью шестнадцатеричного редактора?] (Http://stackoverflow.com/questions/26294034/how-to-make-an-executable-elf-file-in-linux-using-a-hex-editor) или иначе это отладка этого вопроса «кода». –