【问题标题】:What sections are necessary in a minimal dynamically-linked ELF program?在最小的动态链接 ELF 程序中需要哪些部分?
【发布时间】:2016-12-25 12:58:04
【问题描述】:

我组装了一个简单的“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 镜像上测试。

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

【问题讨论】:

  • 向我们展示 objdump(或类似的)的源代码和输出,而不是 base64 编码的二进制文件。你在用 CRT 吗?调试符号?
  • @MargaretBloom:编辑了问题。
  • 一个 ELF 是一个 ELF 是一个 ELF。你的问题有什么不同?要具体。
  • 严格来说,我认为您不需要 ELF 可执行文件中的任何部分。动态加载器仅使用程序头中的信息及其所指的内容加载和动态链接可执行文件。大部分信息确实对应于某些命名的部分,但您真正需要的是正确填写 LOAD、INTERP 和 DYNAMIC 段的程序头。

标签: linux assembly elf tcc


【解决方案1】:

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

你的信念是错误的。 没有部分在运行时是必需的,只有 segments 重要。

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

【讨论】:

    猜你喜欢
    • 2011-04-19
    • 2022-08-18
    • 2020-05-08
    • 2011-12-27
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多