在__user_perthread_libspace()中包含标头会导致未定义符号

时间:2018-07-19 07:15:21

标签: arm cmsis rtx

我有一个可执行文件utest.cpp

class Abc {
  int i;  
};

int main(int argc, const char** argv)
{
    Abc* bla = new Abc();
    return 0;
}

此可执行文件链接到库osa.libosa.lib包含RTXConfCM.c,其中包括标头RTX_CM_lib.h。此标头定义函数void *__user_perthread_libspace (void)

尝试链接时,链接器失败(RTX_CM4.libRTXConfCM.c的依赖项):

armlink --cpu=Cortex-M4.fp "RTX_CM4.lib" "osa.lib" ".\keilout\objects\utest.o" -o .\KeilOut\Objects\test.axf
Error: L6218E: Undefined symbol __rt_heap_descriptor (referred from malloc.o).
Error: L6218E: Undefined symbol __rt_new_handler_addr (referred from new.o).

当我从__user_perthread_libspace()中删除函数RTX_CM_lib.h并创建第二个版本osa-modified.lib时,链接器错误消失了:

armlink --cpu=Cortex-M4.fp "RTX_CM4.lib" "osa-modified.lib" ".\keilout\objects\utest.o" -o .\KeilOut\Objects\test.axf
Program Size: Code=6704 RO-data=324 RW-data=76 ZI-data=435948

我从原始rtxconfcm.o中提取了单个目标文件osa.lib并直接链接到该文件。与修改后的版本一样,我没有链接器错误:

armlink --cpu=Cortex-M4.fp "RTX_CM4.lib" "rtxconfcm.o" ".\keilout\objects\utest.o" -o .\KeilOut\Objects\test.axf
Program Size: Code=6704 RO-data=324 RW-data=76 ZI-data=435948

为什么链接只能用于目标文件,而不能用于包含目标文件的库?链接行为的区别在哪里?为什么符号__rt_heap_descriptor__rt_new_handler_addr受已定义的__user_perthread_libspace()和/或链接到.o / .lib的影响?

我已经找到了Why does armlink treat libraries differently to objects,但是找不到我所遇到的行为的解释。我的库仅包含一个文件,链接器始终会发现该文件。

我正在使用ARM Compiler 5.06更新4(内部版本422)

0 个答案:

没有答案