Assembly 二进制可执行文件如何知道它在内存中的位置?

Assembly 二进制可执行文件如何知道它在内存中的位置?,assembly,binaryfiles,Assembly,Binaryfiles,将二进制可执行文件加载到内存中时,可以对其进行反汇编,甚至可以使用十六进制编辑器和汇编代码中的符号进行查看。这些总是以0x804之类的开头。。。我假设是程序内存部分。但我的问题是,因为这些地址不是,比如说,从程序开始的偏移量,二进制文件如何知道它将被加载到内存中?可执行文件通常有一个头,其中一个字段是加载地址。不清楚你到底在问什么。您是否在询问运行中的可执行文件如何确定其在内存中的位置?如果是,为什么它需要知道?还有,你是否在考虑某个特定的平台?请参阅本文档中关于的部分。我更想问的是,程序中的地

将二进制可执行文件加载到内存中时,可以对其进行反汇编,甚至可以使用十六进制编辑器和汇编代码中的符号进行查看。这些总是以0x804之类的开头。。。我假设是程序内存部分。但我的问题是,因为这些地址不是,比如说,从程序开始的偏移量,二进制文件如何知道它将被加载到内存中?

可执行文件通常有一个头,其中一个字段是加载地址。

不清楚你到底在问什么。您是否在询问运行中的可执行文件如何确定其在内存中的位置?如果是,为什么它需要知道?还有,你是否在考虑某个特定的平台?请参阅本文档中关于的部分。我更想问的是,程序中的地址如何准确。一个程序并不总是能够被加载到同一个位置,那么地址如何指向正确的东西呢。但是如果我创建一个程序,复制它,并同时运行这两个程序,这难道不会产生问题吗?你混淆了两件事。一种是单独的地址空间。另一个是重新定位修复。但文件不能总是加载到同一位置,对吗?在Windows上,EXE的默认加载位置是0x400000,并且始终对EXE可用,这始终是进程中加载的第一件事,但预加载的系统DLL具有(其他)属性除外固定位置。@Jumhyn在同一位置加载可执行文件时,会出现什么情况?对于库来说,您是对的--该位置可能正在用于其他用途。但是对于可执行文件,您正在为新的可执行文件创建一个新的地址空间,所以它都是免费启动的。