컴파일 2

컴파일(Compile), 링커(Linker) 정리함

소스코드 =>컴파일러 (gcc, clang, MSVC등) => 목적코드 => 링커 (LTO) (주로 컴파일러에 포함)=> 실행파일 어셈블리어랑 기계어 차이점?기계어는 2진수로 이뤄진 CPU가 직접 실행할 수 있는 코드임. 0과 1로된 코드. (binary, hex로 표현)어셈블리어는 어셈블러에 의해서 기계어로 번역되고, 기계어를 사람이 읽기 쉽게 이름을 붙인 거임. (mov eax,1 처럼 표현)컴파일러가 어셈블리어로도 바꿔주고 기계어로도 바꿔줌. 링커가 하는일? 매우 많음위에처럼 여러 개의 목적코드를 하나의 실행파일로 만들어줌.심볼이나 함수 주소를 연결함.LTO를 수행해 최적화함.말고도 더더 많음. LTO: link time optimization ?간단한 함수들을 inline처리해줌 . -> 속도향상..

[시스템 해킹] 함수 호출 규약/ x86, x86-64

함수 호출 규약함수의 호출 및 반환에 대한 약속.함수를 호출할 때는 반환된 이후를 위해 호출자(Caller)의 상태(Stack frame) 및 반환 주소(Return Address)를 저장해야함.또한, 호출자는 피호출자(Callee)가 요구하는 인자를 전달해줘야하고, 피호출자의 실행이 종료될 때 반환 값을 전달 받아야한다. 함수 호출 규약 종류컴파일러는 지원하는 호출 규약 중, CPU아키텍처에 적합한 것을 선택한다.하지만 CPU의 아키텍처가 같아도, 컴파일러가 다르면 적용하는 호출 규약이 다를 수 있다. ex) C언어를 컴파일 하는 경우에 윈도우에서는 MSVC를, 리눅스에서는 gcc를 사용.여기서 MSVC는 MSx64호출 규약을 적용하고, gcc는 SYSTEM V호출 규약을 적용한다.  리눅스 gcc에서..