当前位置: 技术问答>linux和unix
请为我解析一下什么是加载地址?
来源: 互联网 发布时间:2016-06-27
本文导语: 我总是弄不清加载地址与运行地址的概念。看到书上说,加载地址是段在编译出来的映像文件中的位置,而且,默认情况下,加载地址等于运行地址。这样的话,如果 我将运行地址设为 0x40000000 ,加载地址也变成了...
我总是弄不清加载地址与运行地址的概念。看到书上说,加载地址是段在编译出来的映像文件中的位置,而且,默认情况下,加载地址等于运行地址。这样的话,如果
我将运行地址设为 0x40000000 ,加载地址也变成了0x40000000,这样文件不是会超大吗?肯定不可能。那加载地址究竟是什么?只是存放在elf 头部吗?如果我用
objcopy 将elf文件变成了 binary文件,加载地址是否就没有用处了?
另外,想问下,什么情况下才会去设置运行地址和加载地址?
我将运行地址设为 0x40000000 ,加载地址也变成了0x40000000,这样文件不是会超大吗?肯定不可能。那加载地址究竟是什么?只是存放在elf 头部吗?如果我用
objcopy 将elf文件变成了 binary文件,加载地址是否就没有用处了?
另外,想问下,什么情况下才会去设置运行地址和加载地址?
|
如果你用objcopy处理了以后,生成的bin_file就不能作为可执行程序来执行了,你可以手动运行一下试试看
通常这样处理的文件,不是用作应用程序,而是用作引导程序,也就是说,是写到磁盘或者ROM中的特定位置,当
系统启动的时候,首先来执行的,最常见的就是引导区了。严格来讲,这个时候也有加载地址,但这个加载地址
不是由编译器来控制的,而是由程序员显示的控制。比如:针对于PC的引导区,通常都是放在0x7c00地址处的,所
以自己写的bin文件,通常内部都有这样一条汇编语句:
org 0x7c00
含义是讲bin文件的内容加载到0x7c00地址处。这个也可以认为是加载地址
|
在linux下面,ELF文件都是有一个头的,在你的实际起作用的代码执行之前,会有很多的其它的数据,比如下面
的这些:
[root][~]# readelf -h ctest
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x80482d0
Start of program headers: 52 (bytes into file)
Start of section headers: 3248 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 7
Size of section headers: 40 (bytes)
Number of section headers: 35
Section header string table index: 32
这些都是作为二进制binary的一部分,当程序加载到内存中去的时候,它们都要加载到内存中去。这些数据的起
始位置,就是加载地址。而你的实际运行的指令,就是运行的第一条代码所在的地址,就是执行地址了。
的这些:
[root][~]# readelf -h ctest
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x80482d0
Start of program headers: 52 (bytes into file)
Start of section headers: 3248 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 7
Size of section headers: 40 (bytes)
Number of section headers: 35
Section header string table index: 32
这些都是作为二进制binary的一部分,当程序加载到内存中去的时候,它们都要加载到内存中去。这些数据的起
始位置,就是加载地址。而你的实际运行的指令,就是运行的第一条代码所在的地址,就是执行地址了。
|
|
你需要学习elf文件格式及加载器是怎样工作的。