【发布时间】:2015-05-11 00:42:05
【问题描述】:
作为上一个问题 (sbrk function not found when placed in a static library) 的衍生问题:
我正在为具有 ARM Cortex M4 内核的 stm32f407 微控制器创建一个裸机应用程序。我正在尝试创建一个静态库,其中包含 cmsis、HAL 函数和中断向量表等基本内容,并将该静态库链接到我的主应用程序。但是,当中断向量表(一个名为__isr_vectors 的变量)被放置在静态库中时,该变量无法在链接中继续存在。
我可以把发生的事情拼凑起来:链接器有一个对象 main.o 和一些库。它获取在main.o 中找到的所有符号,并将所有符号从main.o 使用的库中或已被认为必要的其他符号使用的库中取出。在这个阶段还不需要__isr_vectors 变量,因为没有人明确引用这个变量,所以它被链接器抛出。然后,链接器搜索所有名为.isr_vector 的输入节以创建输出节.isr_vector。然而,到目前为止,没有任何符号存在,所以输出部分是空的,我的二进制文件没有中断表。
我知道让__isr_vector 生存的一个技巧:在main.c 的虚拟函数中引用它。但是,这有点丑陋且容易出错(在针对同一个静态库构建新应用程序时,您可能会忘记这样做)。所以这是我的问题:有没有另一种方法可以让__isr_vector 存活,这样我就可以在我的静态库中链接并完成它?
这些是重现问题的文件和步骤:
vectors.c:
__ 属性__ ((section(".isr_vector"), used)) void* __isr_vectors = 0;
main.c:
void _start(void) {}
链接.ld:
内存 { 闪存(rx):原点 = 0x08000000,长度 = 1024K }
ENTRY(_start)
部分 { .isr_vector:对齐(4) { 保持(*(.isr_vector)) } >闪光灯
.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 -ovectors.c.obj -cvectors.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.objvectors.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.avectors.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
【问题讨论】:
-
你有
--gc-sections。您是否尝试过__isr_vectors变量的used属性和/或链接器脚本中.isr_vector部分的KEEP语句? -
变量已经有
used属性,声明如下:__attribute__ ((section(".isr_vector"),used)) pHandler __isr_vectors[] =链接器文件已经有KEEP语句,看起来像这样:KEEP(*(.isr_vector))仍然抛出变量离开 -
我无法复制,它似乎对我有用。你能把所有东西(Makefile、启动、链接描述文件最小的主程序)放在一起并上传到某个地方吗?
-
我通过wetransfer上传了一个.rar文件:we.tl/xfVcTvHkkL。该文件包含一个 Compile.cmd,它发出 6 个命令,用于编译和链接两个版本。之后,您可以比较两个 .map 文件,发现其中一个缺少 __isr_vectors 变量。对于编译,我使用了此处的 GNU ARM 可执行文件:launchpad.net/gcc-arm-embedded/4.9/4.9-2014-q4-major。
-
当我尝试从该存档中提取文件时,只有 main.c 成功。 rar 不是免费的,所以我的 Linux 客户端可能太旧了。压缩文件?
标签: gcc linker arm static-libraries linker-scripts