自动化标准Makefile与lds

makefile的自动化,需要使用变量,以及自动变量。
实行命令行与参数的分离。

命令行只与变量打交道,而变量则携带不同的参数,这样,通过修改变量,命令的执行结果不同。
可以简单理解为,命令行是个函数,变量则是传递给函数的参数列表。
对参数列表的不同赋值,调用函数,返回的结果是不同的。

++++++++++++++++++++++++++++++++
objs变量。
用于收集所需的依赖目标,常见的是收集.o文件。

objs = start.o main.o 

ledc.bin : $(objs)

主目标。
BIN文件,依赖于一个O文件列表,这个O文件列表,由一个变量,即objs来收集。

CROSS = arm-linux-gnueabihf
ledc.bin : $(objs)
	$(CROSS)-ld -Timx6u.lds $^ -o ledc.elf 
	$(CROSS)-objcopy -O binary -S ledc.elf $@
	$(CROSS)-objdump -D -m arm ledc.elf > ledc.dis

GCC工具的前缀,由一个变量,即CROSS来描述。如果需要用不同的GCC工具,则只需要修改变量即可,不需要动命令行。
这里面用到了自动化变量。
自动化变量,是make的解析工具解析出的字符串。
解析工具的输入源,是当前所处的规则的目标集,包括当前目标和依赖目标集。
$@,是当前目标集,上述例子里,当前目标集只有一个元素,它是ledc.bin这个目标。
$^,是依赖目标集中的所有目标。即全依赖集,all depend obj

另外,还有一些,如
$<,是依赖目标集中的首元,
$?,是依赖目标集的子集,它表示较新依赖目标集,全依赖集中,所有比当前目标较新的依赖目标,都收集到这个依赖目标集中去。

+++++++++++++++++++++++++++++
通配规则。
通配符%,
遍历展开成多个规则。

%.o : %.c
	$(CROSS)-gcc -Wall -nostdlib -c  -O2 -o $@ $<
%.o : %.S
	$(CROSS)-gcc -Wall -nostdlib -c  -O2 -o $@ $<

make工具,遍历检查依赖目标集,
如果发现某个目标,其表达式符合后缀为.o这个特征,且其名称,有对应的后缀为.c的文件,则为其生成一个对应的规则。
如果发现某个目标,其表达式符合后缀为.o这个特征,且其名称,有对应的后缀为.S的文件,则为其生成一个对应的规则。

++++++++++++++++++++++++++++++++++++++
清除clean。

clean:
	rm -rf *.o ledc.bin ledc.elf ledc.dis

+++++++++++++++++++++++++++++++++++++
链接脚本LDS。

SECTIONS{
    . = 0x87800000;
    .text :
    {
        start.o
        *(.text)
    }
    .rodata ALIGN(4) : {*(.rodata*)}
    .data ALIGN(4) : {*(.data)}
    __bss_start=.;
    .bss ALIGN(4) : {*(.bss) *(COMMON)}
    __bss_end=.;
}

"."表示current address counter。默认初始值是0。可以被赋值,也可以赋值给其他Label。
随着描述块的使用,CAC会自动向前计数。
LDS中,赋值语句,用分号结束。
上例中,
首先对CAC赋值,使其偏移到0x87800000地址上。
然后,描述了一个从该地址开始部署的代码段。
.text : {}
用冒号分隔,前面是section的命名,后面用花括号,详细描述section内部的布局部署。
上例中,
指定了从start.o中抽取.text段,作为首元使用。

相关推荐

  1. 自动化标准Makefilelds

    2024-04-03 06:50:01       40 阅读
  2. 【Linux】项目自动化构建工具 - make/Makefile

    2024-04-03 06:50:01       65 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-03 06:50:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-03 06:50:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-03 06:50:01       87 阅读
  4. Python语言-面向对象

    2024-04-03 06:50:01       96 阅读

热门阅读

  1. ActiViz中的数据集vtkPolyData

    2024-04-03 06:50:01       50 阅读
  2. 数据库设计规范(三大范式)

    2024-04-03 06:50:01       41 阅读
  3. 第八章:k8s如何使用 Service 暴露你的应用

    2024-04-03 06:50:01       37 阅读
  4. 【Vue】创建vue3项目

    2024-04-03 06:50:01       44 阅读
  5. Python可视化概率统计和聚类学习分析生物指纹

    2024-04-03 06:50:01       45 阅读
  6. LeetCode //C - 1146. Snapshot Array

    2024-04-03 06:50:01       46 阅读