2011-11-07 2 views
0

컴파일러가 .rodata 섹션을 사용하지 않도록합니다.

char* str = "Hello"; 

을 .rodata에 넣지 않고 gcc가 강제로 gcc를 강제로 움직일 수있는 방법이 있습니까?

char str[] = "Hello!"; 

?


그래, 더 좋은 방법은 char str[] 명령문을 수정하는 것입니다. 모두에게 감사드립니다.

+1

.rodata를 지원하지 않는 대상에 대해 빌드 하시겠습니까? – Flexo

+2

첫 번째 줄은 실제로'const char * str = "Hello";' – Flexo

+1

을 읽어야합니다.하지만 더 중요한 것은 왜 이것을 포팅하고 표준화 된 방식으로 배제하고 싶습니까? – Flexo

답변

1
static char strbuf[] = "Hello"; 
char *str = strbuf; 
+0

원본 프로그램을 수정해야하는이 방법은 그저 원하지 않는 것입니다. – Dario

3

왜? 문자열 리터럴을 변경하려고하면 정의되지 않은 동작이 발생합니다. 그것은 악합니다. 이 프로그램을 고려 :

"hello"[0] = 'y'; // Welcome to Undefined Behavior Land. Enjoy yor stay! 
std::cout << "hello" << std::endl; // Could very will print "yello" now! 
+0

필자는 새로운 플랫폼과 더 많은 표준 준수 컴파일러에서 컴파일하기 위해 약 250 만 줄의 코드로 오래 살아있는 코드 기반을 변환하려고합니다. 나는 마침내 컴파일 & 링크를 얻었다. 내가 만난 첫 번째 충돌은 이전 컴파일러가 .data 세그먼트에 모든 것을 넣었다는 사실을 이용하기로 결정했기 때문입니다. 이 코드 유형은이 코드베이스에서 제거해야하지만 clang의 정적 분석기 및 기타 멋진 도구에서 발견 된 40,000 개가 넘는 문제 중 하나입니다. 이 기능을 일시적으로 사용 중지하면 이와 같은 프로젝트에 유용합니다. –

0

어떻게 플랫폼이있는 경우 strdup를 사용하거나 그렇지 않은 경우 직접 구현하는 방법에 대한?

char *str = strdup("hello world"); 

이 (런타임) 메모리를 할당하고 아주 합법적으로 작성하고 나중에 수정할 수있는 메모리의 적절한 크기의 덩어리로 리터럴 문자열을 복사합니다.

그래도 사용 후 free()을 잊지 마세요.

__attribute__ ((section ("my_section")))attribute을 사용하여 GCC가 특정 섹션에 일일이 입력하도록 할 수도 있지만, 원본 소스를 수정해야만 할 수 있습니다. "정상적인"방법.

관련 문제