# Makefile

65개의 포스트

Unix 프로그래밍 - 2 Makefile, gcc, 메모리

컴파일 환경 컴파일 > 텍스트로 작성한 프로그램을 시스템이 이해할 수 있는 기계어로 변환하는 과정 컴파일을 한다 = 보통 컴파일 과정과 라이브러리 링크 과정을 하나로 묶어서 수행하는 것 링크 (link) 서로 다른 파일에 흩어져 있던 함수나 클래스들을 한 데 묶어서 링크해주는 작업 main 함수 안에 foo 함수와 bar 함수가 어디에 정의되어 있는 지 위치를 찾고 제대로 함수를 호출하 수 있게 된다. GNU C 컴파일러 : gcc gcc 기능 = C 프로그램을 컴파일해 실행 파일을 생성 형식 = gcc 옵션 옵션 -c : 오브젝트 파일(.o)만 생성 -o 실행 파일명 : 지정한 이름으로 실행 파일을 생성, 기본 실행 파일명은 a.out 사용 예: [예제] 파일명을 별도로 지정하지 않았으므로 a.out이라는 이름으로 실행 파일이 생성 실행 파일명을 ch1_2.out이라 하려면 `-

2023년 9월 13일
·
0개의 댓글
·
post-thumbnail

[Book] Managing Projects with GNU Make 3/e

1. 책 사진  완독 전에는 이 원숭이 얼굴만 봐도 빡이 쳤는데 다시 보니 귀엽다. 책 맨 뒷장의 Colophon 에 의하면 potto 라고 하는 원숭이라고 한다. 뭐 그렇다고 한다. 2. 책 정보 이름: Managing Projects with GNU Make 3/e 저자: Robert Mecklenburg 출판사: O'Reilly 3. 정리 - 공부한 내용 !youtube[6kQ6SOcawHU] - 책에서 등장한 예제와 코드들 https://github.com/Cruzer-S/MPGM  싹 다 정리했다. 진짜 뒈질 뻔했다. 예제가 안 돌아가는 것들도 많아서 직접 손으로 뜯어 고치면서 수정했다. Fedora Linux 37 기준으로 전부 다 돌아간다.

2023년 7월 15일
·
0개의 댓글
·

Makefile 작성법

gcc 컴파일러 명령어로 매번 프로그램을 실행시킬 수 있지만, 매번 많은 양의 파일들을 직접 터미널에서 gcc 컴파일러 명령어로 칠 수 없을거다. 그래서 Makefile을 만들어서 프로그램을 작동 시킬 수 있도록 할 것이다. gcc 컴파일러로 main 실행파일과, main.o, stack.o, test.o 이렇게 세가지 목적파일을 main.c, stack.c, test.c 파일을 이용해서 만들 수 있다. Makefile 이렇게 만들 수 있다. 그런데 조금 더 간결하고 보기 좋게 작성도 가능하다.

2023년 5월 6일
·
0개의 댓글
·

리눅스에서 C/C++ 컴파일 하기 (#2)

빌드 예제 세 개의 소스파일을 컴파일하여 Object 파일을 생성하고, 이들을 한 데 묶는 링크 과정을 통해 실행 파일인 app.out을 생성한다. main.c 파일은 foo.h, bar.h를 참조한다. Makefile을 사용하지 않고 불편하게 빌드하기 1. 컴파일 하기 -c 옵션은 소스파일(.c)로 Object파일(*.o) 생성하는 옵션이다. (링크를 하지 않고 컴파일만 한다) -o 옵션은 출력 파일의 이름을 지정하는 옵션이다. main.c 파일을 컴파일 하여 main.o 파일을 생성하고 마찬가지로 foo.o, bar.o를 생성한다. 2. 링크 및 실행 파일 생성하기 main.o, foo.o, bar.o 파일들을 묶는 링크 과정을 수행하고 실행 파일 app.ou

2023년 4월 27일
·
0개의 댓글
·

리눅스에서 C/C++ 컴파일 하기 (#1)

윈도우에서 C/C++ 컴파일 하기 윈도우에서는 C/C++ 파일을 컴파일 하기 위해 (대표적으로) Visual Studio를 사용한다. Visual Studio를 통해 프로젝트를 만들고 소스 코드를 컴파일 하는 과정은 아래와 같다. 프로젝트 유형(정적/동적 라이브러리, MFC, ...)을 선택하고 프로젝트를 생성한다. 프로젝트 속성을 통해 포함 디렉터리, 전처리기, 추가 종속성 등 각종 설정을 한다. 소스 코드를 작성한다. 빌드(컴파일) 버튼을 클릭한다. 크게 4단계 과정을 수행하면 자동으로 알아서 빌드를 해주고 결과물을 생성해 준다. 리눅스에서 C/C++ 컴파일 하기 리눅스 환경에서는 이러한 IDE를 사용할 수 없기 때문에 컴파일 및 빌드 과정이 윈도우 환경에 비해 약간 복잡하다. 리눅스에서는 위에서 나열된 1~4 과정들을 Visual Studio로 설정하는 것이 아닌 Makefile 이라는 것을 통해 '수동으로' 설정해야 한다.

2023년 4월 14일
·
0개의 댓글
·
post-thumbnail

Makefile 작성하기

🗿 머리말 처음 Makefile을 접했을 때 친절한 설명글들을 보고도 이해하지 못했고 동료들에게 물어 물어가며 무작정 외워 작성했다. push_swap과제에서도 가장 마지막에 공부하기로 미뤄두고 위 명령어를 드래그 해보시오 ➡️ ➡️ ➡️ 이 기나긴 컴파일 명령어를 메모장에 복사해뒀다가 테스트할 때마다 붙여넣는 멍청한 짓을 계속했다😅 하지만 이제는 제대로 작성할 수 있다! ❓ Makefile이란 파일을 관리하는 프로그램이다. 컴파일과 수정된 파일에 대한 재컴파일을 용이하게 해준다. makefile을 작성해두면 gcc를 계속 해주지 않고 make 명령어를 통해 바로 실행파일을 만들 수 있다. 🐝 컴파일이 되는 과정 컴파일이 되는 과정을 알아야 makefile을 이해할 수 있다. main.c 와 add.c 두 파일이 있다고 가정해보자 파일의 내용은 각각 위와 같다. main을 실행하려면 gcc main.c ad

2023년 4월 10일
·
0개의 댓글
·

gcc로 빌드하는 과정을 용이하게 해주는 Makefile

1번 테스트를 통과하기 위한 코드를 짰는데, 분명히 맞게짰는데 테스트가 통과가 안됨. gdb 디버거 사용법을 익혀가지고 해당 메서드를 디버깅해봤는데, 오잉? 여기!!!라고 표시된 곳에서 코드가 더 이상 진행되지 않고 끝나버림. 알고보니 make에 대한 무지에서 비롯된 거였음. src/Makefile test/Makefile 과제 설명란에서 그냥 make test로 돌려서 테스트 통과하면 됩니다~ 라고 써있길래 그러려니 하고 넘겼는데, make test는 요 라인의 "test"라는 타겟을 실행하기 위한 아이였음. 얘가 바로 밑의 "test-rbtree" 타겟을 실행하여 실행파일을 만들고, 해당 실행파일을 실행한 뒤, valgrind로 메모리 누수등을 체크하는 역할을 함. 근데 이렇게 되면, 이미 존재하는 test-rbtree.o와 src안의 rbtree.o를 가지고 실행파일을 만드는데, 이때 ../src/rbtree.o 의 경우 이미 있는 목적파일을

2023년 3월 31일
·
0개의 댓글
·
post-thumbnail

[CICD-Goat] 2. Mad Hatter

개인적으로 침투테스트 시 내부망에 액세스하면 우선 순위로 내부에서 사용중인 CI/CD 툴인 jenkins, gitlab, bitbucket 등을 탐색한다. 발견 이후에도 알려진 CVE가 모두 패치된 버전을 사용하여 익스하지 못한 경험이 있는데, 추후 이런 상황에서 좀더 스마트하게 내부 시스템을 장악하고자 취약한 환경의 CI/CD 환경인 cicd-goat을 통해 CI/CD pipeline에서 발생할 수 있는 11가지의 취약점 시나리오를 CTF 형태로 진행한다. 이번 포스트에서는 Easy 단계의 Mad Hatter을 진행한다. 이번 문제는 이전 문제인 White Rabbit와

2023년 3월 29일
·
0개의 댓글
·

[Makefile] relocation R_X86_64_32 againg. recompile with -fPIC

현상 리눅스 64bit 빌드중 정적 라이브러리(.a)를 링크하여 공유 라이브러리(.so)를 생성하는 과정에서 아래 에러가 발생. ** /usr/bin/ld: aaa.o: relocation RX8664_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: xxx.a(x.o): relocation RX8664_32S against '.rodata' can not be used when making a shared object; recompile with -fPIC ... ** 똑같은 환경에서 -m32 옵션을 이용해 32bit 빌드했을 때는 해당 에러가 발생하지 않았는데, 64bit 빌드(-m32 옵션 제거)시에 해당 에러가 발생했다. 테스트 환경이 갖춰지지 않은 관계로 32bit 빌드로 생성한 파일에 대해서는

2023년 3월 21일
·
0개의 댓글
·
post-thumbnail

[make] # 5. 프로젝트 관리

make 는 그 자체로 무척 강력하나 다음과 같은 상황에서 다양한 문제를 야기할 수 있다: 하나 이상의 디렉토리를 사용 하는 과정 작성. make 가 여러 디렉토리에서 의존 관계를 확인하고, 확장자 규칙을 적용하려면 별도의 작업이 필요하다. 컴파일러 옵션을 변경하는 경우. #if 와 같은 조건부 전처리기 지시자를 사용하는 경우에는 매우 복잡해질 수 있다. 표시되지 않은 의존 관계, 특히 .h 헤더 파일과 관련된 의존 관계. make 에 이와 같은 의존 관계를 명시적으로 언급해야 한다. 1. 더미 타깃  더미 타깃(더미 필요항목)을 사용하면 독자는 파일 간에 연관된 의존 항목에 관여하지 않으면서 작업을 할 수 있다. make 가 실제 파일의 생성 시간을 확인하는 반면, 더미 타깃과 필요항목에 대해서는 의존 관계에 대한 다소 임의적인 규칙을 사용한다. 더미 타깃(의존항목 행에서 콜론 앞에 표시된 존재하지 않는 파일)

2023년 3월 7일
·
0개의 댓글
·
post-thumbnail

[make] # 4. 명령어

 make 로 실행하는 명령어는 서로 다른 셸에서 실행 되는 것처럼 동작한다. 따라서... 수행되는 작업의 순서가 파일 간의 관계 에만 주로 영향을 받는 경우 make 기술 파일을 사용하여 모든 것을 제어할 수 있으나 변수 조작 을 여러 번 해야 하거나 실행 순서를 변경 해야 하는 경우 (if 문이나 내부 exit 명령어 등) 에는 셸 스크립트를 사용 하는 것이 더 용이하다. 1. 파일 이름의 패턴 매칭(Pattern Matching)  make 에서는 셸에서 사용되는 패턴 매칭 문자(Pattern Matching; *, ?, []) 를 명령행 뿐만 아니라 종속 항목에서도 사용할 수 있다.  그러나 make 에서 여

2023년 2월 26일
·
0개의 댓글
·

The Linux operators and separators commands

The Linux operators and separators commands Semicolon (;): The semicolon is used to separate two or more commands on a single line. The commands are executed one after the other, regardless of whether the previous command succeeds or fails. Double Ampersand (&&): The double ampersand is used to execute the second command only if the first command succeeds. If the first command fails, the second command is not executed. Double Pipe (||): The double pipe is used to execute the sec

2023년 2월 26일
·
0개의 댓글
·
post-thumbnail

[make] # 3. 확장자 규칙 (Suffix Rule)

 해당 장에서 소개하는 확장자 규칙(Suffix Rule) 은 Old-fashioned 이다. (The GNU Make Reference Manual Version 4.2, Richard M. Stallman, Roland McGrath, Paul D. Smith 저, 125pg. 참조 (Oepn Book 이라서 Web 에서도 확인 가능))  그럼에도 불구하고 필자(책의 저자가 아닌 이 게시글을 작성하는 본인) 가 obsoleted 된 내용을 굳이 정리해서 올리는 이유는 다음과 같다: >  Suffix Rules are the old-fashioned way of defining implicit rules for make. Suffix rules are obsolete because pattern rules are more general and clearer. They are supported in GNU make for comp

2023년 2월 25일
·
0개의 댓글
·
post-thumbnail

03. Makefile(1)

이전내용 이전 글에선 Makefile 을 사용하는 방법을 공부했다 Suffix rule 이라든지 매크로 등을 사용하여 편하게 사용하는 방법도 알아봤다 Makefile 작성법 레이블 > 이전 글에서 Makefile의 문법을 간단하게 알아봤었다. 여기의 target 부분을 레이블로 사용할 수 있다. 예를 들어서 빌드 과정을 거치고 나서 .o 로 끝나는 목적파일들을 한 번에 정리하고 싶다면? clean 이라는 레이블을 만들어서 make clean 으로 편하게 사용한다든가 말이다. 이전에 사용했던 Makefile 에 clean 레이블을 추가했다. 단순히 삭제만 하는 기능이기 때문에 dependency 는 빈칸으로 뒀다. make clean 혹은 mingw32-make clean 을 입력하면 오브젝트 파일들이 삭제되는 것을 확인할 수 있다. rm 커맨드가 작동하지 않을 경우 윈도우의 경우 위와 같이 작성하여 사용하면 된다. 추가적으로 자주 사

2023년 2월 19일
·
0개의 댓글
·
post-thumbnail

[make] # 2. 매크로

 책에서 등장한 명령 행 이란 단어는 문맥에 맞게 커맨드 라인 혹은 명령 행 이라고 옮겼다. 전부 다 명령 행이라고 하니까 기술 파일의 명령 행인지 프롬프트에서의 커맨드 라인인지 도통 알 수가 없다.  타깃들이 수십 개의 파일들에 종속되거나 여러 개의 서로 다른 버전으로 만들어지기 마련인 실제 프로젝트의 기술 파일에서 반복되는 텍스트의 양을 실로 엄청나리라 생각할 수 있으나 실제 사용되는 기술 파일을 열어보면 뜻밖에도 보통 10~50 줄 정도로 간결하다. 이렇게 간결하게 표현할 수 있는 것은 make 가 지닌 강력한 두 가지 기능, 매크로 와 확장자 규칙 덕분에 가능하다.  위와 같은 매크로를 정의한 기술 파일에 아래와 같은 내용이 들어갔다고 생각해 보자: make plot 을 실행하면 명령은 다음과 같이 실행된다: 1. 구문 규칙 - 기본 규칙  매크로 정의는 등호(=)를 포함하는 하

2023년 2월 12일
·
0개의 댓글
·
post-thumbnail

02. Makefile (0)

이전내용 이전 글에선 GCC와 컴파일 과정에 대하여 알아보았다. 하지만 과정도 복잡하고 소스가 많아지면 입력해야할 명령어도 많아진다. 일련의 과정들을 명령어 하나로 간편하게 컴파일하고 빌드하는 방법을 알아보겠다. Makefile >make)는 소프트웨어 개발을 위해 유닉스 계열 운영 체제에서 주로 사용되는 프로그램 빌드 도구이다. 여러 파일들끼리의 의존성과 각 파일에 필요한 명령을 정의함으로써 프로그램을 컴파일할 수 있다. 최종 프로그램을 만들 수 있는 과정을 서술할 수 있는 표준적인 문법을 가지고 있다. 위의 구조로 기술된 파일(주로 Makefile이라는 파일명)을 make가 해석하여 프로그램 빌드를 수행하게 된다. 사용예시 우선 사용하는 파일은 아래 4개를 쓰겠다 GCC의 경우

2023년 2월 9일
·
0개의 댓글
·
post-thumbnail

[make] # 1. 컴파일, 실행, 디버그

책에서는 build 를 작성이라 번역했는데 아무리 봐도 문맥상 너무 그 내용이 맞질 않아서 전부 다 빌드로 번역했다. 작성이라는 단어가 코드를 write 한건지 프로그램을 build 한건지 도통 감이 안 잡힌다. 아마 1990년대 책이라 그런 것일 수도 있겠다. 아직 IT 용어 자체가 정립되지 않은 시기여서 작성이라 번역한 것이라 생각된다 > 단말기라는 용어도 요즈음엔 잘 이해하기 어려울 것 같다는 생각이 들어서 그냥 터미널이라고 번역을 했다.  다음은 program 을 빌드하는 경우에 따라 서로 다른 버전을 생성할 수 있는 명령이다.  위 명령어를 입력하게 되면 해당 파일(program)을 생성하는 데 필요한 모든 컴파일과 링크 작업을 수행할 수 있다. make 유틸리티를 사용하면 수많은 cc 컴파일러 명령들을 일일이 손으로 입력하지 않고도 자동으로 수행할 수 있다. ![](https://velog.velcdn.com/ima

2023년 2월 6일
·
0개의 댓글
·
post-thumbnail

[make] # 0. make 란 무엇인가?

1. make 란 무엇인가?  make 는 명령을 생성하는 유틸리티이다. make 유틸리티는 기술 파일(description file)과 몇 가지 일반 템플릿을 사용하여 유닉스 셸에서 실행되는 각종 명령들을 만들어낸다. 이를 통해 임시 파일을 제거하는 데서부터, 복잡한 프로그램 그룹의 최종 실행 파일을 만드는 데 이르기까지 일련의 작업을 수행한다.  프로젝트를 수행하는 과정에서 수차례 반복되는 과정을 make 유틸리티를 통해 간단하게 처리할 수 있다. 전체 파일들 간의 관계를 일단 한 번만 기록해주면 간단한 명령으로 make 유틸리티가 자동으로 갱신 작업을 수행하게 된다. 2. make 유틸리티의 가치 빠른 학습 make 는 특히 기본 규칙을 아주 빠르게 익힐 수 있다. 따라서 이 책을 통해 make 의 기본을 익히고나면 이 책을 읽느라 들인 만큼이나 시간을 절약할 수 있다는 사실을 절감하게 된다. 팀워크

2023년 2월 2일
·
0개의 댓글
·
post-thumbnail

Makefile & make: c/cpp 빌드 시스템

make와 Makefile 우리는 source code를 짜고, compile한 후, 실행한다. 이때 compile이란 특정 프로그래밍 언어로 쓰인 code를 다른 언어로 옮기는 과정이다. 즉, compiler가 작용하면 비교적 사람이 이해하기 쉬운 high-level언어로 쓰인 source code 내용을 컴퓨터가 읽을 수 있는 low-level 어셈블리어로 번역해준다. compiler로 직접 compile하는 과정을 거치기도 하지만, 나의 경우 linux를 사용한다면 terminal에서 ' _ 'make' _라는 명령어를 사용해 쉽게 build 하고 실행하는 방법을 주로 사용한다. 그렇다면 _ 'make' _라는 명령어가 정확히 어떤 역할을 해주는 것일까??? 라는 의문을 가지고 살펴보겠다. Makefile : 프로그램을 관리하는 프로그램이다. 특정 프로그램의 일정 부분이 수정돼 재 컴파일이 필요할 경우 이를 용이하게

2023년 2월 2일
·
0개의 댓글
·
post-thumbnail

00. VS CODE에 C/C++ 개발 환경 세팅하기

GCC란? > * GNU 컴파일러 모음(GNU Compiler Collection, 줄여서 GCC) 컴파일러는 특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 언어 번역 프로그램을 말한다. 컴파일러는 고급 프로그래밍 언어를 실행 프로그램으로 만들기 위해 저급 프로그래밍 언어로 바꾸는 데 사용된다. 원래의 문서를 소스 코드 혹은 원시 코드라고 부르고, 출력된 문서를 목적 코드라고 부른다. 원시 코드에서 목적 코드로 옮기는 과정을 컴파일이라고 한다. Makefile? > * [make을 실행하기 전에 프로젝트의 목록 및 컴파일 및 링크 규칙을 만들어야 한다.](https://ko.wikipedia.org/wiki/Make_(%EC%86%8C%ED%94%84%ED%

2023년 1월 31일
·
2개의 댓글
·