2013-07-16 4 views
0

프로그램 :잘못된 명령 ++

#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; 
} 

메이크 :

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 

내가 64 비트 리눅스에서 빌드합니다. pentinum (R) III cpu가있는 32 비트 Linux에서 실행될 때 불법적 인 지시가 있습니다.

불법 명령은 다음과 같다 : 어셈블러 덤프의

(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) 

끝.

이 문제를 해결하는 방법?

+0

내가'-Wa을 믿고, ''CFLAGS'에서는 쓸모가 없습니다.'CFLAGS = -g -Wall -m32 -mtune = pentiumiii' –

+0

/usr/local/gcc-4.6.2/bin/g++ -g -c -W -m32 -mno -sse -mtune = pentiumiii list_test.cpp list_test.cpp : 1 : 0 : 오류 : 잘못된 값 (pentiumiii) -mtune = 스위치 –

답변

2

명령어 movq %xmm0,0xc(%esp)Streaming SIMD Extensions (SSE) 명령어 세트의 일부입니다. 이론상 펜티엄 III는 SSE를 지원하지만 분명히 실행하려고하는 프로세서는 SSE를 지원하지 않습니다. -mno-sse 컴파일러 옵션을 사용하여 GCC에서 SSE 명령어 생성을 비활성화 할 수 있습니다. -march=pentium3을 사용해 펜티엄 III 이상과 호환되는 코드를 생성 할 수도 있습니다.

또한 printf 호출에는 버그가 있습니다. 형식 인수 (첫 번째 인수)로 상수가 아닌 문자열을 (거의) 전달해서는 안됩니다. 해당 문자열에 % 기호가 포함되어 있으면 정의되지 않은 동작이 발생합니다. 기껏해야이 작업이 중단되고 최악의 경우 보안 취약점이 발생할 수 있습니다. 당신은 C++을 사용하고 있기 때문에, 더 나은 아직

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

또는 전체 기능의 printf 가족과 함께 잠재적 인 문제를 방지 : 수정이 작업을 수행하는 것입니다

std::cout << str; // Optionally also do `<< std::flush' 
+0

try -ed는 -mno-sse 컴파일러 옵션을 사용했지만 작동하지 않습니다! -mcpu = pentium3을 사용하여 컴파일 할 수 없으므로 오류는 다음과 같습니다. g ++ : 경고 : '-mcpu ='는 더 이상 사용되지 않습니다. 대신에 '-mtune ='또는 '-march ='를 사용하십시오. list_test.cpp : 1 : 0 : 오류 : -mtune = switch에 대한 잘못된 값 (pentinumiii) –

+1

@JianZhang :'-mcpu = '. –

+0

특정 명령어는 실제로 소스 파일에서 생성 된 코드가 아니라 링크 된 라이브러리 중 하나에있을 수 있습니다. 이 경우 지원되지 않는 지침을 피하기 위해 적절한 옵션을 사용하여 전체 라이브러리를 다시 빌드해야합니다. 더 나은 아직, 그냥 이미 제대로 작동하는 라이브러리에있는 대상 시스템에서 빌드 할 ... – twalberg

1

프로세서에서 지원하지 않는 SSE 명령어처럼 보입니다. (펜티엄 3는 SSE를 지원하기로되어있다.)

코드를 -mno-sse으로 컴파일하여 도움이되는지보십시오.