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

Ric*_*ard 5 linker gcc arm linker-scripts static-libraries

作为上一个问题的衍生(放置在静态库中时找不到 sbrk 函数):我正在为 stm32f407 微控制器创建一个裸机应用程序,它具有一个 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:

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

主文件:

无效_开始(无效){}

链接.ld:

内存{闪存(rx):原点= 0x08000000,长度= 1024K}

条目(_开始)

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

   .text : ALIGN(4)
   {
       *(.text .text.*)
   } >FLASH
Run Code Online (Sandbox Code Playgroud)

}

命令:

"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

Fre*_*edG 2

我在同类环境中遇到了这个问题(Fedora 上的arm-none-eabi-gcc-cs-5.2.0-3.fc23.x86_64、arm-none-eabi-binutils-cs-2.25-2.fc23.x86_64 23)。

链接器似乎不会尝试读取存档的内容,因为它已经拥有所需的所有符号。这可能是一种优化或错误。

强制读取存档中“已使用”符号的另一种解决方案是强制链接器 ld 将 __isr_vectors 视为未定义,并带有-u __isr_vectors.

作为 gcc 选项,-Xlinker -u -Xlinker __isr_vectors-Wl,-u,__isr_vectors.