如何解决“ _start”错误的多个定义?

时间:2019-06-04 21:41:05

标签: c++ c

我正在一个项目中,我必须比较来自传感器的传入数据。主要源代码是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`

main.cpp

#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

irq.h

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

bootstrap.S

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

1 个答案:

答案 0 :(得分:2)

您使用的是-nostartfiles选项,但位置错误。

它属于链接时,位于编译步骤(-c选项)上。

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