Nm
GNU nm은 오브젝트 파일 objfile의 심볼을 출력한다. 아규먼트로 어떤 오브젝트 파일도 사용하지 않으면 'a.out'을 가정한다.
Types
기호가 소문자일 경우 심볼은 로컬영역에 있고, 대문자이면 전역영역(External)에 있다.
- A
- 심볼 값이 절대적이여서, 더 링크를 해도 변경되지 않는다.
- B
- 심볼이 (BSS라 부르는) 초기화되지않은 자료 섹션에 저장된다.
- C
- 심볼이 공통 심볼이다. 공통 심볼은 초기화되지않은 자료이다. 링크시 같은 이름을 가진 여러 공통 심볼이 가능하다. 심볼이 어디에도 정의되지 않았다면 공통 심볼은 정의되지 않은 참조로 취급된다. 공통 심볼에 자세히 알려면, The GNU linker의 'Linker options'에서
--warn-common
옵션 설명을 참고하라.
- D
- 심볼이 초기화된 자료 섹션에 위치한다.
- G
- 심볼이 크기가 작은 객체를 위한 초기화된 자료 섹션에 위치한다. 몇몇 오브젝트 파일 형식은 (큰 전역 배열에 대응되는 전역 정수 변수와 같이) 작은 자료 객체를 더 효율적으로 접근할 수 있다.
- I
- 심볼은 다른 심볼로의 간접 참조이다. 이는 거의 사용되지 않는 a.out 오브젝트 파일 형식에서 대한 GNU 확장이다.
- N
- 심볼이 디버그 심볼이다.
- R
- 심볼이 읽기 전용 섹션에 있다.
- S
- 심볼이 작은 객체를 위한 초기화되지않은 자료 섹션에 있다.
- T
- 심볼이 텍스트 (text, 코드) 섹션에 있다.
- U
- 심볼이 정의되지 않았다.
- V
- 심볼은 약한 객체이다. 약한 객체가 정의된 심볼과 링크되면 오류없이 정의된 심볼이 사용된다. 정의되지않은 약한 심볼이 링크될 때 정의된 심볼이 없다면 오류없이 약한 심볼 값은 0이 된다.
- W
- 심볼은 명시적으로 약한 객체 심볼이라고 표시되지 않은 약한 심볼이다. 약한 객체가 정의된 심볼과 링크되면 오류없이 정의된 심볼이 사용된다. 정의되지않은 약한 심볼이 링크될 때 정의된 심볼이 없다면 오류없이 약한 심볼 값은 0이 된다.
- -
- 심볼은 a.out 오브젝트 파일에서 stabs 심볼이다. 이 경우 다음으로 출력되는 값은 stabs other 필드, stabs desc 필드, stab 타입이다. stabs 심볼은 디버깅 정보를 저장한다. The "stabs" debug format의 `Stabs Overview'을 참고하라. (역주; 이 문서는 GNU GDB 소스코드에 포함되있다.)
- ?
- 알 수 없거나 오브젝트 파일 형식에 의존하는 심볼 타입.
c++filt
C++ name mangling 때문에, 심볼 이름을 알아보기 힘들 것입니다. 이 경우, c++filt(1)라는 툴을 쓰면 쉽게 알아 볼 수 있습니다.
cinsk:~$ nm nm-ex.o | c++filt
0000001e T foo::work(int)
00000018 T foo::work()
00000006 T foo::foo()
00000000 T foo::foo()
00000012 T foo::~foo()
0000000c T foo::~foo()
Find symbol bash script
하위 디렉토리의 오브젝트파일(*.o
)을 찾아, 원하는 심볼을 찾는다.
#!/usr/bin/env bash
FIND_DIR=$1
FIND_SYMBOL=$2
if [[ -z $FIND_DIR || -z $FIND_SYMBOL ]]; then
echo 'find-symbol {dir} {symbol}'
exit 1
fi
OBJECT_FILES=`find $FIND_DIR -iname '*.o'`
for i in $OBJECT_FILES; do
find_result=`nm $i | c++filt | grep $FIND_SYMBOL`
if [[ ! -z $find_result ]]; then
echo "File: "$i
echo "Result: " $find_result
fi
done
See also
- GNU Binutils
- Nmae mangling
- gcc
- c++filt
- Cutter