This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/processor-SDK-AM335X:由于内存部分中存在漏洞,ARM二进制应用程序非常大

Guru**** 2568565 points
Other Parts Discussed in Thread: AM3359, SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/595215/compiler-processor-sdk-am335x-arm-binary-application-huge-due-to-holes-in-memory-section

部件号:processor-SDK-AM335X
“Thread:AM3359SysBIOS”中讨论的其它部件

工具/软件:TI C/C++编译器

设置:

AM3359 ICEv2应用程序
编译器版本TI v 5.1 ................................................................11.
XDC 3.25 .4.88
SysBIOS 6.35 .4.50
工业SDK:1.1 0.4

大家好,我正在努力将 一些重要的SysBIOS部分(KNL和HWI API)从DDR移至SRAM,如本 Wiki链接(  附加的新链接器命令)中所述  

通过这些更改,app.out可以正常工作,大小为~3.3 MB ,我可以下载它并通过CCS+JTAG运行它。

但是,我需要使用 SD卡测试我的更改(客户的测试应用程序需要多次重置)。 运行后构建脚本时,最终的二进制文件是巨大的,关于1 GB ! 。

我一直在尝试不同的设置来剥离不必要的信息和调试信息,但大小基本相同。 下面是我尝试过的示例:

test1:arm-none-eabi-objcopy.exe -o binary -R .arm.exidx -R .arm.extab -R .debug_aranges -R .debug_info -R .debug_Abbrev -R debug_pubnames -R debug_aranges -R debug_pubtypes -R .debug_line -R .debug_frame -R .debug_str -R .debug_loc_app -R .debug -r .debug .debug范围-R .debug_app.debug .debug -r -r -r .debug .r.debug .r.debug app.bin

test2:arm-none-eabi-objcopy.exe -o binary --strip-all --strip-debug --strip-unneeded app.out app.bin

test3:arm-none-eabi-objcopy.exe -o二进制-j .init -j ti.Sysbios.family.arm.a8.muTableSection -j .KNL -j .hwi -j .SysBIOS -j .stack -j .bss -j .neardata -j rodata -j .cinit -j .args -j .vectra -j xdc.meta -j -j .text out -j app.bin -const .j

我在网上看到问题是内存部分之间的“孔”,在这种情况下是DDR和SRAM。  

向编译器专家提出的问题:

我有没有任何技巧可以用来钻出“洞”?

有没有可以尝试的objcopy配置?

-欢迎提出任何其他想法=)

e2e.ti.com/.../am335x.cmd

谢谢!

