当我尝试编译时出现此错误:boot.s:18: multiple definition of `_start';

如何解决当我尝试编译时出现此错误:boot.s:18: multiple definition of `_start';

我正在尝试为 raspberry pi 创建自己的操作系统,但是每当我尝试使用 ARM win32 交叉编译器使用 make 文件编译它时,我都会收到此错误:

c:/superpi/superpios/build/gcc-arm-none-eabi-10-2020-q4-major-win32/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: objects/boot.o: in function `_start':
C:\SuperPi\SuperPiOS\build/../src/kernel/boot.s:18: multiple definition of `_start'; objects/boot.o:C:\SuperPi\SuperPiOS\build/../src/kernel/boot.s:18: first defined here
collect2.exe: error: ld returned 1 exit status
make: *** [Makefile:54: build] Error 1

我尝试通过删除以下内容来修复它:.globl _start 但这似乎不起作用,它只是给了我另一个错误说:

gcc-arm-none-eabi-10-2020-q4-major-win32/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld.exe: warning: cannot find entry symbol _start; defaulting to 00008000

这是 boot.s 脚本:

.equ KERNEL_STACK_SIZE,4096
// To keep this in the first portion of the binary.

.section ".text.boot"
// Make _start global.

// Entry point for the kernel.
// r15 -> should begin execution at 0x8000.
// r0 -> 0x00000000
// r1 -> 0x00000C42
// r2 -> 0x00000100 - start of ATAGS
// preserve these registers as argument for kernel_main
.globl _start
_start:
    // This set of instructions sets 3 of the 4 cores to go to halt.
    // Model 1 only has 1 cpu and does not have this instruction,so don't include it if building for model 1
#ifndef MODEL_1
    mrc p15,#0,r1,c0,#5
    and r1,#3
    cmp r1,#0
    bne halt
#endif
    // Setup the stack.  Stack will be 32 KB above kernel image
    ldr sp,=__end
    mov r4,#(KERNEL_STACK_SIZE)
    add sp,sp,r4

    // Clear out bss.
    ldr r4,=__bss_start
    ldr r9,=__bss_end
    mov r5,#0
    mov r6,#0
    mov r7,#0
    mov r8,#0
    b       2f

1:
    // store multiple at r4.
    stmia r4!,{r5-r8}

// If we are still below bss_end,loop.
2:
    cmp r4,r9
    blo 1b

    // Call kernel_main
    mov r2,#0x100
    bl kernel_main
    b halt

// halt
halt:
    wfe
    b halt

哦,这是生成文件:

# Don't use normal gcc,use the arm cross compiler
TOOLCHAIN = ./gcc-arm-none-eabi-10-2020-q4-major-win32/bin/arm-none-eabi
CC = $(TOOLCHAIN)-gcc
OBJCOPY = $(TOOLCHAIN)-objcopy
GDB = $(TOOLCHAIN)-gdb


# Set any constants based on the raspberry pi model.  Version 1 has some differences to 2 and 3
ifeq ($(RASPI_MODEL),4)
    CPU = arm1176jzf-s
    DIRECTIVES = -D MODEL_4
    ARCHDIR = model4
else
    CPU = cortex-a7
    ARCHDIR = model2
endif

CFLAGS= -mcpu=$(CPU) -fpic -ffreestanding $(DIRECTIVES) -g
CXXFLAGS= -ggdb3 -O0
CSRCFLAGS= -O2 -Wall -Wextra
LFLAGS= -ffreestanding -O2 -nostdlib
ASMCFLAGS= -f elf32 -F dwarf -g -w+all
ASM= -s

