2

汇编程序是否已经转换为可执行文件中的 ABI 二进制文件,还是由操作系统完成?

请给我链接到 GCC 或任何其他编译器源代码,它将 x86-64 内联 asm 转换为 ABI 二进制文件。

澄清我不知道,如果我知道这些是正确的:

  1. x86-64 ASCII 指令被 1:1 转换为二进制块。语法无关紧要
  2. 它是根据 ABI 规范转换的

所以我想知道它是由编译器还是操作系统在可执行处理上转换的。

4

1 回答 1

1

对于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:错误:没有这样的指令:“大声尖叫!”
因为编译器只是......不在乎。

于 2013-05-01T13:35:36.623 回答