汇编程序是否已经转换为可执行文件中的 ABI 二进制文件,还是由操作系统完成?
请给我链接到 GCC 或任何其他编译器源代码,它将 x86-64 内联 asm 转换为 ABI 二进制文件。
澄清我不知道,如果我知道这些是正确的:
- x86-64 ASCII 指令被 1:1 转换为二进制块。语法无关紧要
- 它是根据 ABI 规范转换的
所以我想知道它是由编译器还是操作系统在可执行处理上转换的。
汇编程序是否已经转换为可执行文件中的 ABI 二进制文件,还是由操作系统完成?
请给我链接到 GCC 或任何其他编译器源代码,它将 x86-64 内联 asm 转换为 ABI 二进制文件。
澄清我不知道,如果我知道这些是正确的:
所以我想知道它是由编译器还是操作系统在可执行处理上转换的。
对于gcc
,从例如 C 源代码生成可执行文件是一个多步骤的过程。可以观察到:
$ gcc -v -save-temps -ot tc -lm 从 ..../lib/gcc/..../specs 读取规范 配置:./configure [ .... ] 线程模型:posix gcc 版本.... .../cc1 -E -quiet -v -iprefix ..../lib/gcc/..../ tc ... -o ti [ C 预处理器的输出 ... ] ..../gcc/.../libexec/gcc/..../cc1 -fpreprocessed ti -quiet -dumpbase tc ... -auxbase t -O8 -version -o ts [ C 编译器的输出 - 对预处理的源代码进行操作 ... ] .../binutils/.../bin/as -V -Qy -o 到 ts [ GNU 汇编器的输出 - 使用编译器创建的程序集 ... ] ..../gcc/.../libexec/gcc/..../collect2 -rpath [ ... ] -L [ ... ] --eh-frame-hdr -m elf_x86_64 -dynamic-linker / lib64/ld-linux-x86-64.so.2 -ot /usr/lib64/crt1.o /usr/lib64/crti.o ..../gcc/.../lib/gcc/.../ crtbegin.o -L[ ... 还有很多 ... ] 到 -lm -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no -按需.../gcc/..../lib/gcc/..../crtend.o /usr/lib64/crtn.o [链接器的输出 - 使用汇编器创建的目标文件...]
上面的结果,多亏了-save-temps
,除了你的源文件之外t.c
,你还会找到中间阶段:
t.i
这是预处理的C源(发布cpp
/cc1 -E
阶段)t.s
这是汇编源代码(由 C 编译器创建)t.o
这是对象(二进制)代码(由汇编程序创建)t
这是实际的 ELF 可执行文件(由链接器创建)内联汇编语句由 C 编译器简单地嵌入到它生成的汇编源代码中。如果你说:
__asm__ __volatile__("scream loudly !\n");
那么结果是:
ts:汇编程序消息: ts:147:错误:没有这样的指令:“大声尖叫!”因为编译器只是......不在乎。