当前位置: 首页 > 知识库问答 >
问题:

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

司马彦
2023-03-14

作为前一个问题的副产品(放在静态库中时找不到sbrk函数):我正在为stm32f407微控制器创建一个裸机应用程序,它有一个ARM Cortex M4内核。我试图创建一个包含cmsis、HAL函数和中断向量表等基本内容的静态库,并将该静态库链接到我的主应用程序。然而,当中断向量表(这是一个名为__isr_vectors的变量)放在静态库中时,该变量无法通过链接存活。

我可以把发生的事情拼凑起来:链接器有一个主对象。o、 还有一些图书馆。它接受main中的所有符号。o,它会从main使用的库中取出所有符号。o或已被认为必要的其他符号使用。在这个阶段还不需要_isr_vectors变量,因为没有人明确引用这个变量,所以它会被链接器抛出。然后,链接器搜索所有名为的输入部分。isr_vector以创建输出部分。isr_矢量。然而,到目前为止,没有任何符号幸存下来,所以输出部分是空的,我的二进制文件没有中断表。

我知道一个让__isr_vector存活的技巧:在main. c中的伪函数中引用它。然而,这有点难看,而且容易出错(在针对相同的静态库构建新应用程序时,您可能会忘记这样做)。所以我的问题是:有没有其他方法让__isr_vector存活,这样我就可以在静态库中链接并完成它?

以下是重现问题的文件和步骤:

向量。c:

__属性_u((节(“.isr_向量”),使用)void*_isr_向量=0;

主要的c:

void _start(void){

链接劳工处:

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

条目(_start)

部分{.isr_向量:ALIGN(4){KEEP(*.isr_向量))}

   .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主站。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向量。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=fp4-sp-d16-mfloat abi=softfp-mthumb-Wl,--sections-nostartfiles-gl-gl-gl-gl,--Tlink。ld-Wl,-Map=test_链接器。没有图书馆。主地图。c、 obj向量。c、 obj-o测试链接器。没有图书馆。精灵

"C:\Program Files(x86)\GNU Tools ARM EmBedded\4.9 2014q4\bin\arm-none-eabi-ar.execqlibtest_linker.lib.vectors.c.obj

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

“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=fp4-sp-d16-mfloat abi=softfp-mthumb-Wl,--sections-nostartfiles-gl-gl-gl-gl,--Tlink。ld-Wl,-Map=test_链接器。图书馆。主地图。c、 obj-o测试链接器。图书馆。elf libtest_链接器。lib。A.

共有3个答案

秋博容
2023-03-14

这更多地是对发布的答案的后续:我建议您只需要将链接器脚本中的条目更改为:ENTRY(g_pfinvectors)。我认为这是较少的工作,并且不需要更改原始源文件。如果源文件中不存在g_pfinvectors,那么它就是我们文件中向量表本身的名称。根据需要修改。

公西星海
2023-03-14

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

链接器似乎没有尝试读取归档文件的内容,因为它已经拥有了所需的所有符号。这可能是一种优化或缺陷。

强制读取“已使用”符号的存档的另一种解决方案是,强制链接器ld将_isr_向量视为未定义向量,使用-u _isr_向量

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

康烨伟
2023-03-14

我对您的文件做了两个更改:

在链接器脚本中,我将条目

ENTRY(_start)

ENTRY(Reset_Handler)

以向量的形式。c我增加了这个功能:

void Reset_Handler(void) {
}

诀窍是Reset_Handler是翻译单元vectors. cwheras_start中的函数。

现在,当链接到Reset\u Handler时(由ENTRY强制执行),\u isr\u vectors似乎也被考虑在内!因此,似乎翻译单元中的另一个函数必须链接,才能“拖动”该变量。

为了完整性:

>

  • 通常Reset_Handler__isr_vectors中引用,并且Reset_Handler最终调用main(在您的情况下是_start)。所以这不仅仅是一个变通方法,您可能无论如何都需要它。

    我在编译命令中添加了-fdata节

  •  类似资料:
    • 问题内容: 我已经定义了一个对象并声明了一个静态变量。在该方法中,当我尝试打印实例和类变量时,两者都打印相同的值。 不是实例变量吗?它应该打印0而不是50吗? 问题答案: 不,只有一个变量-您尚未声明任何实例变量。 不幸的是,Java允许您访问静态成员,就像通过相关类型的引用访问静态成员一样。这是IMO的设计缺陷,某些IDE(例如Eclipse)允许您将其标记为警告或错误- 但这是语言的一部分。您

    • 静态变量 PHP中局部变量分配在zend_execute_data结构上,每次执行zend_op_array都会生成一个新的zend_execute_data,局部变量在执行之初分配,然后在执行结束时释放,这是局部变量的生命周期,而局部变量中有一种特殊的类型:静态变量,它们不会在函数执行完后释放,当程序执行离开函数域时静态变量的值被保留下来,下次执行时仍然可以使用之前的值。 PHP中的静态变量通过

    • 我不知道什么时候在程序中使用一个静态/非静态变量。 我理解非静态/静态变量之间的区别,但我只是不知道何时使用每一个变量。那么在上面的代码中,为什么函数不能是静态的呢?(什么时候应该是静态的?)

    • 问题内容: 我想知道静态变量(在类中)何时出现在图片中(初始化)?是在实例构造函数首次调用之后还是在类加载之后?什么时候加载类? 问题答案: 哦,那很复杂。这取决于是否设置了标志,而标志(在C#中)又取决于是否有静态构造函数。更糟的是;在.NET 4中, 我相信 行为发生了变化,使其比以前更加“懒惰”。 坦白说,我不会在此处编写任何特定行为的代码。简单:只要您使用常规代码访问静态字段,它们就会在尝

    • 问题内容: 我想要以下设置: 这在Java中可能吗?怎么样?如果可以避免的话,我宁愿不使用实例变量/方法。 谢谢! 编辑: 常量是数据库表的名称。每个子对象都是一个微型ORM。 问题答案: 您无法完全按照自己的意愿去做。也许可以接受的折衷方案是:

    • 问题内容: 在android中,推荐使用静态变量吗?例如,用Java实现Singleton模式,我通常这样做: 此外,Android JVM何时可以清除此漏洞? 问题答案: 字段会整体附加到实例,而实例又附加到加载了类的。整个回收时将被卸载。我确信这会在销毁该应用程序时发生(不是在它进入后台或暂停但完全关闭时发生)。 因此,只要你的应用程序运行,就可以将其视为生存。Singleton是个好主意吗?