Study/Basic Study

Linux Study - Compile, 파일 권한, Assembly

대장흰둥 2021. 6. 21. 16:40

1. Compile이란?

      • 우리가 짠 소스코드를 컴퓨터가 이해 할 수 있는 기계어로 바꾸는 과정, gcc -o [만들어줄 파일이름] [컴파일할 파일 이름]으로 컴파일 해줄 수 있다.
      • 프로그래밍 언어->어셈블리어->기계어의 순서를 거친다

1.1 전처리(Pre-processor)

    • 컴파일을 시도할 경우 먼저 전처리기의 과정을 거친다 해당 헤더파일의 디렉토리를 찾아서 삽입해 준다 #define 이 있을 경우 이를 치환해 준다.
    • gcc -E -o [만들어줄 파일이름.i] [컴파일할 파일이름] 으로 해 줄 수 있다.

1.2 컴파일러(Compiler)

  • 우리가 작성한 소스코드를 읽어서 연산자,괄호,식별자와 같은 문법 요소별로 잘라서 이 문법 요소들을 해석해서 구문 트리를 생성해 주고, 이 트리로부터 어셈블리어 코드를 만들어 준다.

1.3 어셈블러(Assembler)

  • 우리가 만들어 준 어셈블리어 코드를 컴퓨터가 이해 할 수 있는 기계어코드로 바꾸어 준다.

1.4 링커(Linker)

    • 컴파일러가 만들어 준 코드들을 연결해서 하나의 실행 파일로 합쳐준다
    • gcc -c [컴파일 해줄 파일이름]으로 확인 해 줄 수 있다
Static 컴파일 Dynamic 컴파일
- 오브젝트 파일들이 하나의 파일로 묶여있는 라이브러리에    서 해당되는 오브젝트 파일이 바이너리와 링크되어 하나하    나 삽입되는 형태
- 속도는 빠르나 같은 오브젝트 파일들이 중복되어 파일의      크기가 커진다 gcc -static 옵션으로 사용할 수 있다
- 일반적인 형태의 컴파일
- 오브젝트 파일들이 하나하나 링크되는 것이 아니라, 사용한    다는 표시만 해 둔다
- 프로세스를 하나라도 사용하면 메모리에 로딩되고 이를 계    속해서 공유한다
- Static 컴파일 보다 용량을 줄일 수 있다


2. 파일권한

  • -ls-al 로 파일권한들을 확인 할 수 있다.

  • 파일 권한 명령어
chmmod 파일의 권한을 변경해 준다 chmod [옵션] [8진수 권한][파일명]
Ex) chmod 744: 유저는 모든 권한, 그         룹과 게스트는 읽기권한만 가지고         있다.
chown 디렉토리 파일의 소유자를 변경해 준다 chown [사용하는 사람]:[바꿔줄 대상]

 

3. 레지스터

  • CPU 내부에 존재하고 있는 공간->데이터 처리가 빠르게 가능하다

 

4. 어셈블리

    • 소스 코드를 컴파일 할 때 바로 기계어로 바꾸는 것이 아닌 직관적인 기호코드로 바꾼 것
    • 기계어와 11로 대응된다
    • Assembly 명령어

push 오퍼랜드의 값을 스택에 쌓아 준다
Ex) push %eax: eax 의 값을 스택에 쌓아 준다
pop 스택의 마지막 값을 뽑아서 오퍼랜드에 저장해 준다
Ex) pop %eax: 스택의 마지막 값을 eax 에 저장해 준다
mov 오퍼랜드 안의 값을 복사해서 붙여 넣어준다
Ex) mov %eax,%ebx : ebx 의 값을 eax로 복사해서 붙여넣어       준다
lea 주소값을 저장해 준다
Ex) lea (%esi), %ecx : esi 의 주소값을 ecx 에 저장해 준다
lnc 값을 1 더해서 저장해 준다
Ex) lnc %eax : eax 의 값을 1증가시켜서 eax 에 저장해 준다
dec 값을 1 빼서 저장해 준다
Ex) dec %eax: eax 의 값을 1빼서 eax에 저장해 준다
add 값을 덧셈해 준다
Ex) add %eax,%ebx: eax ebx 의 값을 더해서 저장해 준다
sub 값을 빼 준다
Ex) sub %eax,: eax ebx 의 값을 빼서 저장해 준다
call 특정 함수를 호출해 준다 되돌아 올 주소를 저장하기 때문에 함수를 호출해 준 후 원래 위치로 되돌아 올 수 있다
Ex) call 함수주소 :함수의 시작 주소로 이동한다
ret 스택에 저장되어있는 주소로 이동한다
Ex) ret: 함수를 호출했던 곳으로 이동해 준다
cmp 두 가지 값을 비교해 준다 값이 같다면 결과는 0이 된다
Ex) cmp: %eax 5 : eax 에서 ebx 를 빼서 값을 비교한다
jmp 실행 흐름이 가리키는 코드로 이동한다
Ex) jmp %eax : eax 에 저장된 주소로 이동한다
nop 아무 일도 하지 않는다

 

4.1 어셈블리 지정방식

  • 1. 즉시 지정방식: 주소의 내용을 꺼내지 않고 직접 값을 대응시킨다.

      → mov $0x01,%eax: eax 16진수 1의 값을 넣는다

  • 레지스터 지정방식: 레지스터에서 레지스터로 직접 값을 대응시킨다

     → mov %eax,%ebx : ebx eax 의 값을 넣는다

  • 직접 주소 지정방식: 메모리의 주소를 지정해서 그 값을 저장해 주는 방식이다

     → mov %eax, $0x80482f2 : 0x80482f2의 주소에있는 값을 eax 에 넣어준다.

  • 레지스터 간접 주소 지정방식: 괄호 내의 값의 주소를 레지스터에 저장해 준다

      → mov (%ebx),%eax: ebx의 값의 주소를 eax에 넣어준다.

  • 베이스 상대 주소 지정방식: 괄호 안의 주소에서 특정 바이트를 더한 주소의 값을 저장해 준다.                                                                보통 레지스터의 크기는 4byte 이다

      → mov 0x4(%esi),%eax: esi 의 주소에서 4byte를 더한 주소의 값(레지스터 다음 주소)eax 에 넣어준다