2009-01-12 3 views
3

나는 C 코드 기반을 가지고 있으며 사용 된 모든 전역 변수를 프로그래밍 방식으로 식별해야합니다. 나는 gcc가 메모리 맵 파일을 생성하기 위해 만들 수 있다고 생각하지만 어떻게하면 이것이 어떤 변수가 전역인지를 알 수 있을지 모른다. 어떤 도움을 주시면 감사하겠습니다.C 코드베이스의 전역 변수 식별

건배

답변

6

nm을 사용하여 개체 파일에서 이러한 정보를 추출 할 수 있습니다. 위의

nm *.o | grep OBJT | grep GLOB 

편집 명령은 솔라리스 '나노 (SUNWbtool 패키지)입니다. 이식성, nm이 출력 형식을 선택할 수있는 매개 변수가 있습니다 : 당신이 dwarfdump을 가지고 바이너리가 DWARF 디버그 정보를 (제거하지 않음)이 포함 된 경우

nm -f [posix|bsd|sysv] *.o 
+0

값 OBJT 및 GLOB은 '내지'출력이 생성되지 않았다. 'nm'은 궁금한 점이 있다면 GNU 개발 도구입니다. 리눅스 dev에 사람 nm을 시도해보십시오. –

0

왜이 사실을 알아야합니까? 많은 목적을 위해 정적 데이터 (파일 또는 함수 범위에 상관없이)는 전역과 그룹화되어야합니다.

일반적으로 전역 변수는 링커 맵에 코드가 아닌 데이터로 표시됩니다. 스택 변수와 힙 할당 변수는 그렇지 않습니다. (물론 힙에 할당 된 데이터에 대한 포인터는 전역적일 수 있습니다. 이는 포인터와 포인터 사이의 C에서의 일반적인 구분입니다.)

1

출력 메모리 맵 출력 옵션은 링커 , gcc에서 얻으려면 gcc .... -Xlinker -M을 사용해야합니다.

이들을 얻는 또 다른 방법은 ctags 프로그램을 사용하는 것입니다. 사용 가능한 함수뿐만 아니라 사용 가능한 전역 변수에도 태그를 붙일 수 있으며 통계를 수집하지 않습니다. 이는 메모리 맵과 다릅니다. 모든 컴파일 작업이 필요 없기 때문에 gcc 접근보다 빠릅니다. (컴파일해야한다면 당연히 무료입니다.)

0

, 당신은

을 실행하여 .debug_pubnames DWARF 부분의 내용을 확인하실 수 있습니다

dwarfdump -p mybinary | awk '{print $2}'

줄마다 하나씩 글로벌 기호 이름이있는 줄 집합이 만들어집니다.