Эй, я создал файл ELF вручную, он состоит из двух разделов (.text и .shstrtab) и заголовка программы, который загружает. текстовый раздел. Секция .text очень мала и состоит только из следующих трех инструкций ...
# and exit
movl $0,%ebx # first argument: exit code
movl $1,%eax # system call number (sys_exit)
int $0x80 # call kernel
readelf не жалуется, когда я запускаю его для этого файла elf. Если я прошу прощения за этот файл, то, как только я его выполню, он будет убит, и появится сообщение «Killed» Я прошел следующий пост здесь, в stackoverflow , и я все еще прохожу его.
Теперь меня беспокоит то, что эта программа не запрашивает никакой (дополнительной) памяти, а также возможно ли сделать ELF вручную и ожидать, что система вообще допустит его?
Спасибо,
Загрузчик ELF может отправлять SIGKILL в ваш процесс для различных причины; у вас, вероятно, неправильный адрес и / или длина где-то в заголовках.
например. сегмент PT_LOAD
должен отображать соответствующую часть исполняемого файла на разумный адрес (обычный адрес для x86 Linux - 0x08048000, хотя это, вероятно, не критично, если он выровнен по странице, а не 0 и не слишком высок) ) и адреса как в заголовке раздела .text
, так и в точке входа в заголовке ELF должны совпадать с этим.
Нет причин, по которым у вас не должно быть возможности сделать это вручную (если компоновщик может это создать, вы тоже можете!) - если вы действительно этого хотите. Но обратите внимание, что если вы просто собираете, а затем связываете с удаленными символами (флаг -s
на ld
ниже):
$ cat exit.s
.globl _start
_start:
movl $0,%ebx
movl $1,%eax
int $0x80
$ as -o exit.o exit.s
$ ld -s -o exit exit.o
$ ./exit
$ hexdump -Cv exit
00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00000010 02 00 03 00 01 00 00 00 54 80 04 08 34 00 00 00 |........T...4...|
00000020 74 00 00 00 00 00 00 00 34 00 20 00 01 00 28 00 |t.......4. ...(.|
00000030 03 00 02 00 01 00 00 00 00 00 00 00 00 80 04 08 |................|
00000040 00 80 04 08 60 00 00 00 60 00 00 00 05 00 00 00 |....`...`.......|
00000050 00 10 00 00 bb 00 00 00 00 b8 01 00 00 00 cd 80 |................|
00000060 00 2e 73 68 73 74 72 74 61 62 00 2e 74 65 78 74 |..shstrtab..text|
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000090 00 00 00 00 00 00 00 00 00 00 00 00 0b 00 00 00 |................|
000000a0 01 00 00 00 06 00 00 00 54 80 04 08 54 00 00 00 |........T...T...|
000000b0 0c 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 |................|
000000c0 00 00 00 00 01 00 00 00 03 00 00 00 00 00 00 00 |................|
000000d0 00 00 00 00 60 00 00 00 11 00 00 00 00 00 00 00 |....`...........|
000000e0 00 00 00 00 01 00 00 00 00 00 00 00 |............|
000000ec
$
... тогда результат в любом случае будет довольно минимальным (вероятно, достаточно минимальный для сравнения с вашим неудачным файлом, созданным вручную, чтобы увидеть, где вы ошиблись).