NAME

c++filt - C++ 및 자바 심볼 디맹글하기

SYNOPSIS

c++filt [-_|--strip-underscore]
        [-n|--no-strip-underscore]
        [-p|--no-params]
        [-t|--types]
        [-i|--no-verbose]
        [-r|--no-recurse-limit]
        [-R|--recurse-limit]
        [-s format|--format=format]
        [--help]  [--version]  [symbol...]

DESCRIPTION

C++ 및 자바 언어에서는 함수 오버로딩이 가능한데, 같은 이름으로 함수를 여러 가지 작성해서 각 함수가 다른 타입의 매개변수들을 받게 할 수 있다는 뜻이다. 이런 같은 이름의 함수들을 구별할 수 있도록 하기 위해 C++과 자바에서는 함수 이름을 각 버전을 유일하게 구별해 주는 저수준 어셈블러 이름으로 변환한다. 이 동작을 맹글(mangle)이라고 한다. c++file [1] 프로그램은 반대 동작을 한다. 즉 저수준 이름을 사용자 수준 이름으로 해독, 즉 디맹글(demangle)해서 사용자가 읽을 수 있게 만들어 준다.

입력에서 (문자, 숫자, 밑줄, 달러, 마침표로 이뤄진) 모든 단어가 맹글된 이름 후보들이다. 이름이 C++ 이름으로 해독되면 그 C++ 이름이 출력에서 저수준 이름 대신 나오고, 아니면 원래 단어가 출력된다. 그래서 맹글된 이름들을 담은 어셈블러 소스 파일 전체를 c++filt에 통과시키면 디맹글된 이름을 담은 동일한 소스 파일을 볼 수 있다.

명령행에서 심볼 이름을 c++filt에 줘서 개별 심볼을 해독할 수도 있다.

c++filt <symbol>

symbol 인자가 주어지지 않으면 c++filt는 표준 입력에서 심볼 이름을 읽어 들인다. 그리고 모든 결과를 표준 출력으로 찍는다. 명령행에서 이름을 읽는 것이 표준 입력에서 이름을 읽는 것과 다른 점은 명령행 인자가 딱 맹글된 이름일 것이라고 기대해서 주변 텍스트와 구별하기 위한 검사를 수행하지 않는다는 점이다. 그래서 다음은 잘 동작하여 이름이 "f()"으로 디맹글되는 반면,

c++filt -n -Z1fv

다음은 제대로 되지 않는다. (맹글된 이름 끝에 추가로 붙어 있는 쉼표 때문에 유효하지 않은 이름이 된다.)

c++filt -n -Z1fv,

하지만 다음 명령은 잘 동작하게 된다.

echo _Z1fv, | c++filt -n

"f(),"가 표시된다. 즉 디맹글된 이름 다음에 마지막의 쉼표가 따라온다. 이런 동작 방식이 있는 이유는 표준 입력에서 이름을 읽을 때는 그 내용이 어셈블러 소스 파일의 일부일 수도 있다고 예상할 수 있으며, 그 경우 맹글된 이름 뒤에 이름과 상관없는 문자가 추가로 있을 수도 있기 때문이다. 예:

    .type   _Z1fv, @function

OPTIONS

-_
--strip-underscore
어떤 시스템에서는 C 컴파일러와 C++ 컴파일러 모두 모든 이름 앞에 밑줄을 넣는다. 예를 들어 C 이름 "foo"가 저수준 이름 "_foo"가 된다. 이 옵션은 그 앞쪽 밑줄을 없애게 한다. 지정하지 않았을 때 c++filt가 그 밑줄을 없애는지 여부는 타깃에 따라 다르다.
-n
--no-strip-underscore
앞쪽 밑줄을 없애지 않는다.
-p
--no-params
함수 이름을 디맹글할 때 함수 매개변수 타입을 표시하지 않는다.
-t
--types
함수 이름뿐 아니라 타입까지 디맹글하려 시도한다. 이 동작은 기본적으로 꺼져 있는데, 보통은 컴파일러 내부적으로만 맹글된 타입을 이용하는 데다가 맹글 안 된 이름과 혼동할 수 있기 때문이다. 예를 들어 "a"라는 함수를 맹글된 타입으로 해석하면 "signed char"로 디맹글된다.
-i
--no-verbose
디맹글된 출력에 구현 상세 정보를 포함시키지 않는다.
-r
-R
--recurse-limit
--no-recurse-limit
--recursion-limit
--no-recursion-limit

문자열 해독 중 수행하는 재귀 횟수에 대한 제한을 켜거나 끈다. 이름 해독 형식에서 무한 단계의 재귀가 가능하기 때문에 해독으로 인해 호스트 머신의 가용 스택 공간이 고갈돼서 메모리 폴트가 일어나도록 문자열을 만드는 게 가능하다. 제한 동작은 재귀 중첩을 2048단계로 제한해서 그런 일이 일어나지 않게 한다.

기본은 제한을 켜는 것이지만 정말로 복잡한 이름을 해독하기 위해선 끌 필요가 있을 수도 있다. 하지만 재귀 제한이 꺼져 있으면 스택 고갈이 가능하고, 그런 경우에 대한 버그 보고는 거부된다는 점에 유의하라.

-r 옵션은 --no-recurse-limit 옵션과 의미가 같다. -R 옵션은 --recurse-limit 옵션과 의미가 같다.

-s format
--format=format

c++filt는 여러 컴파일러들에서 쓰는 다양한 맹글 방식을 해독할 수 있다. 이 옵션 인자로 사용 방식을 선택한다.

"auto"
실행 파일에 따라서 자동 선택 (기본 방법)
"gnu"
GNU C++ 컴파일러(g++)에서 쓰는 방식
"lucid"
Lucid 컴파일러(lcc)에서 쓰는 방식
"arm"
C++ Annotated Reference Manual에서 명세한 방식
"hp"
HP 컴파일러(aCC)에서 쓰는 방식
"edg"
EDG 컴파일러에서 쓰는 방식
"gnu-v3"
GNU C++ 컴파일러(g++) V3 ABI에서 쓰는 방식
"java"
GNU 자바 컴파일러(gcj)에서 쓰는 방식
"gnat"
GNU Ada 컴파일러(GNAT)에서 쓰는 방식
--help
c++filt 옵션 요약 설명을 찍고 종료한다.
--version
c++filt의 버전 번호를 찍고 종료한다.
@file

file에서 명령행 옵션들을 읽는다. 읽어 들인 옵션들이 원래 @file 옵션 자리에 들어간다. file이 존재하지 않거나 읽을 수 없는 경우에는 이 옵션을 제거하지 않고 문자 그대로 다루게 된다.

file 내의 옵션들은 공백으로 구분한다. 옵션에 공백 문자를 포함시키려면 옵션 전체를 작은따옴표나 큰따옴표로 감싸면 된다. 문자 앞에 백슬래시를 붙이면 (백슬래시를 포함한) 어떤 문자든 집어넣을 수 있다. file 자체에 다시 @file 옵션이 있을 수 있다. 그러면 재귀적으로 처리가 이뤄진다.

FOOTNOTES

  1. MS-DOS에서는 파일 이름에 "+" 문자를 허용하지 않으므로 MS-DOS에서 이 프로그램의 이름은 CXXFILT이다.

SEE ALSO

info binutils 항목.

Copyright (c) 1991-2020 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".


2020-09-21

binutils-2.35.1