gpt4 book ai didi

gcc - __isr_vectors 变量放置在静态库中时未找到

转载 作者:行者123 更新时间:2023-12-05 00:23:03 25 4
gpt4 key购买 nike

作为上一个问题 ( sbrk function not found when placed in a static library ) 的衍生:
我正在为 stm32f407 微 Controller 创建一个裸机应用程序,它有一个 ARM Cortex M4 内核。我正在尝试创建一个静态库,其中包含诸如 cmsis、HAL 函数和中断向量表之类的基本内容,并将该静态库链接到我的主应用程序。然而,当中断向量表(它是一个名为 __isr_vectors 的变量)被放置在静态库中时,该变量在链接中不存在。

我可以拼凑出会发生什么:链接器有一个对象 main.o 和一些库。它需要在 main.o 中找到的所有符号,并从 main.o 使用的库中取出所有符号或已被认为必要的其他符号使用。 __isr_vectors这个阶段还不需要变量,因为没有人显式引用这个变量,所以它被链接器抛出。然后,链接器搜索所有名为 .isr_vector 的输入节。为了创建输出部分 .isr_vector .然而,直到这一刻,没有符号幸存下来,所以输出部分留空,我的二进制文件没有中断表。

我知道一种获取 __isr_vector 的技巧生存:在 main.c 中的虚拟函数中引用它.但是,这有点丑陋且容易出错(在针对同一个静态库构建新应用程序时,您可能会忘记这样做)。所以这是我的问题:是否有另一种方法来制作 __isr_vector生存,这样我就可以在我的静态库中链接并完成它?

这些是重现问题的文件和步骤:

向量.c:

__ attribute__ ((section(".isr_vector"), used)) void* __isr_vectors = 0;



主文件:

void _start(void) {}



链接.ld:

MEMORY { FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K }

ENTRY(_start)

SECTIONS { .isr_vector : ALIGN(4) { KEEP(*(.isr_vector)) } >FLASH

   .text : ALIGN(4)
{
*(.text .text.*)
} >FLASH

}



命令:

"C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4\bin\arm-none-eabi-gcc.exe" -g -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mthumb -ffunction-sections -std=gnu11 -o main.c.obj -c main.c "C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4\bin\arm-none-eabi-gcc.exe" -g -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mthumb -ffunction-sections -std=gnu11 -o vectors.c.obj -c vectors.c

"C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4\bin\arm-none-eabi-gcc.exe" -g -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mthumb -ffunction-sections -std=gnu11 -g -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mthumb -Wl,--gc-sections -nostartfiles -Wl,-Tlink.ld -Wl,-Map=test_linker.without_library.map main.c.obj vectors.c.obj -o test_linker.without_library.elf

"C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4\bin\arm-none-eabi-ar.exe cq libtest_linker.lib.a vectors.c.obj

"C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4\bin\arm-none-eabi-ranlib.exe" libtest_linker.lib.a

"C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4\bin\arm-none-eabi-gcc.exe" -g -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mthumb -ffunction-sections -std=gnu11 -g -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mthumb -Wl,--gc-sections -nostartfiles -Wl,-Tlink.ld -Wl,-Map=test_linker.with_library.map main.c.obj -o test_linker.with_library.elf libtest_linker.lib.a

最佳答案

我对您的文件进行了两项更改:

在链接描述文件中,我更改了 ENTRY

ENTRY(_start)


ENTRY(Reset_Handler)

在vectors.c中我添加了这个函数:
void Reset_Handler(void) {
}

诀窍是 Reset_Handler是翻译单元中的一个函数 vectors.c关于 _start在别处。

现在当 Reset_Handler链接在(由 ENTRY 强制执行), __isr_vectors好像也可以考虑!因此,似乎必须链接该翻译单元中的另一个函数才能“拖动”该变量。

为了完整起见:
  • 通常是 Reset_Handler__isr_vectors 中引用, 和 Reset_Handler电话main最终(在您的情况下是 _start )。因此,这不仅仅是一种解决方法,无论如何您可能都需要它。
  • 我已添加 -fdata-sections到编译命令
  • 关于gcc - __isr_vectors 变量放置在静态库中时未找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28949121/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com