一个简单的 ELF - 象牙塔

主要观点:创建简单的 Linux 程序看似容易实则困难,标准库等带来很多复杂性,通过逐步去除复杂性来简化程序。
关键信息

  • 初始简单程序包含标准库等,编译后有众多符号和段。
  • 去掉标准库后需提供自己的入口点startup,用syscall指令代替printf等。
  • 去掉位置无关执行(PIE)等安全特性,使符号地址变为绝对地址。
  • 介绍链接脚本可指定符号加载地址等,通过示例展示不同类型符号在脚本中的处理。
    重要细节
  • 初始程序hello.c编译后objdump显示复杂的符号表和段信息。
  • 去掉标准库的hello-syscall.cstartup函数调用main并使用syscall
  • 去掉 PIE 等特性后的hello-nostd-nopie符号地址变为绝对,objdump显示更简单的代码。
  • 引入链接脚本hello.ld可自定义内存映射和符号加载地址,示例程序hello-data.c展示不同类型符号在脚本中的情况。最后给出相关代码示例的 GitHub 链接及改进内联汇编的注意事项。
阅读 9
0 条评论