본문 바로가기

전체 글

(22)
[CS:APP] 7.3 목적파일 목적 파일의 세 가지 유형목적 파일 유형설명재배치 가능 목적 파일 (Relocatable Object File)다른 목적 파일과 결합되어 실행 파일을 만들 수 있는 포맷. 컴파일 결과물 (.o 파일).실행 가능 목적 파일 (Executable Object File)메모리에 로드되어 바로 실행 가능한 포맷. 링커 출력 결과물.공유 목적 파일 (Shared Object File)동적 링크 시 사용되는 특수한 목적 파일. 런타임이나 로드 타임에 연결됨. 예: .so 파일.각 목적 파일의 생성 주체재배치 가능 파일: 컴파일러 + 어셈블러가 생성실행 가능 파일: 링커가 생성공유 목적 파일: 컴파일러 + 링커가 -fPIC, -shared 옵션 등으로 생성 목적 파일 포맷시스템마다 목적 파일 포맷은 다름. 대표 포맷..
[CS:APP] 7.2 정적연결 링커의 주요 작업정적 링커는 다음 두 가지 핵심 단계를 거쳐 실행파일을 생성한다.1. 심볼 해석 (Symbol Resolution)정의각 .o 파일은 정의된 심볼과 참조된 심볼을 포함함.링커는 심볼 이름을 기반으로 참조가 어느 파일의 정의를 가리키는지를 결정해야 함.예시// main.cint sum(int *, int); // 참조만 존재// sum.cint sum(int *a, int n) { ... } // 정의 존재main.o는 sum을 참조sum.o는 sum을 정의링커는 sum 심볼 참조를 sum.o의 정의와 연결목적모든 참조를 정확히 하나의 정의와 매칭시킴동일한 이름을 가진 심볼이 둘 이상 정의되어 있으면 에러 발생 (중복 정의)2. 재배치 (Relocation)정의각 .o 파일은 자신의 ..
[CS:APP] 7.1 컴파일러 드라이버 1. 컴파일러 드라이버란 무엇인가? 컴파일러 드라이버는 gcc, clang 같은 명령어 한 줄로 전체 컴파일-링크 과정을 자동으로 수행해주는 툴실제로 우리가 사용하는 gcc, clang 같은 컴파일 명령어는 "드라이버(driver)".이 드라이버는 C 전처리기 → 컴파일러 → 어셈블러 → 링커의 모든 단계를 대신 호출해준다.즉, 우리가 gcc main.c sum.c 이렇게 한 번만 입력해도 드라이버가 알아서 여러 개의 프로그램을 호출해서 최종 실행파일을 만들어줌.2. 예제 프로그램책에서는 아래처럼 두 파일로 분할된 예제(main.c, sum.c)를 쓴다.(a) main.cint sum(int *a, int n);int main(){ int array[2] = {1, 2}; int val = s..
[CS:APP] 7. 링커(Linking) 🔗 링킹(Linking)이란?링킹은 여러 개의 코드와 데이터를 하나로 연결하여 실행 가능한 파일로 만드는 과정.소스 코드를 컴파일해서 생긴 목적 파일(.o) 들을 모아 하나의 실행 파일(a.out, ELF 등) 을 만든다.이 작업은 다음 시점 중 하나에 수행될 수 있다:컴파일 타임 (정적 링크)로드 타임 (운영체제가 실행 전에 링크)런타임 (프로그램 실행 도중에 동적 링크)📌 링커는 왜 중요한가?✅ 1. 대규모 프로그램 개발의 필수하나의 거대한 소스 파일로 다 짜는 건 비효율적.대신 기능별로 쪼개서 모듈화하고, 각각 따로 컴파일한 다음 링커로 연결한다.변경 사항이 있는 모듈만 다시 컴파일하고, 나머지는 재사용 가능 → 효율적 개발 가능!✅ 2. 링커 에러에 대처하려면 꼭 알아야 함예: “undefin..
C 포인터 & 포인터 연산 1. 📍 포인터란? (Hardware 관점)💡 정의포인터는 가상 주소 공간의 특정 위치를 참조하는 값이다.하드웨어적으로는 레지스터나 스택에 저장된 정수값(address)이며,컴파일러는 해당 값을 특정 타입의 객체(Object)로 해석하도록 도와주는 역할을 한다.🧱 예: 포인터는 그냥 주소 + 타입int *p;p는 메모리 주소이지만,int *는 “이 주소를 int 단위로 해석해 줘”라는 의미다.즉, 타입이 곧 포인터 산술(pointer arithmetic)과 dereferencing 해석 방식을 결정한다.2. ⚙️ 메모리 모델과 포인터📚 C의 메모리 레이아웃구간설명Code (Text)실행 코드 저장Data전역/정적 변수BSS초기화되지 않은 전역/정적 변수Heapmalloc/free로 관리되는 동적 ..
Gradle 빌드 시 “JAVA_HOME is not set” 오류 해결 ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation.프로젝트 폴더에서 Gradle 명령어를 실행하던 중 다음과 같은 오류 메시지를 확인했습니다. 또한, 커맨드 프롬프트에서 ls와 같은 유닉스 명령어를 사용하려고 시도했지만, Windows 환경에서는 인식되지 않아 당황했던 경험도 있었습니다. 결국 Gradle 스크립트(gradlew.bat)를 직접 실행하여 정상 동작하는 것을 확인했습니다.오류 원인이 오류는 Gradle이 Java 실행 파..
[CS:APP] 3 프로그램의 기계수준 표현(Machinne-Level Representation of Programs) 연습문제 ① 연습문제 3.1다음과 같은 값들이 표시된 메모리 주소와 레지스터에 저장되어 있다.AddressValueRegisterValue0x1000xFF%rax0x1000x1040xAB%rcx0x10x1080x13%rdx0x30x10C0x11  다음에 나오는 표에 지시된 오퍼랜드의 값을 채우시오.  1. 그냥 레지스터의 값 자체 : 0x1002. 메모리의 절대 주소 0x104에 저장된 값 : 0xAB3. Immediate : 값 자체가 의미 있음 : 0x1084. M[%rax] = M[0x100], 메모리 0x100에 있는 값 : 0xFF5. 0x100 + 4 = 0x104, M[0x104] = 0xAB6. 9 + 0x100 + 0x3 = 0x112 0x10C7. 260 + 0x1 + 0x3 = 264(10진수) ..
[CS:APP] 3.11 부동소수점 프로그램 (Floating Point Programming) 이 절에서는 부동소수점 데이터가 기계 수준에서 어떻게 다뤄지는지 설명하며, 특히 x86-64 프로세서에서 부동소수점 연산과 데이터 처리를 다룹니다.🟢 3.11.1 부동소수점 아키텍처 개요부동소수점 아키텍처는 다음과 같은 요소들로 구성부동소수점 데이터 저장 및 접근 방식부동소수점 연산을 수행하는 명령어(instruction)부동소수점 데이터 전달을 위한 레지스터 사용 관례레지스터 보존 규칙(호출자 저장 vs 피호출자 저장)x86-64에서는 SSE(Streaming SIMD Extensions)와 AVX(Advanced Vector Extensions) 명령어를 통해 부동소수점 연산을 수행🟢 3.11.2 부동소수점 데이터 이동과 변환부동소수점 데이터를 레지스터와 메모리 간에 이동하는 데 사용하는 명령어들..