readelf, nm,objdump 도구 사용 요약

2661 단어
어떤 코드가 일부 인터페이스를 호출했는지 검사해야 할 때가 있지만, 자주 발생하는 문제는 일부 모듈은 실제로는 코드를 볼 수 없고 라이브러리 파일만 볼 수 있다는 것이다.이 경우 GNU 도구를 사용하여 확인할 수 있습니다.
먼저 간단한 테스트 코드를 작성합니다.
$ cat PCString.h
#ifndef __PCSTRING_H__
#define __PCSTRING_H__
class PCString 
{
public:
	static bool Copy(const char *from, char *to, int size);
};
#endif //__PCSTRING_H__
$ cat PCString.cpp 
#include "PCString.h"

bool PCString::Copy(const char *from, char *to, int size)
{
}
g++ -g -c PCString.cpp  -o PCString.o
ar -rsv libPCString.a PCString.o 
$ cat test2.cpp 
#include "PCString.h"

void fun(void)
{
	char test[10];
	PCString::Copy("AAAA", test, 10);
}
g++ test2.cpp -g -c -o test.o
ar -rsv libTest.a test.o 

만약 PCstring::Copy () 가 호출되었는지 확인해야 하는데 테스트 2.cpp 파일, libTest만 볼 수 있습니다.a.
1)readelf:
4
~$ readelf  -s  libTest.a  | grep PCString 
    16: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND _ZN8PCString4CopyEPKcPci
이 기호는 사실상 수식된 것으로 직관적이지 않아 한층 더 처리할 수 있다.
$ readelf  -s  libTest.a  | grep PCString | c++filt 
    16: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND PCString::Copy(char const*, char*, int)

2) nm:
$ nm -A -C libTest.a | grep PCString
libTest.a:test.o:         U PCString::Copy(char const*, char*, int)

3) 라이브러리 파일이 debug 버전이면 (원본 코드를 역집성할 수도 있고,objdump:
$ objdump  -C -S libTest.a  | grep PCString
#include "PCString.h"
	PCString::Copy("AAAA", test, 10);

또한 이 도구들은 어떤 모듈이 외부에서 사용할 수 있는 기호를 정의하는지 조회할 수 있다.
예를 들면 다음과 같습니다.
~$ nm -A -C libPCString.a 
libPCString.a:PCString.o:00000000 T PCString::Copy(char const*, char*, int)
$ readelf  -s  libPCString.a  | grep PCString | c++filt 
File: libPCString.a(PCString.o)
     1: 00000000     0 FILE    LOCAL  DEFAULT  ABS PCString.cpp
    14: 00000000     5 FUNC    GLOBAL DEFAULT    1 PCString::Copy(char const*, char*, int)
$ objdump  -C -S libPCString.a  | grep PCString
In archive libPCString.a:
PCString.o:     file format elf32-i386
00000000 <PCString::Copy(char const*, char*, int)>:
#include "PCString.h"
bool PCString::Copy(const char *from, char *to, int size)

외부 기호를 참조하는 경우 기호 앞에 정의되지 않음을 나타내는 "U"가 나타납니다.만약 이 모듈이 정의한 기호라면, 이전에 'T' 가 있었는데, 이 기호가 이 모듈이 있는 파일의 코드 세그먼트에 정의되어 있음을 나타낸다.

좋은 웹페이지 즐겨찾기