问题描述
使用GCC 4.1.1进行MicroBlaze时有哪些问题?
解决/修复方法
MicroBlaze GDB
在调试EDK 9.1i或先前版本的编译器生成的二进制文件时,Xilinx建议您仅使用EDK 9.1i或以前版本的调试器。 EDK 9.2i调试器与旧的二进制文件不兼容。
MicroBlaze Binutils
– 新的C ++编译器创建名称为.sdata *。*的节。由BSB和EDK 8.2i及更早版本工具中的其他工具生成的链接器脚本没有针对此类节的节分配,因此,不能正确分配这些新节。您可以使用链接器脚本生成器重新生成链接器脚本,它们将包含所需的指令。
– mb-objdump -S不会在反汇编中混合源和汇编。您可以使用以下方法之一解决此问题:
– 从包含源的目录中调用mb-objdump。
– 使用-gstabs编译应用程序。但是,不建议使用此选项,因为它可能会影响调试。
MicroBlaze GCC
– 代码大小增加
由于转移到标准出口和atexit()机制,所有使用标准编译的程序都会增加固定的代码大小。此代码大小增加约800字节。这包括240字节的数据和约560字节的代码。
标准输入/输出库(STDIO)和malloc库的大小也在Newlib 1.14.0中增长。这种增加可能高达4千字节。如果您使用STDIO或动态分配例程(如getchar(),printf(),malloc()等),此更改将影响您的程序。
– 编译器为内置函数生成新警告,这些函数在没有包含适当头文件的情况下使用(例如,memcpy,printf)。要消除警告,必须将相应的头文件添加到包含列表中。这些警告符合FSF海湾合作委员会制定的标准。
– 根据C标准,GCC-4.1.1中删除了对广义左值的支持。以下类型的代码应更改如下:
从:
(char *)var =“STRING”;
至:
var =(char *)“STRING”;
– 使用新编译器,您无法链接旧库,反之亦然。旧的binutils在生成重定位记录时遇到了一些错误。其中一个影响了合并的部分。在新的编译器中,DWARF字符串部分是一个合并的部分,对它的引用变得乱码并显示为错误。生成重定位导致类似问题时可能存在其他错误。基本上,当将来自新编译器的代码与从旧编译器生成的库链接时,会发生这些错误。
– 无法在不指定链接描述文件的情况下使用-Ttext,-Tdata,-Tbss开关。只有在提供用户链接描述文件时才能使用这些开关。 SP1中的编译器将发出警告或错误。
MicroBlaze Newlib
– atexit()支持最多只能注册32个退出函数。这是为了防止不使用atexit()的程序中不必要的代码膨胀。此外,C标准只需要atexit()支持32个退出函数。
没有回复内容