0

program:

#include <stdio.h>
#include <sstream>
int main()
{
    std::stringstream ss;
    ss << "hello world " << 1234 << "\n";
    std::string str = ss.str();
    printf(str.c_str());
    return 0;
}

makefile:

CC=/usr/local/gcc-4.6.2/bin/g++
CFLAGS=-g -c -W -m32 -Wa,-mtune=pentiumiii
LINKFLAGS=-m32 -static-libgcc -static-libstdc++ -Wl,-rpath,./runtime,--dynamic-linker,./runtime/ld-linux.so.2
all:test
test: list_test.o
    $(CC) $(LINKFLAGS) list_test.o -o test 

list_test.o: list_test.cpp
    $(CC) $(CFLAGS) list_test.cpp

clean:
     rm *.o ./test -f

I build it in 64-bit linux. there is an illegal instruction when it run in 32-bit linux with pentinum(R) III cpu.

the illegal instruction is as follow:

(gdb) disas 0x0804f77a 0x0804f77b
Dump of assembler code from 0x804f77a to 0x804f77b:
0x0804f77a <std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::_M_sync(std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::char_type*, std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::__size_type, std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::__size_type)+138>:     movq   %xmm0,0xc(%esp)

End of assembler dump.

How to resolve this problem?

4

2 回答 2

2

该指令movq %xmm0,0xc(%esp)流 SIMD 扩展 (SSE)指令集的一部分。Pentium III 理论上支持 SSE,但您尝试运行它的处理器显然不支持。-mno-sse您可以使用编译器选项在 GCC 上禁用 SSE 指令的生成。您还可以尝试-march=pentium3生成与 Pentium III 及更高版本兼容的代码。

此外,您的printf调用有一个错误——您应该(几乎)永远不要将非常量字符串作为格式参数(第一个参数)传递。如果该字符串恰好包含任何%符号,那将导致未定义的行为。在最好的情况下,这会崩溃,在最坏的情况下,您可能会遇到一个无声的安全漏洞。解决方法是这样做:

printf("%s", str.c_str());

或者更好的是,完全避免函数族的潜在问题printf,因为您使用的是 C++:

std::cout << str;  // Optionally also do `<< std::flush'
于 2013-07-16T04:16:36.550 回答
1

它看起来像一条 SSE 指令,处理器显然不支持它。(虽然 Pentium 3 应该支持 SSE)。

您可以尝试编译您的代码,-mno-sse看看是否有帮助。

于 2013-07-16T04:09:22.367 回答