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尝试做什么。
.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扩展名的文件名。