Paula

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    遗憾的是,您不能满足二进制文件的基本限制。  内存映射中的任何孔都填充零。  没有其他事情可以做。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Paula Carrillo 说:
    -欢迎任何其他想法=)[/QUOT]需要在SRAM中运行的SYS/BIOS功能需要在SRAM中获得运行地址,在DDR中获得加载地址。 这意味着二进制文件不必填充DDR和SRAM之间的"孔"。 将SYS/BIOS功能从DDR的装载地址复制到SRAM中的运行地址需要启动代码。

    我尝试修改AM437x IDK的SYS/BIOS程序。 在.cfg文件中添加了以下内容:

    /*将所有KNL API放在OCMCRAM中*/
    var KNL_SECT_NAME =".KNL:{__KNL_LOADDDR (.KNL);__KNL_START_=.;*.*(.text.ti_SysBIOS_KNL*);。 = ALIGN (4);__KNL_END__=.;}";
    
    Program.sectMap[knl_section_name]= new Program.SectionSpec ();
    Program.sectMap[knl_section_name].loadSegment ="EXT_RAM";
    Program.sectMap[knl_section_name].runSegment ="OCMCRAM";
    
    /*安装重置函数,该函数将.KNL部分从EXT_RAM (DDR3)的加载地址重定位到OCMCRAM */
    var Reset = xdc.useModule("xdc.runtime.Reset");
    Reset.Fxns.KNO.Fxns."[REET_CLUST_Fxns.CON.]" 

    添加了以下C代码:

    extern unsigned int __KNL_load__,__KNL_start__,__KNL_end__;
    
    xdc_void copy_kernel_functs (void)
    {
    无符号int * kl;
    无符号int * ks;
    unsigned int * ke;
    
    /*重新定位.KNL部分*/
    KL =&__KNL_LOCK__;
    KS =&__KNL_START__;
    Ke =&__KNL_END__;
    如果(KL != ks){
    同时(ks < ke){
    *ks =*KL;
    KL++;
    kS++;
    }
    }
    } 

    cfg更改将配置SYS/BIOS以在生成的链接程序脚本中创建.KNL部分,该链接程序脚本具有DDR中所需函数的加载地址和SRAM中的运行地址。 并注册一个名为 copy_kernel_functs()的启动函数,以将.KNL部分的内容从DDR复制到SRAM。 更改基于.data部分的处理方式。

    我测试了该示例在更改后仍使用CCS调试器运行,并检查 ti_SysBIOS_KNL*函数是否在SRAM中运行。 我没有检查二进制文件是否从SD卡运行,但生成的二进制文件大小是8.4348万  字节,这表明不包括DDR和SRAM之间的"孔"。

    需要更改内存区域的名称以匹配目标。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,切斯特,非常感谢你,这似乎正是我所需要的。 一个简短的问题,您在哪里添加了.c代码?。 我尝试了几个地方(main.c,cfg,linker cmd),但没有运气。

    再次感谢您的帮助,
    Paula
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Paula Carrillo 说:
    一个快速问题,您在哪里添加了您的.c代码?

    我在C源文件中添加了copy_kernel_funcs ()函数,该文件包含main()函数。 我附上了完整的示例供参考。 e2e.ti.com/.../clock_5F00_IDK_5F00_AM437X_5F00_CortexA.zip

    我试了几个地方(main.c,cfg,linker cmd),运气不好。[/QUOT]编译项目时是否遇到错误,或者程序运行时是否失败?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    切斯特,您好,我在编译时遇到错误。

    错误为:
    #1.0008万-D configPkg/linker.cmd找不到文件".KNL" APP  LINE 159 C/C++问题

    可能是因为我有一个附加的链接器命令文件链接到我的项目(我在第一篇文章中附加的文件),所以app.cfg  无法 添加 .KNL部分。 我会尝试几件事并告诉你。

    谢谢!

    Paula  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Chester,实际上之前的错误确实在抱怨以下app.cfg代码行中的"(")

    VAR KNL_SECT_NAME =".KNL:{__KNL_LOADDR_(.KNL);__KNL_START_=.;*.*(.text.ti_SysBIOS_KNL*);. =对齐(4);__KNL_END_=.;}";

    我不知道如何使其工作,所以我使用您的想法在DDR中加载KNL和HWI部分,并 从SRAM中运行它们,  在我的项目链接器命令中,如下所示:

    AM335x.cmd  


    /*将所有KNL和Hwi API放在SRAM_HI */中 knlhwi:{*.*(.text:*ti_SysBIOS_KNL*) *.*(.text:*ti_SysBIOS*_HWI_*) } 加载> DDR3,运行> SRAM_HI,对齐=0x4 load_start(__knlhwi_load__) run_start(__knlhwi_start__) 运行结束(__knlhwi_end__)

    在main.c中,我按照您的建议添加了复制函数:

    extern unsigned int __knlhwi_load__,__knlhwi_start__,__knlhwi_end__;
    
    xdc_void copy_kernel_hwi_funcs (void)
    {
    无符号int * kl;
    无符号int * ks;
    unsigned int * ke;
    /*重新定位.KNL部分*/
    kl =&__knlhwi_load__;
    ks =&__knlhwi_start__;
    Ke =&__knlhwi_end__;
    如果(KL != ks){
    同时(ks < ke){
    *ks =*KL;
    KL++;
    kS++;
    }
    }
    } 

    在我的app.cfg中,我留下了XDC "重置"功能的行:  

    /*安装重置功能,该功能将.knlhwi部分从EXT_RAM (DDR3)的加载地址重新定位到SRAM_HI */
    var Reset = xdc.useModule("xdc.runtime.Reset");
    Reset.Fxns[Reset.Fxns.length+]="&copy_kernel_hwi_functs";
    


    通过这些更改,KNL和HWI现在处于SRAM中,二进制SD没有孔,因此大小合适。
    感谢您的所有帮助,
    Paula

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Paula Carrillo 说:
    Hi Chester,实际上之前的错误确实在抱怨下面的app.cfg代码行中的“(”

    VAR KNL_SECT_NAME =".KNL:{__KNL_LOADDR_(.KNL);__KNL_START_=.;*.*(.text.ti_SysBIOS_KNL*);. =对齐(4);__KNL_END_=.;}";

    [/报价]问题是我没有正确阅读您的原始帖子;提到arm-none-eabi-objcopy.exe让我认为GCC ARM编译器正在使用中,而您确实说TI ARM编译器正在使用中。

    GCC和TI编译器对解释错误的部分使用不同的语法。 以上建议的.cfg代码行用于GCC编译器。