这是我尝试在嵌入式 Linux 系统上运行的一些示例测试代码:
#include <iostream>
int main(int argc, char *argv[])
{
char c = 'A';
int i = 7;
std::cout << "Hello World from C++" << std::endl;
std::cout << "c=" << c << std::endl;
std::cout << "i=" << i << std::endl;
}
嵌入式系统是 Microblaze,它是运行在 Xilinx FPGA 上的 32 位 RISC 软核处理器。请不要因此而推迟,因为您的许多标准 Linux 知识仍然适用。处理器配置为带有 MMU 的 LSB,而我正在使用的 Linux 构建(PetaLinux,由 Xilinx 提供)也期望相同。我正在使用提供的 GNU 编译器;GCC 似乎正式支持 Microblaze。
我遇到的问题是,当 stdlib 需要与整数交互时,它会出现段错误。这是输出:
Hello World from C++
c=A
Segmentation fault
请注意,字符处理得很好。此代码的 C 等效项也可以正常工作:
#include <stdio.h>
int main(int argc, char *argv[])
{
char c = 'A';
int i = 7;
printf("Hello World from C\n");
printf("c=%c\n", c);
printf("i=%i\n", i);
return 0;
}
...
Hello World from C
c=A
i=7
这使我怀疑共享库存在问题libstdc++.so.6.0.20
。该库是由 Xilinx 提供的,所以它应该是正确的。该file
库的输出是:
libstdc++.so.6.0.20: ELF 32-bit LSB shared object, Xilinx MicroBlaze 32-bit RISC, version 1 (SYSV), dynamically linked, not stripped
我的二进制文件的file
输出是:
cpptest: ELF 32-bit LSB executable, Xilinx MicroBlaze 32-bit RISC, version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 2.6.32, stripped
我也尝试过使用-static
标志静态链接我的二进制文件,但结果是一样的。
这是我正在使用的最相关的编译器和链接器设置,但我尝试更改这些设置但无济于事。
CC=microblazeel-xilinx-linux-gnu-gcc
CXX=microblazeel-xilinx-linux-gnu-g++
CFLAGS= -O2 -fmessage-length=0 -fno-common -fno-builtin -Wall -feliminate-unused-debug-types
CPPFLAGS?=
CXXFLAGS= -O2 -fmessage-length=0 -fno-common -fno-builtin -Wall -feliminate-unused-debug-types
LDFLAGS=-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed
To compile:
@$(CCACHE) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(CFLAGS) $< -o "$@"
To link:
@$(CXX) $(RELOBJECTS) $(LDFLAGS) $(EXT_LIBS) -o $(RELBINARY)
请注意,它microblazeel
指的是 microblaze 编译器的 little endian 版本。
我非常想对此进行调试或至少查看一个 coredump,但是当发生段错误时似乎没有产生 coredump,并且gdb
在 Microblaze Linux 构建中没有可执行文件。也许我错过了什么?
感谢您花时间阅读本文。有什么想法吗?