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