Gnu Make> $ *和$ *的含义

zix*_*ool 2 c x86 makefile gnu-make osdev

我偶然发现了一个看起来很奇怪的Makefile,我听不懂

这是那个Makefile

AS=as -32 -Iinclude
LD=ld -m elf_i386
CC=gcc -m32 -fno-pie -fno-stack-protector
CPP=gcc -E -nostdinc -Iinclude
CFLAGS=-W -nostdlib -Wno-long-long -I include -fomit-frame-pointer

.s.o:
    ${AS} -a $< -o $*.o >$*.map

all: boot setup

boot: boot.o
    ${LD} --oformat binary -N -e start -Ttext 0x0000 -o boot $<

setup: setup.o
    ${LD} --oformat binary -N -e start -Ttext 0x0000 -o setup $<

clean:
    rm -f boot setup *.o *.map
Run Code Online (Sandbox Code Playgroud)

我不明白的部分是

.s.o:
    ${AS} -a $< -o $*.o >$*.map
Run Code Online (Sandbox Code Playgroud)

.s.o在这种情况下的意义是什么,以及该$*.o >$*.map尝试做什么。

Mic*_*tch 7

.s.o:是为与旧版本的make兼容而存在的后缀规则。它与模式规则相同%.o : %.s$*是一个自动make变量,包含源文件名的基础(在本例中为不带扩展名的文件名.o)。

用于处理所生成的命令boot.s,以boot.o将是:

as -32 -Iinclude -a boot.s -o boot.o >boot.map 
Run Code Online (Sandbox Code Playgroud)

GNU Assembler(AS)选项-a生成一个列表文件到标准输出。* nix shell(通过>)将标准输出重定向到以结尾的文件名.map。此示例的最终结果是boot.s将其组装到一个名为的目标文件中,boot.o并将标准输出写入该文件中boot.map

注意:我个人将标准输出重定向到带有扩展名.lst而不是.map扩展名的文件名。