主要观点:创建简单的 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) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。