readelf 명령으로 ELF파일의 각종 정보 보기

: readelf 명령은 EFL 파일의 각종 정보를 보기 위한 명령이다. 사용 가능한 옵션은 아래와 같다.

옵션 설명
-a 모든 정보를 출력
-h ELF 헤더 정보를 출력
-l 프로그램 헤더를 출력
-S 섹션 헤더를 출력
-e 모든 헤더를 출력
-s 심볼 테이블을 출력
-n note 섹션의 정보를 출력
-r 재배치 섹션의 정보를 출력
-d 동적 섹션의 정보를 출력

: 더 많은 정보를 원한다면, readelf --help 명령을 통해 알아보자.

'빌드&테스트도구 > 기타' 카테고리의 다른 글

nm - 심볼 테이블 확인  (0) 2020.09.22
gprof - 프로파일 정보 확인  (0) 2020.09.21
Mangling - 심볼명 확인  (0) 2020.09.20

nm으로 ELF 포맷의 심볼 테이블 보기

: 바이너리의 심볼을 볼 때 사용하는 명령어이다.
: nm {binary_file_name} 명령어로 사용한다. 그 결과는 아래와 같이 출력된다.

// Address    symbol_type   symbol_name
08044323 T func1 
...

: 두 번째 필드의 종류는 다음과 같다.

심볼 타입 명 설명
A 주소가 절대적이어서 변경되지 않는 심볼
B 심볼이 BSS 섹션에 존재(un-initialized global varible 등)
C 공통 심볼(un-initialized data)
D 심볼이 data 섹션에 위치(initialized global variable 등)
G 작은 공간의 전역 객체, data 섹션에 위치(initialized data 등)
I 심볼이 다른 심볼의 indirect
N 디버그 심볼
R Read-only 섹션에 존재
S 작은 객체를 위한 BSS 섹션의 심볼
T text 섹션에 있는 심볼(code)
U 정의되지 않은 심볼
V 확정적이지 않은 심볼, 링크 시 확정적인 심볼을 만나면 변경
W 확정적이지 않은 심볼, 링크 시 확정적인 심볼을 만나지 못하면 0으로 설정
- stabs 심볼
? 알수없는 심볼

: nm에서 사용할 수 있는 유용한 옵션은 다음과 같다.

옵션 설명
-a 디버깅 심볼까지 포함해 모든 심볼 출력
-D 동적 심볼만 출력(공유 라이브러리의 심볼 등)
-g 외부 심볼만 출력
-v 주소로 출력 정렬
-s 정적 라이브러리의 심볼 출력 시, 어떤 오브젝트 파일에 존재하는 지 출력
-u 정의되지 않은 심볼만 출력

'빌드&테스트도구 > 기타' 카테고리의 다른 글

readelf - ELF파일 정보 보기  (0) 2020.09.23
gprof - 프로파일 정보 확인  (0) 2020.09.21
Mangling - 심볼명 확인  (0) 2020.09.20

gprof로 프로파일 정보 확인

: 프로파일 정보는 바이너리가 수행될 때 생성되는 정보로, 어떤 함수가 몇 번 호출되었고 이 함수의 수행 시간은 얼마나 걸렸는지 등을 알려준다. 이러한 프로파일 정보를 보기 위해서는 컴파일 시 -pg 옵션을 사용해야하고, 이는 실행 바이너리 파일에 프로파일 정보를 출력하는 코드를 집어넣고 실행파일을 실행한 후에 gmon.out이라는 파일을 생성한다. grpof는 이 gmon.out이라는 파일을 이용해 프로파일 정보를 얻을 수 있다.

// main.c
#include <stdio.h>

void func1()
{
    printf("Hello World \n");
}

void func2(int delay)
{
    printf("Delay: %d", delay);

    while (delay--);
}

int main()
{
    for (int i = 0; i < 10; ++i) {
        func1();
    }

    for (int i = 0; i < 100; ++i) {
        func2(i);
    }

    return 0;
}

위와 같은 소스가 있다고 하자. gprof를 통해 프로파일 정보를 알아보는 절차는 다음과 같다.

  1. gcc -pg -g -o main main.c: 명령으로 컴파일을 수행하고 main 명령을 몇 차례 수행함으로써 프로그램을 실행한다.
  2. gprof -b ./main > main.profile: 이 명령으로 main.profile 파일에 프로파일 정보를 저장한다. -b 옵션은 각 필드에 대한 자세한 설명을 제거하는 옵션이다.

'빌드&테스트도구 > 기타' 카테고리의 다른 글

readelf - ELF파일 정보 보기  (0) 2020.09.23
nm - 심볼 테이블 확인  (0) 2020.09.22
Mangling - 심볼명 확인  (0) 2020.09.20

c++filt 명령으로 맹글링되기 전의 C++/JAVA 심볼명 보기

NOTE
맹글링(mangling)이란 C++, JAVA와 같은 객체지향 언어에서 함수명을 클래스명과 인자 타입으로 변경하는 것을 말한다.
class Config {
public : 
    int OptionCheck(char *flag);
    int LineParse(char *line);
};

위와 같은 클래스가 존재할 때 각각의 멤버 메소드는

Config::OptionCheck(char*)  ==>  _ZN6Config11OptionCheckEPc
Config::LineParse(char*)  ==>  _ZN6Config9LineParseEPc

와 같이 클래스명, 함수명, 인자 타입을 이용하여 컴파일러 내부적으로 심볼명이 변경된다. 이러한 데에는 메소드 오버로딩, 가상함수 등을 지원하기 위한 목적을 가지고 있다.

이를 위해 맹글링된 심볼명, 맹글링 된 심볼명을 이용해 원본(디맹글링된) 함수명을 알고싶으면 다음과 같이 사용하면 된다.

  • c++filt {de-mangling symbold_name}: 맹글링 된 심볼명을 이용해 디맹글링 함수명을 얻는다.
  • nm {binary_file} | grep _ZN: 바이너리 파일의 맹글링 된 심볼명들을 확인한다.

'빌드&테스트도구 > 기타' 카테고리의 다른 글

readelf - ELF파일 정보 보기  (0) 2020.09.23
nm - 심볼 테이블 확인  (0) 2020.09.22
gprof - 프로파일 정보 확인  (0) 2020.09.21

+ Recent posts