名字不能取太长 2023-03-05 01:54 采纳率: 78%
浏览 58
已结题

makefile编译存在问题

我在make编译的时候一个汇编文件boot.S报错,如下图所示,但是当我单独使用gcc命令编译却一切正常(同样的参数),请问这是怎么回事?如何解决?

img

makefile如下:

toolchain := riscv64-unknown-elf-

GCC := $(toolchain)gcc 
AS    := $(toolchain)as
LD  := $(toolchain)ld
OBJCOPY  :=$(toolchain)objcopy

COPS := -g -O0 -Wall -nostdlib -nostdinc -Iinclude -mcmodel=medany -fno-PIE -fomit-frame-pointer -Wno-builtin-declaration-mismatch -ggdb -g

all: system
    $(OBJCOPY)  -O binary system kernel.bin

system:    ./kernel/main.o ./kernel/boot.o ./kernel/urat.o
    $(LD) -z muldefs -T ./kernel/linker.ld -o system ./kernel/main.o ./kernel/boot.o ./kernel/urat.o

main.o: ./kernel/main.c
    $(GCC) $(COPS) -c ./kernel/main.c

boot.o: ./kernel/boot.S
    $(GCC) $(COPS) -c ./kernel/boot.S 

urat.o: ./kernel/urat.c
    $(GCC) $(COPS) -c ./kernel/urat.c

clean:
    rm -rf ./kernel/*.o
    rm -rf system kernel.bin

  • 写回答

4条回答 默认 最新

  • 极客智能体-在线 2023-03-07 00:24
    关注

    以下答案由GPT-3.5大模型与博主波罗歌共同编写:
    根据错误提示信息可以看出,make 编译时出现了以下错误:

    ./kernel/boot.S: Assembler messages:
    ./kernel/boot.S:7: Error: illegal instruction
    

    但是当使用 gcc 命令单独编译时却没有这个问题。这很可能是因为 makegcc 在编译时的参数不同导致的。

    在你的 Makefile 中,boot.o 的编译语句为:

    $(GCC) $(COPS) -c ./kernel/boot.S
    

    其中,$(COPS) 包含了一些编译参数,可能是这些参数导致了问题。建议一步一步进行调试。

    可以先将 -c 参数去掉,将 boot.S 编译为汇编文件,如下所示:

    $(AS) -o ./kernel/boot.o ./kernel/boot.S
    

    如果这一步没有问题,可以加上 -v 参数来查看 gcc 在编译时默认使用的参数,再与 $(COPS) 中的参数进行比对,看看是否有冲突。

    最后,你可以尝试在 $(COPS) 中逐个排除参数,重新编译 boot.o 文件,找出导致问题的参数。

    以下是经过修改的 Makefile

    toolchain := riscv64-unknown-elf-
    
    GCC := $(toolchain)gcc 
    AS    := $(toolchain)as
    LD  := $(toolchain)ld
    OBJCOPY  :=$(toolchain)objcopy
    
    # COPS := -g -O0 -Wall -nostdlib -nostdinc -Iinclude -mcmodel=medany -fno-PIE -fomit-frame-pointer -Wno-builtin-declaration-mismatch -ggdb -g
    COPS := -g -O0 -Wall -mcmodel=medany -fno-PIE -fomit-frame-pointer 
    
    all: system
        $(OBJCOPY)  -O binary system kernel.bin
    
    system:    ./kernel/main.o ./kernel/boot.o ./kernel/urat.o
        $(LD) -z muldefs -T ./kernel/linker.ld -o system ./kernel/main.o ./kernel/boot.o ./kernel/urat.o
    
    main.o: ./kernel/main.c
        $(GCC) $(COPS) -c ./kernel/main.c
    
    boot.o: ./kernel/boot.S
        $(AS) -o ./kernel/boot.o ./kernel/boot.S 
    
    urat.o: ./kernel/urat.c
        $(GCC) $(COPS) -c ./kernel/urat.c
    
    clean:
        rm -rf ./kernel/*.o
        rm -rf system kernel.bin
    

    注意,我在 $(COPS) 中注释掉了 -nostdlib-nostdinc 参数,这两个参数会排除标准库和标准头文件,这对你的项目可能不是必须的。
    如果我的回答解决了您的问题,请采纳!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月8日
  • 已采纳回答 3月7日
  • 赞助了问题酬金15元 3月5日
  • 修改了问题 3月5日
  • 展开全部

悬赏问题

  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上