我想手工写一个ELF文件,我怎样才能让我的elf文件调用c标准库

yua*_* tf 5 assembly linker x86-64 elf

我想手工编写一个ELF文件。我怎样才能让我的elf文件调用c标准库。我知道内核搜索 PT_INTERP 程序头并阅读“/lib/ld-linux.so.2”,我知道全局偏移表(GOT)和过程链接表(PLT)。

但我不知道如何执行带有 PT_INTERP phdr、GOT、PLT 的 ELF 文件并调用 C 库。我需要以二进制形式了解它以帮助我创建一个手工制作的 ELF。

ysd*_*sdx 0

发生的情况是

  1. 内核将主要可执行文件和动态链接器映射到进程VAS(虚拟地址空间)中;

  2. 内核通过上下文切换到动态链接器入口点来开始执行进程;

  3. 动态链接器映射进程VAS中的引用( DT_NEEDED)共享对象

    • 如果你想使用它,你需要添加一个DT_NEEDED条目libc
  4. 动态链接器进行重定位:

    • 您的libc函数需要一个 GOT 条目;

    • 您需要一个使用此 GOT 条目的libc函数(以及特殊条目)的 PLT 条目;.PLT0

    • 您需要一个重定位条目来修复 GOT 条目;

    • libc重定位条目需要引用(动态)符号表中函数的条目;

    • 您需要相应地设置DT_RELADT_RELDT_RELASZDT_RELSZDT_RELAENTDT_RELENTDL_PLTRELPLTRELSZDT_JMPREL

    • 您的代码可以调用 PLT 条目。

  5. 动态链接器调用您的可执行入口点。