Had*_*awy 5 linker operating-system loader computer-architecture program-counter
链接地址是程序执行发生的地址,而加载地址是程序实际放置在内存中的地址。
现在我很困惑程序计数器的值是什么?是加载地址还是链接地址?
链接地址是程序执行的地址
不,这不对。
而加载地址是程序实际放置的内存地址。
有点儿。程序通常由多个指令组成,因此不能将其放置在单个“加载地址”处。
当人们谈论加载地址时,他们通常谈论的是可重定位代码,这些代码可以(在运行时)重定位到任意加载地址。
例如,让我们看一个链接在地址 处的程序0x20020,它由 100 个 4 字节指令组成,所有指令都按顺序执行(例如,它是一个ADDs 序列,后跟一个SYSCALL用于退出程序的单个指令)。
如果这样的程序在地址处加载0x20020,那么在运行时程序计数器将有值0x20020,然后它将前进到下一条指令0x20024,然后到0x20028,依此类推,直到到达程序的最后一条指令0x201ac。
但是,如果该程序加载到地址(即,如果程序从其链接地址0x80020020重定位为),则程序计数器将从 开始,最后一条指令将位于。0x800000000x800200200x800201ac
请注意,在许多操作系统上,可执行文件是不可重定位的,因此必须始终加载到它们链接的相同地址(即使用重定位0;在这种情况下,“链接地址”实际上是执行开始的地址),而共享库几乎是始终可重定位,并且通常在地址处链接0并且具有非零重定位。