2012-12-02 2 views
2

그래서 저는 여기에 정말 이상한 점이 있습니다. 예를 들어컴파일 된 파일에서 모든 전역 변수 가져 오기 (linux). 정적에서 const를 분리하는 방법?

는 I 2 개의 .cpp 파일

const std::string DICTIONARY_DEFAULT = "blah"; 
const std::string ADDTODICTIONARY_DEFAULT = "blah"; 
const std::string BUTTONS = "blah"; 

을 함유하는 그 중 하나 및 두 조각이 전역 변수 부에

static int x1; 
static int NewY1, NewY2, NewX1, NewX2; 

와 두번째있다. 전역 정적 변수 (예 :)를 인쇄해야하지만 상수는 무시해야합니다. nm 출력에서는 절대적으로 동일하게 나타납니다 (모든 경우에 대해 b 유형, 초기화되지 않은 로컬 범위 기호를 의미 함). 리눅스 유틸리티 (grep, regexps 등등) 만 사용하여이 케이스를 자동으로 분리 할 수있는 방법이 있습니까?

+1

원본이있는 경우 왜 개체 파일에서 찾고 있습니까? –

+0

약 5k의 .cpp 파일이 있기 때문에 전역 Vars (const가 아님)를 모두 가져와야합니다. – user1866246

답변

1

짧은 답변 : 'objdump를 -x file.o'를 사용하여 심볼 테이블을 살펴보십시오 : 모든 경우

긴 대답에서 할 수있는 방법은 사실 없습니다. static 변수와 const 변수 모두 전역 변수가 .bss라는 섹션에 할당되어 있음을 알 수 있습니다. .rodata라는 섹션도 존재하며 일반적으로 const 데이터를 저장하는 데 사용됩니다. 불행히도, 귀하의 경우에 두 개의 const std :: string 객체를 선언하고 있습니다. 이러한 객체는 'main'함수가 실행되기 전에 생성자를 호출하여 초기화됩니다. 여전히 필드의 초기화는 런타임에 발생하므로 '논리적으로'const이며 실제 const가 아닙니다.

컴파일러는 다른 모든 전역 변수와 함께 .bss 섹션에 할당 할 수밖에 없습니다. 당신이 다음 줄을

const int willBeInRoData = 42; 

을 추가하면 당신은 그 기호가 .rodata 섹션에있을 것이라는 점을 것을을 발견 할 것이다 그리고 그것은 다른 세계의 정수 구별됩니다.

참고 : 질문이 정확히 같으므로 Try to find global variables from compiled files. The program can't distinguish constants from global variables.과 속아 넘어서십시오.

관련 문제