elf文件如何加载正确的内存地址并成功执行?

How elf file loaded correct memory address and executed successfully?

据我所知,bin 和 elf 之间的基本区别是

bin文件只包含bit或bytes的数据,加载到内存时需要给出内存地址,

而在 elf 的情况下,它具有符号查找和 relocatable table,因此在编程时无需提供地址。

现见attached image。我正在使用 LPCexpresso 对设备中的 elf 文件进行编程。如果您不提供基地址,那么默认情况下它将采用 0x00000000。现在我先编程 bootloader.elf,然后编程 main.elf。在这两种情况下,我都没有提供基地址。

现在我的问题是,如果我不提供地址,那么 elf 文件如何决定对正确的位置进行编程,并且在对一个图像进行编程后,如果我对另一个图像进行编程,那么它不会覆盖第一个图像吗? (因为在这两种情况下我们都没有给出地址,默认情况下它是 0x00000000)

通常此信息位于链接描述文件创建的 ELF 文件中。

作为 GNU binutils 的一部分,有一个名为 "readelf" 的工具,它显示有关 ELF 部分和 headers 的信息。不幸的是,这些工具过去常常有一个前缀,这取决于它的配置工具,很可能它会被称为 "arm-none-readelf"。如果没有,请查看 http://www.yagarto.org/

因此,如果您键入 "arm-none-readelf main.elf -a",它应该显示如下内容:

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:                           YOUR ARCHITECTURE
  Version:                           0x1
  Entry point address:               YOUR ENTRY ADDRESS
  Start of program headers:          52 (bytes into file)
  Start of section headers:          YOUR SIZE
  Flags:                             0x300
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         36
  Size of section headers:           40 (bytes)
  Number of section headers:         55
  Section header string table index: 52

(请注意,这只是示例数据)。

通常在所有编译器中都有链接器选项,允许指定您的 ELF 的加载地址(过去称为 .ld 文件)。

希望对您有所帮助。