[MAKE] Secondary Expansion

정리/Make 2018. 12. 17. 14:44 |




.SECONDEXPANSION: 


지시어는 변수확장을 지연해주는 기능을 갖고 있다. 


간단한 예제로 이해해보자 . 


1
2
3
4
5
6
7
8
9
10
11
.SECONDEXPANSION:
AVAR = main.o
 
onefile: $(AVAR)
        cc $<
 
twofile: $$(AVAR)
        cc $<
 
AVAR = test.o
 
cs



해당 예제에서 $$(AVAR) 으로 사용되어진 EXPANSION이 적용 대상이 된다. 


make는 두 개의 실행 페이즈를 가지고 있고, 첫번째 페이즈와 두번째 페이즈 사이에서 SECONDEXPANSION 처리가 이루어진다. 


해서, 최종적으로 make twofile 은 test.o 를 컴파일 하게 된다. 


이제, SECONDEXPANSION이 활용되는 실제 예를 살펴보자. 


1
2
3
4
5
6
7
.SECONDEXPANSION:
main_OBJS := main.o try.o test.o
lib_OBJS := lib.o api.o
 
main lib : $$($$@_OBJS)
        echo $?
 

cs




위 예는 recipe 에서 $@ automatic 변수를 사용한다.  


원래 recipe에선 $@와 같은 automatic 변수를 사용할 수 없으나, .SECONDEXPANSION을 선언하면 $$가 지연확장되어 

prerequisite 에서도 사용할 수 있게 된다. 


위 예제는 make에 전달된 target 에 따라 prerequisite 값이 달라지므로 .SECONDEXPANSION 을 유용하게 활용한 예가 될 수 있다. 


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

[make] makefile 이 없는경우 ?  (0) 2018.12.03
[make] makefile의 명칭  (0) 2018.12.03
[make] make의 묵시적 룰  (0) 2018.11.29
Posted by $Zero
:

make가 현재 디렉토리에서 


적당한 makefile을 찾지 못한다면, 


make는 커맨드 명령 argument에 명시된 액션에 대한 묵시적 룰을 실행한다. 


쉽게 예를 들면 



make main.o 


라고 커맨드 명령을 줄 시 


makefile이 없어도 make는 main.o에 대한 묵시적 룰인 

${CC} -o main.o -c main.c 

명령을 실행한다. 


위와 같이 간단한 컴파일이라면, makefile이 없어도 make로 컴파일 수행이 가능하다. 


실효성은 .. 


잘 모르겠다. 

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

[MAKE] Secondary Expansion  (0) 2018.12.17
[make] makefile의 명칭  (0) 2018.12.03
[make] make의 묵시적 룰  (0) 2018.11.29
Posted by $Zero
:

[make] makefile의 명칭

정리/Make 2018. 12. 3. 11:42 |

make는 기본적으로 현재 디렉토리에서 


GNUmakefile, makefile, Makefile 을 읽는다. 


셋 중 어떤 이름을 써도 상관은 없으나, 


GNUmakefile은 GNU 외의 make에서는 참조하지 않으므로 추천되지 않는다.


공식 Doc 에선 대문자로 시작하는 이름이 디렉토리 리스팅에서 가장 먼저 발견되며 눈에 띄기 때문에 Makefile을 추천하고 있다. 


makefile의 이름을 부득이하게 변경해야 할 경우 


-f , --file 명령줄 옵션을 통해 명시할 수 있다. 


make -fmyMakeFile 

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

[MAKE] Secondary Expansion  (0) 2018.12.17
[make] makefile 이 없는경우 ?  (0) 2018.12.03
[make] make의 묵시적 룰  (0) 2018.11.29
Posted by $Zero
:


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
:


파라미터 전달 순서 왼쪽 -> 오른쪽 파라미터 순서대로

Integer & Pointer ->  rdi, rsi, rdx, rcx, r8, r9

floating-point(float, double) -> xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7



파라미터는 오른쪽부터 왼쪽 순으로 스택에 push 되고 함수 호출 후 caller(호출자)에 의해 정리 되어야 한다. 


함수가 호출되어지면 return address는 rsp에 위치하고 첫번째 파라미터는 rsp+8로 참조된다 


스택포인터 rsp는 16바이트 단위로 정렬 되어야 하지만

서브루틴 호출의 리턴 어드레스는 8byte만 push 하기 때문에

16바이트 경계를 맞춰주기 위해 rsp에서 8바이트를 더하거나 빼야 한다.


서브루틴이 보존해야 하는 레지스터는 

rbp, rbx, r12, r13, r14, r15 이며,  나머지 모든 레지스터는 자유롭게 서브루틴에서 변경 할 수 있다.

Posted by $Zero
:

64bit 오라클 클라이언트 ODBC 설치시 MFC빌드 또한 64bit로 해야한다. 


32bit ODBC등록과 64bit ODBC등록은 나뉘어져 있으며 


32bit ODBC등록은 syswow64폴더에서 따로 해야한다.

Posted by $Zero
:

메이븐 버전 : 3.3.3

센토스 버전 : 7


먼저, 메이븐 3.3.3 버전을 사용하려면 JDK 1.7 이상의 버전이 설치되어 있어야 한다. 


CentOS 에서 jdk 설치하기. 


yum list | grep jdk 


설치가능한 jdk 패키지의 목록.




원하는 버전 설치.

yum -y install java-1.8.0-openjdk-devel.x86_64



메이븐 다운로드 페이지 : https://maven.apache.org/download.cgi#

Binary 아카이브 파일 아무거나 받으면 된다 (zip , tar.gz) 


압축을 풀고나면 bin폴더에 메이븐의 실행파일 mvn이 들어있다. 


먼저 mvn을 실행하기 위한 환경변수를 설정하자. 


JAVA_HOME, PATH 설정




(자바의 설치 위치는 which 명령과 ls -l 명령으로 링크를 계속 따라가 찾을 수 있다.)


홈 폴더의 .bashrc 파일에서 환경변수를 추가 해준 뒤 


source ~/.bashrc 로 현재 SHELL에도 적용시킨다.







 

Posted by $Zero
:





컴파일이 완료된 실행파일을 대상으로 ldd 명령을 사용하면 glibc 설치 경로를 알 수 있다. 


glibc 라이브러리를 실행파일 처럼 실행해보자. 


그럼 glibc 의 버전이 나온다.



Posted by $Zero
: