12/23/2007

[BOOK] Binary Hacks 용어 정리

** Binary Hack 용어

- ABI(Application Binary Interface) : 애플리케이션이 지켜야 할 바이너리 레벨의 규약. 함수 호출시 스택 또는 레지스터 사용법, 심볼 name mangling 규칙 등이 정해져 있다. OS, 프로세서별로 규정되어 있다.

- API(Application Programming Interface) : 애플리케이션 프로그램에서 OS나 라이브러리의 기능을 이용하기 위한 함수, 데이터 구조 규약. API를 이용한 프로그래밍은 동일한 API를 지원하는 플랫폼 간 소스코드 호환성을 갖는다는 이점이 있다.

- BSS 세그먼트(Block Started by Symbol Segment) : 초기화되지 않은 데이터가 위치하는 세그멘트, C의 전역 변수로 int global; 과 같이 초기값이 지정되지 않은 데이터가 들어간다. 오브젝트 파일 내에서는 크기를 갖지 않고 프로그램 시작 시에 커널에 의해 0으로 초기화된다. ELF에서의 명칭은 .bss이다.

- DSO(Dynamic Shared Object) : GNU/리눅스에서는 동적 링크하는 공유 라이브러리를 DSO라고 한다. .so라는 확장자를 갖는다.

- DWARF(Debug With Arbitrary Record Format) : 디버그 정보를 저장하기 위한 데이터 형식. GNU/리눅스 + GCC 환경에서는 표준으로 사용되고 있다.

- ELF(Executable and Linking Format) : 실행 파일, 오브젝트 파일, 공유 라이브러리, 코어 파일에 사용되는 파일 형식 중 하나. GNU/리눅스, FreeBSD 등에서 사용되고 있다.

- GCC(GNU Compiler Collection) : GNU의 각종 컴파일러 모음. 원래는 GNU C Compiler를 의미했다. GNU C Compiler 를 나타낼 때는 gcc라고 표기한다.

- glibc(GNU C Library) : GNU의 C 라이브러리. GNU/리눅스나 Hurd 등의 OS에서 사용되고 있다.

- GNU(GNU's Not Unix) : 본래는 GNU 프로젝트가 개발되고 있는 OS를 일컬었으나, GNU 프로젝트 자체를 GNU로 부르는 경우가 많다.

- GNU/리눅스 : 리눅스 커널 기반의 시스템. GNU를 앞에 붙이는 이유는 커널 외의 컴포넌트를 개발하고 있는 GNU 프로젝트에 경의를 표하기 위함이다.

- GOT(Global Offset Table) : PIC를 실현하기 위해 필요한 데이터. PIC에서는 전역 데이터로의 접근을 GOT를 이용해 간접적으로 참조한다.

- LLP64 : long long과 포인터가 64비트인 환경. int와 long은 32비트. 64비트 윈도우에서는 LLP64.

- LP64 : long과 포인터가 64비트인 환경. int는 32비트. 64비트 리눅스에서는 LP64. 대부분의 유닉스 계열 OS에서는 LP64를 사용한다.

- PIC(Position Independent Code) : 임의의 주소에 로드 가능한 코드. 데이터 액세스나 점프는 상대 주소로 수행한다. 위치 독립 코드.

- PIE(Position Independent Executable) : 위치독립인 실행 파일. 최근의 GNU/리눅스에서 작성할 수 있다. 보안 향상 등의 장점이 있다.

- PLT(Procedure Linkage Table) : 동적 링크를 실현하기 위해 필요한 데이터. GOT와 함께 사용해서 동적 링크한 공유 라이브러리 함수를 간접적으로 호출할 수 있다.

- POSIX(Portable Operating System Interface for UNIX) : 시스템콜, 시그널과 같은 OS의 API를 규정하는 규약. 대부분의 유닉스 계열 OS는 POSIX를 기반으로 하고 있다(또는 POSIX 표준을 따르려 한다).

- SUS(Single UNIX Specification) : 유닉스로 불리는 OS를 위한 규격. 최신 버전인 SUSv3는 웹상에서 볼 수 있다. SUSv3는 POSIX를 포함하고 있다.

- TLS(Thread Local Storage) : 여러 스레드에서 동일한 이름의 변수를 사용하더라도 실제로는 각 스레드의 독립된 영역에 저장되는데, 이를 TLS라 한다. GCC에서는 __thread라는 키워드를 사용해서 TLS를 다룬다.

- prelink : 동적 링크를 빠르게 하기 위한 방법 중 하나. 실행 파일과 공유 라이브러리를 수정함으로써 동적 링크 시 발생하는 비용을 대부분 삭감한다. 많은 리눅스 배포판에 사용되고 있다.

- x86 : 인텔(Intel)사의 8086 계열의 프로세서를 약칭함. 80486 이후 펜티엄, Xeon 등의 제품명을 갖는다. IA-32라고도 한다.

- x86_32 : x86_64와 구별하기 위해 32비트의 x86 아키텍처를 x86_32로 표기하는 경우도 있다.

- x86_64 : AMD에서 설계한 x86 상위호환의 64비트 프로세서 아키텍처. AMD64라고도 함. 인텔도 동일한 아키텍처를 채택하고 있다. EM64T는 인텔에서 사용하는 제품명.

- inline assembly code : C와 같은 고급언어 프로그램에 삽입된 어셈블리 코드를 일컬음. 아키텍처 의존적인 처리, 최적화 등에 사용된다.

- endian : 여러 바이트로 된 데이터를 어떤 순서로 저장할지를 정하는 규칙. 바이트 순서라고도함. 엔디안이라는 명칭은 걸리버 여행기에서 유래함.

- object file : 컴파일러가 생성한 중간 단계 파일. 실행 파일이나 라이브러리는 오브젝트 파일을 링크해서 만든다. GNU/리눅스에서는 .o라는 확장자를 갖는다. 넓은 의미로는 실행 파일이나 라이브러리도 오브젝트 파일에 포함하기도 한다.

- disassemble : 기계어를 어셈블리어로 변환하는 것.

- shared library : 프로그램 실행 중 메모리상에서 여러 프로그램에 의해 공유되는 라이브러리. 통상 공유 라이브러리는 동적 링크된다. 정적 링크되는 공유 라이브러리도 있으나 드물다. 공유 오브젝트라고도 한다.

- relocation : 기계어 코드에 포함된 주소를 링크 시에 또는 로드 시에 수정하는 것.

- signal : 프로세스에 보내지는 동기적인 또는 비동기적인 이벤트. POSIX에서는 SIGKILL과 SIGSTOP외의 시그널은 시그널 핸들러로 처리할 수 있다.

- signal handler : 시그널을 처리하는 함수. sigaction() 또는 signal()함수로 설정할 수 있다.

- signature : 이름, 인수, 반환 값의 형태에 따라 결정되는 함수의 형식. 보통 C나 C++ 등의 컴파일 언어에서는 이름이 같아도 시그니처가 다른 함수를 호출하려 하면 경고 또는 에러가 발생한다.

- system call : 유저 레벨의 애플리케이션에서 OS 커널의 기능을 호출하기 위한 방법. ex) read(), fork()

- symbol : 일반적으로는 기호를 의미하지만, Binary Hacks의 문맥에서는 링커가 함수나 변수를 식별할 때 사용하는 이름을 말한다.

- symbol table : 오브젝트 파일 등에 포함된 심볼의 표. 명시적으로 삭제하지 않는 한 실행 파일이나 라이브러리에 남아 있다.

- stack : 스택 프레임을 단계적으로 쌓아가는 메모리 영역. Binary Hacks의 문맥상 스택은 '데이터 구조의 스택'이 아니라 '메모리 영역의 스택'을 가리키는 경우가 많다.

- stack frame : 인수나 지역 변수, 보존된 레지스터, 반환 값 주소 등 함수호출에 필요한 정보를 정리한 것. 간단히 프레임이라고도 한다.

- stack pointer : 스택 프레임을 조작하기 위해 사용하는 포인터. x86 등은 스택 포인터를 위한 전용 레지스터를 갖고 있다. RISC 프로세서에서는 범용 레지스터 중에 하나를 스택 포인터로 정해서 사용하는 경우가 많다.

- thread : 프로그램 실행 단위의 하나. 프로세스와의 주된 차이점은 자원 공유 방법에 있다. 통상, 프로세스에 비해 스레드 간 자원 공유가 더 쉽다. 하나의 프로세스는 여러 스레드를 갖는다.

- thread safe : 멀티스레드 프로그램에서 안전하게 실행할 수 있음을 일컬음. 대개의 경우 static 변수를 내부에 지닌 함수는 스레드 안전하지 않다.

- segmentation fault : 접근 불가한 주소 영역에 접근하거나 쓰기 불가능한 주소 영역에 쓰기를 할 경우 발생 하는 에러. C, C++ 프로그래머는 자주 접하게 된다. 세그먼트 위반이라고도한다.

- executable file : 실행 가능한 파일. GNU/리눅스에서는 /bin, /usr/bin 등에 있다.

- static library : 정적 링크되는 라이브러리. GNU/리눅스에서는 .a라는 확장자를 갖는다.

- static link : 실행 파일을 생성할 때 라이브러리를 링크하는 것. 대개 라이브러리 내용을 실행 파일내에 포함시키기 때문에 실행 시에는 라이브러리 파일이 필요 없다.

- toolchain : 컴파일러, 랑커, 어셈블러 등 네이티브 프로그램을 생성하기 위해 필요한 일련의 툴을 총칭한다.

- data segment : 초기화된 데이터가 위치하는 세그먼트. ELF에서의 명칭은 .data이다.

- text segment : 기계어 코드가 위치하는 세그먼트. 통상, read-only로 설정된다. ELF에서의 명칭은 .text이다.

- debugger : 프로그램 버그의 원인을 찾는 데 유용한 툴. 디버거로 프로그램을 구동시킨 후 백트레이스나 변수 조사 등을 수행한다.

- debug information : 디버거가 필요로 하는 정보. 실행 파일이나 공유 라이브러리에 포함되어 있다. gcc에서는 -g옵션을 주면 생성된다.

- demangle : name mangling된 심볼을 원래의 읽기 쉬운 심볼로 복원시키는 것을 말한다. ex) _ZN3Foo3BarE => Foo::Bar

- dynamic link : 실행 시에 라이브러리를 링크하는 것. 실행 시에 라이브러리 파일이 필요함. 라이브러리가 존재하지 않으면 실행 시에 에러가 발생한다.

- dynamic link library : 동적 링크된 라이브러리. 윈도우에서는 DLL이라 불린다. GNU/리눅스에서는 DSO라고 불리는 경우가 많다.

- name mangling : 함수명과 시그니처로부터 유일한 심볼을 생성하는 것을 말한다. C++나 자바등의 언어에서 사용된다. ex) Foo::Bar => _ZN3Foo3BarE

- binarian : Binary Hack에 정통한 엔지니어.

- backtrace : 현재 함수에 도달할 때까지 지나온 함수를 추적하는 것. 스택 트레이스라고도 한다.

- heap : malloc()등에 의해 동적으로 확보된 메모리 영역. Binary Hack의 문맥상으로 힙은 '데이터 구조의 힙'이 아니라 '메모리 영역의 힙'을 가리킨다. 자유기억영역이라고도 한다.

- break point : 디버거로 프로그램 실행을 일시 중지시킬 지점. 함수명이나 소스코드의 행 번호로 지정한다.

- program counter : CPU 내의 레지스터 중 하나로, 현재 실행하고 있는 명령의 주소를 저장하고 있다. PC로 줄여서 일컫기도 한다. 인스트럭션 포인터라고도 한다.

- process : 프로그램 실행 단위의 하나. 실행 중인 프로그램의 인스턴스. 통상, 프로세스는 하나의 프로세스 ID를 갖는다.

- profiler : 프로그램의 성능을 분석하는 툴. ex) gprof, sysprof, oprofile

- calling convention : 함수를 호출할 때 데이터를 어떤 식으로 스택에 쌓을지를 정하는 규약. ABI의 일종. OS나 프로세서에 따라 다르다.

- runtime : 실행 시를 뜻함. 실행 시에 발생하는 에러를 런타임 에러라고 한다.

- link : 오브젝트 파일이나 라이브러리를 연결하는 것. 재배치 등의 처리를 수행한다.

- reflection : 실행 중인 프로그램 자신의 정보를 조사하거나 수정하는 것을 말함. C 언어에서는 리플렉션을 위한 기능은 없지만, Binary Hack를 이용하기에 따라 유사한 기능을 구현할 수 있다.

- load : 실행 파일이나 라이브러리를 메모리상에 배치하는 것.

[참조 : BINARY HACKS - by 다카바야시 사토루, 우카이 후미토, 시사토 유스케, 하마지 신이치로, 슈도 카즈유키]