본문 바로가기
분류 전/공부 정리

[WHS] 컴퓨터 구조 과제

by jwcs 2023. 9. 11.
728x90

1. 구름 IDE로 리눅스 개발환경 만들기

구름으로 진행했던 데이터들이 전부 날아가서 wls로 진행하겠습니다.

 

3. 오버플로 예제를 언더 플로로 바꿔서 해보기

5. c언어가 기계어가 되는 과정 직접 해보기

 

gcc -E hello.c -o hello.i

 

gcc는 c 및 c++ 프로그래밍 언어를 위한 컴파일러 이며, 이 명령은 gcc를 실행하라는 것을 나타낸다.

-E 옵션은 gcc에게 전처리 단계만 실행하라고 지시한다. 전처리는 소스 코드를 수정하거나 다른 파일을 포함하는 등의 작업을 수행하는 단계로, 실제로 코드를 컴파일하지는 않는다.

hello.c 부분은 전처리할 대상 C 프로그램의 소스 코드 파일 이름이다.

 -o hello.i 부분은 전처리된 출력 파일의 이름을 지정한다. -o 뒤에 오는 "hello.i"는 전처리된 결과를 "hello.i" 파일에 저장하도록 지시한다.

 

hello.i

gcc -S hello.i -o hello.s

-S 옵션은 gcc에게 어셈블리 코드를 생성하도록 지시한다. 즉, C 코드를 컴파일하지 않고 어셈블리 코드로만 변환합니다.

 

gcc -c hello.s -o hello.o

 

-c 옵션은 gcc에게 컴파일된 코드를 링크하지 말고 컴파일만 수행하도록 지시한다. 즉, 목적 코드를 생성하고 라이브러리와 연결하지 않는다.

 

1.ELF: Executable and Linkable Format. 유닉스와 유닉스 기반 시스템 공통 바이너리 파일 포맷. 이 포맷은 실행 가능한 프로그램, 오브젝트 파일, 공유 라이브러리 등에 사용

2.64-bit: 바이너리가 64비트 아키텍처용으로 컴파일됨

3.LSB: little endian 바이트 순서를 사용

4. relocatable: 이 오브젝트 파일은 재배치 가능. 즉, 링커에 의해 다른 오베즉트 파일이나 공유 라이브러리와 연결될 수 있음

5.x86-64: 이 오브젝트 파일은 x86-64 아키텍처용으로 컴파일됨

6.version 1(SYSV): ELF 포맷의 버전과 변형을 나타낸다. SYSV는 System V 유닉스를 의미

7. not stripped: "stripped"는 디버깅 정보나 심볼 테이블 등의 추가 정보를 제거한 상태를 의미. "not stripped"는 이러한 추가 정보가 아직 오브젝트 파일에 포함되어 있음.

 

오브젝트 파일은 소스 코드가 컴파일도니 후의 중간 결과물로, 링커에 의해 실행 가능한 바이너리나 라이브러리로 만들어지기 전의 형태이다.

 

바이너리 형태: 오브젝트 파일은 기계어 코드를 포함하는 바이너리 파일이다. 그러나 이 파일 자체로는 실행될 수 없습니다. 다른 오브젝트 파일이나 라이브러리와 링크되어야 실행 가능한 바이너리가 된다.

 

재배치 가능: 오브젝트 파일은 다른 오브젝트 파일이나 라이브러리와 링크되어 완전한 프로그램을 형성할 수 있다. 이 과정에서 링커는 각각의 변수나 함수 참조를 올바른 메모리 주소나 올바른 함수로 연결한다.

 

심볼 테이블: 오브젝트 파일에는 심볼 테이블이 포함되어 있다. 이는 파일 내의 각 함수나 변수의 이름과 위치 정보를 나타낸다. 이 테이블은 링커가 다른 오브젝트 파일이나 라이브러리와 해당 오브젝트 파일을 링크할 때 참조된다.

 

플랫폼 및 컴파일러 특정: 오브젝트 파일은 특정 아키텍처, 운영 체제, 컴파일러에 따라 다르게 생성될 수 있다.

대표적인 오브젝트 파일 확장자로는 UNIX 또는 LINUX 시스템에서 .o WINDOWS에서는 .obj가 있다.

 

readelf:

 

1. 전용 도구: readelf는 ELF 파일 형식에 특화된 도구. ELF 파일의 모든 섹션과 헤더 정보를 자세히 확인 가능

2. 출력 형식: readelf의 출력은 사람이 읽기 쉬운 형식으로 제공

3. 주요 기능: elf 파일의 헤더, 섹션 헤더, 프로그램 헤더, 심볼 테이블, 노트 섹션 등의 정보를 표시

 

 

objdump:

 

1. 다기능 도구: objdump는 ELF파일뿐만 아니라 다른 파일 형식의 바이너리에도 사용 가능

2. 디스어셈블: objdump의 주요 기능 중 하나는 바이너리 코드를 어셈블리 언어로 디스어셈블. 이를 통해 사용자는 바이너리의 기계어 코드를 직접 볼 수 있음

3. 다양한 정보: objdump는 바이너리의 헤더 정보, 섹션 내용, 심볼 테이블 등 다양한 정보를 표시. 또한, 바이너리의 공유 라이브러리 의존성, 재배치 정보 등도 확인

 

 

hello.o 와 hello의 readelf -a 결과를 보면 다른 점이 많다.(링킹되면서 다른 파일과 많이 합쳐지고 재배치됨)

hello.o 와 hello의 objdump -d 결과를 봐도 뭐가 많이 생긴다.(실행에 필요한 함수들)

 

gdb 디버거를 이용한 디버깅

 

프로세스 상태 -> 메모리에 올라감 -> 실제 메모리 주소가 잡힘

728x90
반응형