首页 > 解决方案 > 如何解决“_start”错误的多重定义?

问题描述

我正在做一个项目,我必须比较来自传感器的传入数据。主要源代码在 C++ 中,还有一个 C 源文件、一个 .S 文件和一个 .h 文件。当我尝试链接这些文件时,它会显示错误,并且我不知道错误是什么。任何有关该问题的帮助将不胜感激。

我的 Makefile 看起来像:

all : main.cpp irq.c irq.h bootstrap.S

riscv32-unknown-elf-gcc -c irq.c bootstrap.S -march=rv32g -mabi=ilp32d -nostartfiles -Wl,--no-relax 
riscv32-unknown-elf-g++  -c main.cpp -march=rv32g -mabi=ilp32d 
riscv32-unknown-elf-g++ -o main main.o irq.o bootstrap.o -march=rv32g -mabi=ilp32d

dump-elf: all
riscv32-unknown-elf-readelf -a main

dump-code: all
riscv32-unknown-elf-objdump -D main

dump-comment: all
objdump -s --section .comment main

clean:
rm -f main`

主文件

#include "stdint.h"
extern "C"{
#include "irq.h"
}
#include<stdio.h>
#include<iostream>

using namespace std;

static volatile char * const TERMINAL_ADDR = (char * const)0x20000000;
static volatile char * const SENSOR_INPUT_ADDR = (char * const)0x50000000;
static volatile uint32_t * const SENSOR_SCALER_REG_ADDR = (uint32_t * const)0x50000080;
static volatile uint32_t * const SENSOR_FILTER_REG_ADDR = (uint32_t * const)0x50000084;

bool has_sensor_data = 0;

void sensor_irq_handler() {
has_sensor_data = 1;
}

void dump_sensor_data() {
while (!has_sensor_data) {
    asm volatile ("wfi");
}
has_sensor_data = 0;

for (int i=0; i<64; ++i) {
    *TERMINAL_ADDR = *(SENSOR_INPUT_ADDR + i) % 92 + 32;
}
*TERMINAL_ADDR = '\n';  
}

int main() {
register_interrupt_handler(2, sensor_irq_handler);

*SENSOR_SCALER_REG_ADDR = 5;
*SENSOR_FILTER_REG_ADDR = 2;

for (int i=0; i<3; ++i)
    dump_sensor_data();

return 0;
}

irq.c

https://github.com/agra-uni-bremen/riscv-vp/blob/master/sw/simple-sensor/irq.c

中断

https://github.com/agra-uni-bremen/riscv-vp/blob/master/sw/simple-sensor/irq.h

引导程序

https://github.com/agra-uni-bremen/riscv-vp/blob/master/sw/simple-sensor/bootstrap.S

输出应该是带有中断的 64 个随机字符。

错误是:

/opt/riscv/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/bin/ld: /tmp/cckjuDlw.o: in function `.L0 ':
(.text+0x0): multiple definition of `_start'; /opt/riscv/lib/gcc/riscv32-unknown-elf/8.3.0/../../../../riscv32-unknown-elf/lib/crt0.o:(.text+0x0): first defined here

标签: c++c

解决方案


您正在使用该-nostartfiles选项,但在错误的位置。

您在编译步骤(-c选项)中拥有它,而它属于链接。

-Wl,选项也仅在链接时使用


推荐阅读