make는 rule에 정의될 recipe를 추론할 수 있다. 


.. 원문을 매끄럽게 번역 하기가 참 어렵다.


make는 우리가 굳이 recipe에 뻔한 내용을 적지 않아도 recipe 내용을 스스로 추론하여 처리할 수 있다고 한다. 


간단한 makefile로 예를 들어보자.


main.o : main.c 

gcc -c main.c -o main.o 


위와같은 target을 작성 후 make를 수행한다고 가정했을 때 


gcc -c main.c -o main.o 는 매우 보편적인 컴파일 명령이기 때문에 target과 prerequisite의 명칭만 보고도 make는 해당 명령어를 충분히 유추해 낼 수있다. 

이렇게 유추하기 쉬운 명령은 굳이 명시하지 않아도 make는 알아서 recipe를 만들어 처리하게 된다. 


해서, 


hello : main.o

gcc -o hello main.o

main.o : main.c


위와 같이 간단하게 target : prerequisite 만 명시해서 make를 수행할 수 있다. 


단, goal이 되는 hello는 직접 recipe를 명시 해야한다. 



위의 예에서 target main.o는 

$(CC) -c -o main.o main.c 를 알아서 수행하게 된다. 


makefile에 recipe가 비어있다면 묵시적 룰을 사용하고 있는 것이다. 


'정리 > Make' 카테고리의 다른 글

[MAKE] Secondary Expansion  (0) 2018.12.17
[make] makefile 이 없는경우 ?  (0) 2018.12.03
[make] makefile의 명칭  (0) 2018.12.03
Posted by $Zero
:




sed 에서 &를 사용하면 매칭된 문자열을 파라미터처럼 받아서 사용할 수 있다. 


예시 ) 


1
2
3
[zero@localhost sed]$ echo abc | sed 's/abc/123&123/'
123abc123
 
cs



abc 앞 뒤에 123이 추가된 것을 확인할 수 있다. 


예제에서는 고정문자를 사용하였기에 그냥 123abc123을 사용했어도 충분했지만, 


검색 스트링이 정규표현식이라면 매칭된 모든 문자열에대해 첨삭이 가능하므로  &가 굉장히 유용하게 사용된다. 






Posted by $Zero
:


1. 영어. 


영어는 평생을 안고 가야할 언어다. 


프리토킹은 필요없다. 원서를 읽고 이해하고 학습할 수준까진 영어를 배워야한다. 


문법도 필요없고, 독해만 열심히 하면 된다. 



2. 프로그래밍을 공부할 것.


프로그래밍을 공부해야 하는 건 너무나 당연한 것이다. 


다만, 프로그래밍 언어에 목맬 필요는 없다. 


프로그래밍을 공부하랬더니 프로그래밍 언어에 목매는 사람들을 많이 보았다. 


나 또한 그랬고.. 


언어는 C언어 하나만 잘 다뤄도 된다.


중요한 건 프로그램이란 것은 어떻게 짜야하고 어떻게 돌아가는지, 운영체제 위에서 프로그램이 돌아가는 원리. 


디바이스 드라이버는 어떻게 개발되어지는 지 등등을 배워야 한다. 


java로 할 수 있는일, C#으로 할 수 있는일 Python으로 할 수 있는일 모두 다 


C언어로도 가능하다. 


그러니 언어를 문어발 식으로 배울 필요는 없다. 


Python은 매우 간단한 프로그램을 쉽고 빠르게 만들 수 있으니 선호하는 것 뿐이다. 


Python은 내가 생산성을 증가시켜야 될 필요가 있다 싶을 때 배워도 충분하다. 


프로그램이 구동되는 전체적인 로직을 이해하고 있는 사람이라면, 언어를 배우는 건 2주면 충분하기 때문에 


절대, 언어에 많은 시간을 쏟지 말아라. 






3. Linux를 공부할 것. 


대부분의 작업을 간단한 스크립트 작성으로 해결할 수 있을 정도로 

스크립트 작성의 대가가 되어야 한다. 


Bash 쉘의 스크립트를 배워라. 


또, 


리눅스 커널이 어떻게 동작하는지, 어떻게 구성되어 있는지 알아야 한다. 


일반적으로 우분투와 같은 배포판을 윈도우처럼 간단하게 설치하여 사용하기 때문에 


커널이란 녀석이 도대체 어떤 모습인지 아는 사람은 거의 없다. 


리눅스를 더 잘 다루고 깊게 이해하고 싶다면 배포판이 아니라 직접 파일시스템부터 구성해서 커널을 컴파일하고 돌려볼 필요가 있다.


www.linuxfromscratch.org/ 


 여기서 LFS(Linux From Scratch) 프로젝트로 맨땅에서 시작하여 리눅스를 구축해볼 수 있다. 


물론 모두 영문이다. 

다만, 쉬운 영어로 쓰여 있어 고등학생 정도의 실력이면 충분히 독해 가능하다. 

(그리고 요즘 구글번역이 매우 뛰어나 대부분의 문장은 제대로 해석해준다. 

그래도 중요한 문장이 오역되어 오해하면 치명적이니 직접 독해할 수 있어야 한다. )



4. 리버싱을 공부해라. 


모든 프로그램은 기계어로 되어있다. 


기계어란 CPU가 이해할 수 있는 언어로 


C언어로 작성된 코드를 컴파일하면 CPU가 이해할 수 있는 언어인 기계어로 번역되는 것이다. 


이 기계어는 어셈블리어와 1:1 매칭이 되므로 기계어를 어셈블리어 형태로 변환하여 프로그래머가 알아볼 수 있게 바꿀 수 있다. 


리버싱은 이렇게 기계어를 어셈블리어로 역으로 변환 하여 분석하는 작업을 뜻한다. 


리버싱을 통해 원래의 소스코드를 유추하거나 동작의 원리를 파악할 수 있다.


또한, 해당 프로그램의 취약점을 발견할 수 있으며, 프로그램의 동작을 조작할 수 있다. 


이 역할을 하는 프로그램을 디버거라고 하며 Windows엔 대표적으로 ollyDbg가 있고 Linux진영엔 GNU gdb가 있다. 


굉장히 비싼 가격으로 구매할 수 있는 IDA pro도 대표적인 디버거 툴이다. 


디버거 툴의 기능을 모두 꿰고 있으면 리버싱을 수월하게 할 수 있다. 


리버싱을 하는데에는 많은 사전 지식이 필요하기 때문에 매우 어렵고 많은 시간을 투자해야 하는 영역이다. 


운영체제, 프로그래밍, cpu 아키텍쳐 와 같은 컴퓨터공학의 전반적인 지식을 모두 갖추고 있어야 한다. 





5. 네트워크를 공부해라. 


네트워크의 구조를 알고 프로토콜을 이해해야한다. 

TCP/IP의 구조와 TCP/IP가 구조적으로 가질 수밖에 없는 문제점, 취약점을 낱낱이 알고 있어야 한다. 


라우터(L4 스위치)를 조작하여 네트워크를 구성할 수 있을 정도면 충분하다. 

그리고나서 네트워크 통신의 프로토콜들을 하나씩 분석해 나가면 된다. 










Posted by $Zero
: