https://jyywiki.cn/OS/2023/build/lect2.ipynb

汇编代码和最小可执行文件

构造最小的 Hello, World “应用程序”

编译完成后文件大小为16KB。

#include <stdio.h>

int main() {
  printf("Hello World\\n");
}

使用objdump工具查看汇编代码objdump -d a.out | less

使用静态文件进行编译,gcc hello.c -static,编译完成后大小为880kb,查看行数,objdump -d a.out | wc -l,共154193行。

打开gcc的日志功能gcc hello.c -static --verbose,可以打印出编译时的运行日志。

gcc运行日志

gcc运行日志

编译过程:.c(源代码)->.i(预编译源代码)-gcc->.S(汇编代码)-as->.o-ld->a.out

打印链接选项gcc hello.c -static -Wl,--verbose。可以看到它链接了很多东西。

强行构造最小的 Hello, World?

使用gcc -E hello.c可以看到预编译结果。

预编译结果(部分)

预编译结果(部分)

使用gcc -c hello.c生成hello.o,使用objdump -d hello.o查看内容。

查看内容

查看内容

使用ld命令强行链接,ld hello.o,会出现一个warning和一个error。

强行链接结果

强行链接结果

去除外部依赖,重新编译。