主要观点:创建简单的 Linux 程序看似容易实则困难,标准库等带来很多复杂性,通过逐步去除复杂性来简化程序。
关键信息:
- 初始简单程序包含标准库等,编译后有众多符号和段。
- 去掉标准库后需提供自己的入口点
startup,用syscall指令代替printf等。 - 去掉位置无关执行(PIE)等安全特性,使符号地址变为绝对地址。
- 介绍链接脚本可指定符号加载地址等,通过示例展示不同类型符号在脚本中的处理。
重要细节: - 初始程序
hello.c编译后objdump显示复杂的符号表和段信息。 - 去掉标准库的
hello-syscall.c中startup函数调用main并使用syscall。 - 去掉 PIE 等特性后的
hello-nostd-nopie符号地址变为绝对,objdump显示更简单的代码。 - 引入链接脚本
hello.ld可自定义内存映射和符号加载地址,示例程序hello-data.c展示不同类型符号在脚本中的情况。最后给出相关代码示例的 GitHub 链接及改进内联汇编的注意事项。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。