Linux 最小动态链接ELF程序中需要哪些部分?

Linux 最小动态链接ELF程序中需要哪些部分?,linux,assembly,elf,tcc,Linux,Assembly,Elf,Tcc,我组装了一个简单的“Hello,world”程序,并使用TCC链接它,之后我得到了4196字节的可执行文件 该程序有31个部分:“文本”中,“文本”中,“文本”中,“数据”中,“数据”中,“数据”中,“数据”中,“数据”中,“数据”中的“文本”中的“文本”中的“Ro数据”中的“文本”中的“文本”中的“文本”中的“文本”中的“文本”中的“文本”中的“文本”中的“文本文本”中的“rodata.文本”中的“rodata.CS4”,以及“注.GNU堆栈中的“注.GNU堆栈”中的“注.GNU堆栈”,以及“

我组装了一个简单的“Hello,world”程序,并使用TCC链接它,之后我得到了4196字节的可执行文件

该程序有31个部分:
“文本”中,“文本”中,“文本”中,“数据”中,“数据”中,“数据”中,“数据”中,“数据”中,“数据”中的“文本”中的“文本”中的“Ro数据”中的“文本”中的“文本”中的“文本”中的“文本”中的“文本”中的“文本”中的“文本”中的“文本文本”中的“rodata.文本”中的“rodata.CS4”,以及“注.GNU堆栈中的“注.GNU堆栈”中的“注.GNU堆栈”,以及“注..GNU堆栈,”中的“注.GNU堆栈,”中的“注..GNU堆栈'、、、、、。“........注..GNU堆栈中的.GNU堆栈'、、、、、、、、、、、、、。“......................................“,”.fini_数组“,”.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

32位/ubuntu:16.04
Docker图像上测试

注意:这个问题不同于我要寻找的不是一个紧张的Linux ELF,而是一个允许我调用动态符号的问题。我相信由于动态链接的性质,我需要一些额外的部分

我相信,由于动态链接的性质,我需要一些额外的部分

您的想法是错误的。在运行时不需要任何部分,只有部分是重要的

可运行的动态链接ELF二进制文件将至少有一个
PT\u加载
段、一个
PT\u INTERP
段和
PT\u动态

我相信,由于动态链接的性质,我需要一些额外的部分

您的想法是错误的。在运行时不需要任何部分,只有部分是重要的


可运行的动态链接ELF二进制文件将至少有一个
PT_LOAD
段、一个
PT_INTERP
段和
PT_DYNAMIC
段。

显示源代码和objdump(或类似)的输出,不是base64编码的二进制文件。你在使用CRT吗?调试符号?@MargaretBloom:编辑了这个问题。ELF的可能副本是ELF,ELF是ELF。你的问题有什么不同?请具体说明。严格来说,我认为你不需要ELF可执行文件中的任何部分。动态加载程序只使用程序头中的信息和我所需要的t表示加载并动态链接可执行文件。大部分信息确实对应于某些命名部分,但您实际需要的是一个程序头,其中包含正确填写的加载、INTERP和动态段。向我们展示源代码和objdump(或类似)的输出,不是base64编码的二进制文件。你在使用CRT吗?调试符号?@MargaretBloom:编辑了这个问题。ELF的可能副本是ELF,ELF是ELF。你的问题有什么不同?请具体说明。严格来说,我认为你不需要ELF可执行文件中的任何部分。动态加载程序只使用程序头中的信息和我所需要的t表示加载并动态链接可执行文件。大部分信息确实对应于某些命名部分,但实际上您需要的是一个程序头,其中包含正确填写的加载、INTERP和动态段。