# Location of the files
KER_SRC = ../src/kernel
KER_MENU_SRC = ../src/kernel/menu
KER_HEAD = ../include
COMMON_SRC = ../src/common
UI_IMAGES = ..images/ui
OBJ_DIR = objects
ASMSOURCES = $(wildcard $(KER_SRC)/*.s)
KERSOURCES = $(wildcard $(KER_SRC)/*.c)
#KERSOURCES = $(wildcard $(KER_SRC)/$(ARCHDIR)/*.c)
COMMONSOURCES = $(wildcard $(COMMON_SRC)/*.c)
KERSOURCESCPP = $(wildcard $(KER_SRC)/*.cpp)
#KERSOURCESCPP = $(wildcard $(KER_SRC)/$(ARCHDIR)/*.cpp)
#KERMENUSOURCESC = $(wildcard $(KER_MENU_SRC)/*.c)
#KERMENUSOURCESCPP = $(wildcard $(KER_MENU_SRC)/*.cpp)
UISOURCES = $(wildcard $(UI_IMAGES)/*.png)
OBJECTS = $(patsubst $(KER_SRC)/%.s,$(OBJ_DIR)/%.o,$(ASMSOURCES))
OBJECTS += $(patsubst $(KER_SRC)/%.s,$(ASMSOURCES))
OBJECTS += $(patsubst $(KER_SRC)/%.c,$(KERSOURCES))
OBJECTS += $(patsubst $(KER_SRC)/%.cpp,$(KERSOURCESCPP))
OBJECTS += $(patsubst $(COMMON_SRC)/%.c,$(COMMONSOURCES))
#OBJECTS += $(patsubst $(KER_MENU_SRC)/%.c,$(KERMENUSOURCESC))
#OBJECTS += $(patsubst $(KER_MENU_SRC)/%.cpp,$(KERMENUSOURCESCPP))
OBJECTS += $(patsubst $(UI_IMAGES)/%.png,$(UISOURCES))
HEADERS = $(wildcard $(KER_HEAD)/*.h)

IMG_NAME=SuperPiOS

build: $(OBJECTS) $(HEADERS)
    $(CC) -T linker.ld -o $(IMG_NAME).elf $(LFLAGS) $(OBJECTS)
    $(OBJCOPY) $(IMG_NAME).elf -O binary $(IMG_NAME).img

$(OBJ_DIR)/%.o: $(KER_SRC)/%.s
    mkdir -p $(@D)
    $(CC) $(CFLAGS) -I$(KER_SRC) -c $< -o $@

$(OBJ_DIR)/%.o: $(KER_SRC)/%.c
    mkdir -p $(@D)
    $(CC) $(CFLAGS) -I$(KER_SRC) -I$(KER_HEAD) -c $< -o $@ $(CSRCFLAGS)

$(OBJ_DIR)/%.o: $(KER_SRC)/$(ARCHDIR)/%.c
    mkdir -p $(@D)
    $(CC) $(CFLAGS) -I$(KER_SRC) -I$(KER_HEAD) -c $< -o $@ $(CSRCFLAGS)

$(OBJ_DIR)/%.o: $(KER_SRC)/%.cpp
    mkdir -p $(@D)
    $(CC) $(CXXFLAGS) -I$(KER_SRC) -I$(KER_HEAD) -c $< -o $@ $(CSRCFLAGS)

$(OBJ_DIR)/%.o: $(KER_SRC)/$(ARCHDIR)/%.cpp
    mkdir -p $(@D)
    $(CC) $(CXXFLAGS) -I$(KER_SRC) -I$(KER_HEAD) -c $< -o $@ $(CSRCFLAGS)

$(OBJ_DIR)/%.o: $(COMMON_SRC)/%.c
    mkdir -p $(@D)
    $(CC) $(CFLAGS) -I$(KER_SRC) -I$(KER_HEAD) -c $< -o $@ $(CSRCFLAGS)

#$(OBJ_DIR)/%.o: $(KER_MENU_SRC)/%.c
#   mkdir -p $(@D)
#   $(CC) $(CFLAGS) -I$(KER_SRC) -I$(KER_HEAD) -c $< -o $@ $(CSRCFLAGS)

#$(OBJ_DIR)/%.o: $(KER_MENU_SRC)/%.cpp
#   mkdir -p $(@D)
#   $(CC) $(CXXFLAGS) -I$(KER_SRC) -I$(KER_HEAD) -c $< -o $@ $(CSRCFLAGS)

clean:
    rm -rf $(OBJ_DIR)
    rm $(IMG_NAME).elf
    rm $(IMG_NAME).img

run: build
    qemu-system-arm -m 128 -no-reboot -M raspi4 -serial stdio -kernel kernel.elf

dbg:
    $(GDB) kernel.elf
dbgrun: build gdbinit
    qemu-system-arm -m 128 -no-reboot -M raspi4 -serial stdio -kernel kernel.elf -S -s

.PHONY: gdbinit
gdbinit:
    echo "target remote localhost:1234" > .gdbinit
    echo "break kernel_main" >> .gdbinit

解决方法

所以问题是我已经链接了两次 asm 文件,所以我注释掉了第二个 之前:

OBJECTS = $(patsubst $(KER_SRC)/%.s,$(OBJ_DIR)/%.o,$(ASMSOURCES))
OBJECTS += $(patsubst $(KER_SRC)/%.s,$(ASMSOURCES))

之后:

OBJECTS = $(patsubst $(KER_SRC)/%.s,$(ASMSOURCES))
#OBJECTS += $(patsubst $(KER_SRC)/%.s,$(ASMSOURCES))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res