공부 65

PLT와 GOT 그리고 동적 라이브러리

PLT와 GOT가 무엇이고 어떤 점이 다른지 동적 라이브러리를 이용한 함수 호출 방법은 어떻게 되는지 알아보자. 라이브러리 : 함수를 모아놓은 파일 정적 라이브러리 : 내가 만든 프로그램에 라이브러리 함수를 직접 삽입 동적 라이브러리 : 메모리에 별도로 라이브러리 파일을 적재한 뒤 함수 주소를 찾아 사용 PLT : 동적 라이브러리를 이용할때 함수 주소를 찾아 실행시켜주는 테이블 GOT : 함수의 실제 주소를 기록해둔 테이블 하나씩 살펴보면 라이브러리 라이브러리란 여러개의 함수가 담겨있는 파일이다. 어렵게 생각하지말자. 그냥 우리가 쓰는 printf, malloc과 같은 함수가 정의되어있는 파일이다. 링크 내가 만든 프로그램에서 사용하는 라이브러리 함수를 실제 연결해주는 행위. 이때 심볼과 함수정의의 차이..

공부/JUN STUDY 2022.05.18

MOV와 LEA 어셈블리어 차이 그리고 []의 의미 (RAX와 [RAX]의 차이)

결론부터 이야기하면 mov는 값을 옮기는 어셈블리어 lea는 주소를 옮기는 어셈블리어 rax는 rax에 담긴 값 [rax]는 rax에 담긴 값을 주소로 보겠다. 라는 뜻이다. 아래 표를 완벽하게 이해하면 최고다. 1. mov rdi, rsi : rsi에 있는 값을 주소가 아니라 값으로 보고, rdi 레지스터에 값을 넣는다. 2. mov QWORD PTR[rdi], rsi : rsi에 있는 값을 주소가 아니라 값으로 보고, rdi 레지스터에 담겨있는 값을 주소로 보고, 해당 주소에 rsi에 담긴 값을 넣는다. 3. mov QWORD PTR[rdi+8*rcx], rsi : rsi에 있는 값을 주소가 아니라 값으로 보고, rdi값+8*rcx값을 주소로 보고, 해당 주소에 rsi에 담긴 값을 넣는다. [ ]의 ..

공부/JUN STUDY 2022.03.30

BSS vs 데이터 vs rodata (전역영역 이름 구분하기)

BSS / 데이터 / rodata 세그먼트 모두 전역변수/상수가 저장되는 위치이다. 일단 이거는 머리에 넣어두고 다만 어떤 전역변수/상수가 저장되느냐 인데, 이 글을 통해 살펴보자. 각 세그먼트마다 머리에 넣어두면 좋을 내용을 먼저 정리해보면 BSS 세그먼트 : 프로그램 시작시 모두 0으로 초기화됨 => 선언하고 초기화 하지않은 전역변수 데이터 세그먼트 : 프로그램 시작시 0으로 초기화 안됨 => 초기화된 전역변수/전역상수가 위치하는 영역. rodata 세그먼트 : 데이터 세그먼트 안에 수정 불가능한 영역 => 값이 변하면 안되는 데이터가 위치함. (문자열 / 전역상수) 자 조금만 생각해보자. 전역변수를 선언하고 초기화를 하지 않았으면 프로그램을 실행하는 도중에 변수에 값을 넣어주는 과정이 필연적으로 있..

공부/JUN STUDY 2022.03.30

메모리 vs 레지스터 (메모리가 있는데 레지스터 왜 또 쓸까?)

