Я собрал простую программу «Hello, world» и слинковал ее с помощью TCC, после чего получил 4196 байт исполняемого файла.
В программе 31 раздел: ['', '.text', '.data', '.bss', '.symtab', '.strtab', '.rel.text', '.rodata', '.rodata.cst4', '.note.GNU-stack', '.init', '.rel.init', '.gnu.linkonce.t.__x86.get_pc_thunk.bx', '.fini', '.rel.fini', '.text.unlikely', '.text.__x86.get_pc_thunk.bx', '.eh_frame', '.rel.eh_frame', '.preinit_array', '.init_array', '.fini_array', '.interp', '.dynsym', '.dynstr', '.hash', '.dynamic', '.got', '.plt', '.rel.got', '.shstrtab']
. Я чувствую, что это очень много для такого простого двоичного файла - какие из них действительно необходимы для запуска моей программы?
Вот исходный код и то, как я его скомпилировал:
extern printf
global main
section .data
msg: db "Hello World!", 0
section .text
main:
;; puts (msg)
push msg
call printf
add esp, 4
;; return 0
mov eax, 0
ret
nasm main.asm -f elf32 && tcc main.o -o главная
Протестировано на 32bit/ubuntu:16.04
образе Docker.
Примечание: этот вопрос отличается от этого один в том, что я не ищу напряженный Linux ELF, а тот, который позволяет мне вызывать динамические символы. Я считаю, что из-за природы динамического связывания мне нужны дополнительные разделы.
printf
из libc. Это добавляет дополнительные ограничения из-за природы динамического связывания. Подозреваю, что худо-бедно еще и.interp
нужно, а что еще - не знаю. - person d33tah   schedule 25.12.2016