readelf, nm,objdump 도구 사용 요약
먼저 간단한 테스트 코드를 작성합니다.
$ 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' 가 있었는데, 이 기호가 이 모듈이 있는 파일의 코드 세그먼트에 정의되어 있음을 나타낸다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.