우선 메모리나 레지스터의 사용목적은 같다. 컴퓨터에 데이터를 저장하기위해 이건 머리에 박아놔야한다. 다만 좀 더 빠르고 효율적으로 데이터를 저장하고 사용하기위해 레지스터를 사용하는 것이고, 이에 대해 이론적으로 구체적으로 알고싶으면 컴퓨터구조 내지는 운영체제 과목의 메모리 계층(Memory Hierarchy) 개념을 공부하면 된다. 이 글은 포너블 내지는 프로그램 동적 디버깅을 할때 메모리랑 레지스터 헷갈리지 않기위해 적는 글이다. 우선 알아두면 좋을 전제들이 몇개있다. 1. 프로그램에서 데이터를 다루는 주체는 CPU이다. (따라서 프로그램 명령어. 그러니까 어셈블리어에 있는 데이터들은 다 CPU가 다루는거다.) 2. CPU가 데이터를 사용하기위해선 무조건 레지스터로 옮겨와야한다. (push / pop은..

공부/JUN STUDY 2022.03.30

x86-64 ISA(Instruction Set Architecture)의 여러가지 이름 (Intel64, IA-32e, EM64T, amd64 이거 다 같은거다)

드림핵 강의에 STAGE 1에 다음과 같은 문구가 등장한다. x86-64는 Intel64, IA-32e, EM64T 또는 amd64라고 불립니다. 이렇게 많은 이명을 갖게 된 이유는 개발 역사가 복잡하기 때문입니다. 해당 내용을 요약해보고자한다. 0. 인텔은 32비트 ISA를 굉장히 잘 만들었음. 1. 인텔은 64비트 ISA를 개발했는데, 이게 잘 안됐음. 2. 그래서 AMD한테 사실상 넘겨줬는데, AMD가 이를 응용해서 넘 좋은 64비트 ISA를 만듬 3. 그래서 인텔은 다시 이걸 이용해서 ISA를 만듬. 이게 x86-64임. 아래는 드림핵의 본문이다. 64비트 아키텍처 개발의 필요성을 느낀 인텔은 2001년 경에 64비트 아키텍처인 IA-64를 발표하고, 이를 이용하는 아이테니움 CPU를 출시했습니다..

공부/JUN STUDY 2022.03.30

컴퓨터의 주소표현 (포인터의 크기 & 표현가능한 메모리 주소가 크면 좋은 이유)

컴퓨터의 주소개념을 이해할때 헷갈리는 가장 큰 이유는 개인적으로 주소를 나타내는 방법도 "숫자"이고 안에 들어가는 값도 "숫자"이기 때문이라고 생각한다. 무슨 말이냐면, 우선 어떤 호텔이 있다고 생각해보자. 이 호텔은 101호부터 503호까지 있는 5층짜리 호텔이다. 자, 이 호텔이 만약 101호부터 1003호까지 있는 10층짜리 호텔이면, 당연히 손님을 많이 받을 수 있을 것이다. 결론부터 이야기하면 컴퓨터에서 표현가능한 메모리 주소가 커지면 좋은이유는 호텔이 커지면(방을 많이 가지면) 손님을 더 많이 받을 수 있는 이유와 같다. 아니 방이 많으면 당연히 많은 손님들을 받을 수 있지 않을까? 어려운 논리가 전혀아니다. 컴퓨터도 표현가능한 주소가 많아질수록, 당연히 넣을 수 있는 데이터가 많아진다. 이게..

공부/JUN STUDY 2022.03.30

WORD에 대해 (CPU가 한번에 다루는 데이터의 단위란?)

컴퓨터에서 WORD란, CPU가 한번에 다루는 데이터의 단위이다. n bit 프로세서(64bit/32bit)라고 이야기할때 이 n이 바로 해당 컴퓨터의 WORD인 셈이다. 사실 WORD라는 단어는 1. CPU가 한번에 다루는 데이터의 단위라는 뜻 2. 16bit 라는 값 그 자체 로 쓰이는데, 우선은 1번 뜻에 집중해서 살펴보자. 자 그러면 CPU가 한번에 다루는 데이터의 단위란 무슨뜻일까? 우선 결론부터 말하면, WORD 단위로 처리되는 일들은 다음과 같은 것들이 있다. 1. CPU안에 있는 ALU(Arithmetic Logic Unit)에서 연산되는 데이터 2. 레지스터 크기 3. 표현가능한 주소의 크기 (포인터의 크기) 4. 버스(BUS)의 대역폭 예를들어 64bit 컴퓨터의 경우, 1. ALU에서..

공부/JUN STUDY 2022.03.30

오버플로우(Overflow) 관련 비슷한 용어 정리

오버플로우(Overflow) : 정해진 영역을 벗어나는 현상 인티져 오버(언더)플로우(integer over/underflow) : 값이 잘려서 의도하지 않은 값이 들어갈 수 있음. 반복문 우회 버퍼 오버플로우(buffer overflow) : 정해진 버퍼 크기를 넘어서 값이 들어감. 값이 잘리지 않음. 스택 오버플로우(stack overflow) : 정해진 스택의 크기를 넘어서 값이 들어감. 힙 오버플로우(heap overflow) : 정해진 힙의 크기를 넘어서 값이 들어감. 스택 버퍼 오버플로우(stack buffer overflow) : 스택 영역에 있는 버퍼가 정해진 크기를 넘어서 값이 들어감. 힙 버퍼 오버플로우(heap buffer overflow) : 힙 영역에 있는 버퍼가 정해진 크기를 넘..

공부/이모저모 2022.02.11

diff란? - 컴퓨터 파일 비교 유틸리티

https://ko.wikipedia.org/wiki/Diff diff - 위키백과, 우리 모두의 백과사전 컴퓨터에서 diff는 두 개의 파일 간 차이에 대한 정보를 출력하는 파일 비교 유틸리티이다. 일반적으로 하나의 파일 버전과 동일한 파일의 다른 버전 간의 변경 사항을 보여주는 데 쓰인다. diff는 ko.wikipedia.org 컴퓨터에서 diff는 두 개의 파일 간 차이에 대한 정보를 출력하는 파일 비교 유틸리티이다. 일반적으로 하나의 파일 버전과 동일한 파일의 다른 버전 간의 변경 사항을 보여주는 데 쓰인다. diff는 문서 파일의 줄 사이 변경 사항을 보여준다. https://sourceware.org/git/?p=glibc.git;a=blobdiff;f=malloc/malloc.c;h=80c..

공부/이모저모 2022.02.10

탐색을 위한 해시 (해시가 값 검색을 위해 사용되는 원리)

탐색을 위한 해시 해시 목적 : 탐색을 엄청나게 빨리 하기 위함 ⇒ 해시 값을 키로 이용하면 배열로 원하는 데이터에바로 접근할 수 있음 탐색 할때는 해시 함수 결과를 해시 주소(인덱스)로 해석 키 : 값의 개념으로 direct 접근 근데 충돌 무조건 발생함 -> 잘 관리하자 충돌관리 슬롯 여러개 관리 : 슬롯 만들어서 같은 해시주소에 여러개 저장가능하게! 선형 조사법 : 슬롯 오버플로나면 다른 해시 주소(바로 다음)에 저장 ⇒ 선형조사법 근데 이러면 군집화 현상 발생. 군집화 : 특정 지역에 키 값이 몰리는 현상(앞 찼네? 바로 뒤로.. 찼네?? 바로 뒤로..) 이차 조사법 : 키가 몰리는거 방지하기위해 다른 위치(4칸 뒤, 8칸 뒤..)로 점프해서 저장토록하면??? ⇒ 이차조사법 근데 이거 규칙 일정하..

공부/JUN STUDY 2021.11.11
728x90