我对.NET语言环境中的机器代码和本机代码感到困惑.
他们之间有什么区别?它们是一样的吗?
过去几天我一直在试验装配,现在了解装配和机器代码之间的关系(在OSX上通过NASM使用x86,阅读英特尔文档).
现在我试图了解链接器如何工作的细节,特别是想要了解Mach-O目标文件的结构,从Mach-O头开始.
我的问题是,你能否将下面的Mach-O标头映射到otool命令输出(显示标题,但它们的格式不同)?
这个问题的一些原因包括:
下面我展示了我尝试从真实对象文件解码Mach-O头的示例和过程.在下面的描述中,我试图显示出现的所有小/微妙问题的提示.希望这将提供一种对新手如此混淆的感觉.
从一个名为的基本C文件开始example.c:
#include <stdio.h>
int
main() {
printf("hello world");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
用gcc example.c -o example.out它编译,它给出:
cffa edfe 0700 0001 0300 0080 0200 0000
1000 0000 1005 0000 8500 2000 0000 0000
1900 0000 4800 0000 5f5f 5041 4745 5a45
524f 0000 0000 0000 0000 0000 0000 0000
0000 0000 0100 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 …Run Code Online (Sandbox Code Playgroud) 我理解JIT编译的工作原理(在阅读了这个SO问题之后的资源).但是,我仍然想知道它是如何在运行时实际执行机器代码的?
我没有深入的操作系统或编译器优化背景,也没有直接使用机器代码做任何事情,但我开始探索它.我已经开始在汇编中玩,看看像NASM这样的东西可以把你的汇编代码编译成机器代码(可执行文件),然后你可以从命令行"调用"它./my-executable.
但是JIT编译器在运行时实际上是如何做到的呢?是将流机器代码转换为stdin还是其他东西,或者它是如何工作的?如果你可以提供一个例子或一些伪代码来说明某些程序集(或那些沿着这些行的东西,而不是像C那样高的程度)可能看起来可以展示基本流程,那也是惊人的.
machine-code ×2
.net ×1
assembly ×1
bytecode ×1
c ×1
compilation ×1
executable ×1
jit ×1
llvm ×1
macos ×1