微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 WINdows 上使用 ld 链接 .o 文件时出错

如何解决在 WINdows 上使用 ld 链接 .o 文件时出错

@H_404_0@两个C文件编译后如下图:

@H_404_0@gcc -g -c -Wall -I../include blink.c -o blink.o

@H_404_0@gcc -g -c -Wall -I../include led/led.c -o led/led.o

@H_404_0@这些操作似乎成功了(生成了正确的文件)。

@H_404_0@尝试使用以下命令链接两个 .o 文件时:

@H_404_0@ld -Map blink.map -T make.ld -N -o blink.exe blink.o led/led.o

@H_404_0@返回此错误

@H_404_0@undefined reference to `__main'

@H_404_0@正如在另一篇文章中所建议的,我尝试添加 -r,但这反而导致了如下所示的错误

C:\mingw\bin\ld.exe: address 0x0 of blink.exe section `data' is not within region `ram'
C:\mingw\bin\ld.exe: address 0x0 of blink.exe section `bss' is not within region `ram'
C:\mingw\bin\ld.exe: address 0xd0 of blink.exe section `text' is not within region `ram'
C:\mingw\bin\ld.exe: address 0x28 of blink.exe section `.xdata' is not within region `ram'
C:\mingw\bin\ld.exe: address 0x30 of blink.exe section `.pdata' is not within region `ram'
C:\mingw\bin\ld.exe: address 0x40 of blink.exe section `.rdata$zzz' is not within region `ram'
@H_404_0@我使用的是 Windows 10,并且已经使用 Cygwin64 Terminal 和 MinGW 进行了尝试,但两者都得到了完全相同的结果。

@H_404_0@我相当确定这不是 RAM 问题,因为在 make.ld 文件中分配了“320K”(我认为对于像这样的简单程序来说应该足够了),如下所示:

ENTRY (main)

MEMORY
{
    ram : ORIGIN = 0x20000000,LENGTH = 320K /* 0x2000 0000 - 0x2004 FFFF */
    rom : ORIGIN = 0x08000000,LENGTH = 1024K /* 0x0800 0000 - 0x080F FFFF */
}

SECTIONS
{
    data :
    {
        _DataStart = . ;
        *(.data)
        _DataEnd   = . ;
    } >ram 

    bss :
    {
        _Bssstart = . ;
        *(.bss)
        _BssEnd   = . ;
    } >ram 

    text :
    {
        *(.text)
    } >ram 
}
@H_404_0@这里有其他三个文件供参考:

@H_404[email protected]

int main(void)
{
    ledInit();
    while (1)
    {
        ledToggle();
        delay_ms(500);
    }
    return 0;
}
@H_404_0@led/led.c

#include "../stm32f7/onChipperipherals.h"            

void ledInit(void)
{
    (*((uint32_t volatile *)(GPIO_A + GPIO_BSRR_OFFSET))) = 0xFFFF0000;
    (*((uint32_t volatile *)(GPIO_A + GPIO_MODER_OFFSET))) = 0x00000010;
}

void ledToggle(void)
{
    if ((*((uint32_t volatile *)(GPIO_A + GPIO_BSRR_OFFSET))) & 0x0000FFFF)
        (*((uint32_t volatile *)(GPIO_A + GPIO_BSRR_OFFSET))) = 0xFFFF0000;
    else
        (*((uint32_t volatile *)(GPIO_A + GPIO_BSRR_OFFSET))) = 0x0000FFFF;
}

void delay_ms(int milliseconds)
{
    long volatile cycles = (milliseconds * CYCLES_PER_MS);
    while (cycles != 0)
        cycles--;
}
@H_404_0@stm32f7/onChipperipherals.h

#include <stdint.h>

/* GPIO Registers */
#define GPIO_A                                     (*((uint32_t volatile *)0x40020000))

#define GPIO_MODER_OFFSET                          (0x00) // GPIO port mode register
#define GPIO_OTYPER_OFFSET                         (0x04) // GPIO port output type register
#define GPIO_OSPEEDR_OFFSET                        (0x08) // GPIO port output speed register
#define GPIO_PUPDR_OFFSET                          (0x0C) // GPIO port pull-up/pull-down register
#define GPIO_IDR_OFFSET                            (0x10) // GPIO port input data register
#define GPIO_ODR_OFFSET                            (0x14) // GPIO port output data register
#define GPIO_BSRR_OFFSET                           (0x18) // GPIO port bit set/reset register
#define GPIO_LCKR_OFFSET                           (0x1C) // GPIO port configuration lock register
#define GPIO_AFRL_OFFSET                           (0x20) // GPIO alternate function low register
#define GPIO_AFRH_OFFSET                           (0x24) // GPIO alternate function high register
@H_404_0@对于下一步该做什么或尝试什么的任何建议或指导,我将不胜感激,因为我从这里开始有点卡住和不确定。

解决方法

为目标架构使用正确的工具链。 cygwin64 上不合格的 gcc 将尝试构建程序以在 cygwin 下的 x64 Windows 上运行。

错误是抱怨部分 ram;但真正的问题是使用了错误的工具链。正确的 gccgcc-arm-embedded -m cortex-m7。请注意,您需要使用 ld 命令进行相同的调整;我没有很好的来源,但通常遵循该模式,因此 ld 命令很可能是 ld-arm-embedded

我的正确 gcc 来源:https://github.com/libopencm3/libopencm3/issues/965

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