我组装了一个简单的“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 main
32bit/ubuntu:16.04
在Docker 镜像上测试。
注意:这个问题与这个问题不同,因为我不是在寻找一个紧张的 Linux ELF,而是一个允许我调用动态符号的问题。我相信由于动态链接的性质,我需要一些额外的部分。