以前在学ld的script时两个比较重要的概念,即指定一个输出section的lma和vma(分别是load memory address和virtual memory address),vma的作用是很明显地,就是决定run time address嘛,但lma有什么用呢?恩,对运行在linux这样的操作系统上面的应用程序来说,是没什么用的,毕竟应用程序都是被'load'到虚拟地址空间中。但是在嵌入式底层firmware, bootloader开发来说,这个关键字不再打酱油。
看下面这么一段代码,汇编:
简单得不能再简单了,定义了两个段,.text和.data,.text里面就一条指令,.data里面也只有一个字。
先编译成可重定向的.o目标文件:
接着用ld将其链接成可运行文件,这里其实只有一个目标文件参与链接,所以说链接其实是不对的,ld只是做做重定向或者叫定址的工作而已,外加在elf文件中产生描述文件的segment和section的信息等。
链接时首先提供一个最简单的ld script: