[ 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 환경에서는 표준으로 사용되고 있다.
DWARF 또는 ELF는 그 이름 때문에 '반지의 제왕'과 관계가 있는 게 아닌지 의심받기도 한다.
[ ELF(Executable and Linking Format) ]
실행 파일, 오브젝트 파일, 공유 라이브러리, 코어 파일에 사용되는 파일 형식 중 하나.
GNU/리눅스, FreeBSD 등에서 사용되고 있다.
[ GCC(GNU Compile 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 Inerface for UNIX) ]
시스템콜, 시그널과 같은 OS의 API를 규정하는 규약.
대부분의 유닉스 계열 OS는 POSIX를 기반으로 하고 있다(or POSIX 표준을 따르려 한다).
[ SUS(Single UNIX Specification) ]
유닉스로 불리는 OS를 위한 규격. 최신 버전인 SUSv3는 웹상에서 볼 수 있다.
SUSv3는 POSIX를 포함하고 있다.
[ TLS(Thread Local Storage) ]
여러 스레드에서 동일한 이름의 변수를 사용하더라도 실제로는 각 스레드의 독립된 영역에 저장되는데,
이를 TLS라 한다. GCC에서는 __thread라는 키워드를 사용해서 TLS를 다룬다.
[ prelink ]
동적 링크를 빠르게 하기 위한 방법 중 하나.
실행 파일과 공유 라이브러리를 수정함으로써 동적 링크 시 발생하는 비용을 대부분 삭감한다.
많은 리눅스 배포판에 사용되고 있다.
[ x86 ]
인텔(Intel)사의 8086 계열의 프로세서를 약칭함.
80486 이후 Pentium, Xeon 등의 제품명을 갖는다. IA-32라고도 한다.
[ x86_32 ]
x86_64와 구별하기 위해 32비트의 x86 아키텍처를 x86_32로 표기하는 경우도 있다.
[ x86_364 ]
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 커널의 기능을 호출하기 위한 방법.
(예: open(), read(), fork(), signal())
[ 심볼(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된 심볼을 원래의 읽기 쉬운 심볼로 복원시키는 것을 말함.
(예: _ZN3Foo3BarE => Foo::Bar)
[ 동적 링크(dynamic link) ]
실행 시에 라이브러리를 링크하는 것.
실행 시에 라이브러리 파일이 필요함. 라이브러리가 존재하지 않으면 실행 시에 에러가 발생한다.
[ 동적 링크 라이브러리(dynamic link library) ]
동적 링크된 라이브러리. 윈도우에서는 DLL이라 불린다.
GNU/리눅스에서는 DSO라고 불리는 경우가 많다.
[ name mangling ]
함수명과 시그니처로부터 유일한 심볼을 생성하는 것을 말함.
C++나 자바(Java)등의 언어에서 사용된다. (예: Foo::Bar => _ZN3Foo3BarE)
[ 바이너리안(binarian) ]
Binary Hack에 정통한 엔지니어.
[ 백트레이스(backtrace) ]
현재 함수에 도달할 때까지 지나온 함수를 추적하는 것. 스택 트레이스라고도 함.
[ 힙(heap) ]
malloc() 등에 의해 동적으로 확보된 메모리 영역.
Binary Hack의 문맥상으로 힙은 「데이터 구조의 힙」이 아니라 「메모리 영역의 힙」을 가리킨다.
자유기억 영역 이라고도 함.
[ 중단점(break point) ]
디버거로 프로그램 실행을 일시 중지시킬 지점. 함수명이나 소스코드의 행 번호로 지정한다.
[ 프로그램 카운터(program counter) ]
CPU내의 레지스터 중 하나로, 현재 실행하고 있는 명령의 주소를 저장하고 있다.
PC로 줄여서 일컫기도 함. 인스트럭션 포인터라고도 함.
[ 프로세스(process) ]
프로그램 실행 단위의 하나. 실행 중인 프로그램의 인스턴스.
통상, 프로세스는 하나의 프로세스 ID를 갖는다.
[ 프로파일러(profiler) ]
프로그램의 성능을 분석하는 툴. (이 책에서는 gprof, sysprof, oprofile을 소개한다.)
[ 호출 규약(calling convention) ]
함수를 호출할 때 데이터를 어떤 식으로 스택에 쌓을지를 정하는 규약.
ABI의 일종. OS나 프로세서에 따라 다르다.
[ 런타임(runtime) ]
실행 시를 뜻함. 실행 시에 발생하는 에러를 런타임 에러라고 한다.
[ 링크(link) ]
오브젝트 파일이나 라이브러리를 연결하는 것. 재배치 등의 처리를 수행한다.
[ 리플렉션(reflection) ]
실행 중인 프로그램 자신의 정보를 조사하거나 수정하는 것을 말함.
C언어 에서는 리플렉션을 위한 기능은 없지만, Binary Hack을 이용하기에 따라 유사한 기능을 구현할 수 있다.
[ 로드(load) ]
실행 파일이나 라이브러리를 메모리상에 배치하는 것.
'컴퓨터 서적 정리 > Binary Hacks' 카테고리의 다른 글
[Hack #6] 정적 라이브러리와 공유 라이브러리 (1) | 2011.07.02 |
---|---|
[Hack #5] Object file - ELF 파일 (0) | 2011.07.01 |
[Hack #4] od - 바이너리 파일 덤프 (0) | 2011.06.29 |
[Hack #3] file – 파일 종류 확인 (1) | 2011.06.29 |
[책소개] Binary Hacks (0) | 2011.06.29 |