Table of Contents

가장 많이 사용되는 컴파일러인 gcc 의 tip 들을 정리했다. 특히 컴파일 옵션에 대한 내용을 주로 다룰 것이다.

빌드 옵션

컴파일러는 여러가지 다양한 옵션을 제공 하고 있다.
기존에 이미 정리했던 VPOS FAQ 을 참조한다.

ARM 프로세서와 아키텍처 옵션

프로세서 옵션은 여러 ARM 프로세서 중 어떤 프로세서를 사용할 것인지를 선택한다. 컴파일러는 이 옵션에 의해 프로세서별 지원되는 최적화된 프로그램을 생성하며 다음과 같은 방법으로 프로세서를 지정한다.

-mcpu = <CPU 이름>

만약 프로세서 지정이 잘못되면 프로그램은 동작하지 않을 수도 있고, 실행 속도가 늦어질 수도 있다. 예를 들어 Cortex-A9 을 사용하는 경우에는 다음과 같이 프로세서 옵션을 지정한다.

-mcpu = cortex-a9

사용하는 프로세서와 옵션이 서로 다르면 프로세서 내부의 구조적인 차이에 따라 최적화하는 것이 제한적일 수 있다. ARM7 과 ARM9 을 예로 들어 설명하면, 실제로는 ARM9 을 사용하는데 ARM7 옵션을 설정하면 실행속도가 늦어진다. 왜냐하면 ARM9 프로세서부터는 과거 ARM7 과 달리 메모리 단계가 명령어 파이프라인에 추가되었기 때문이다.
따라서 프로그래머는 사용되는 프로세서에 맞는 프로세서 옵션을 정확하게 지정해주어야 한다.
아키텍처도 이와 유사하다. 만약 아키텍처 옵션을 정확하게 지정하지 않으면 프로그램이 동작하지 않거나 성능 저하가 발생할 수 있다. 예를 들면 복잡한 연산 동작을 하는 프로그램을 구현하는 경우 아키텍처 v5TE 는 v4T 에 비해 훨씬 좋은 연산 명령을 지원한다. 따라서 아키텍처에 맞는 새로운 명령을 사용하여 성능을 최적화하기 위해서는 아키텍처에 맞는 옵션을 지정하여 사용해야 한다. 아키텍처는 아래와 같이 지정한다.

-march = <아키텍처 이름>

예를 들어 Cortex-A8 이나 Cortex-A9 과 같은 아키텍처 v7 을 사용하는 경우에는 다음과 같이 설정할 수 있다.

-march = armv7-a

디버깅 옵션

디버거를 사용하여 디버깅을 하는 경우에는 디버그 테이블을 생성해야 한다. 디버그 테이블은 다음 옵션에 의해 생성된다.

-g

위 옵션과 함께 추가적인 정보가 필요하면 -gstabs+, -gstabs, –gxcoff+ 등 다양한 옵션을 같이 사용할 수 있다.
디버깅 옵션을 지정하면 최적화 레벨을 높게 설정하더라도 컴파일러는 최적화되지 않은 코드를 생성한다. 따라서 개발이 완료된 후에는 디버그 옵션을 제거하고 컴파일하여 프로그램을 탑재해야 한다.

디버거를 사용하지 않고자 하는 경우에는 디버그 테이블이 추가되지 않도록 다음과 같은 옵션을 사용한다.

-mno_debug

최적화 옵션

최적화는 프로그램의 크기와 실행 시간을 최소화하도록 명령을 생성해내는 것을 말한다. 프로그래머는 컴파일 레벨로 최적화 정도를 지정할 수 있고, 필요에 따라 프로그램 크기 또는 실행시간을 우선하여 최적화하는 옵션을 지정할 수도 있다.

옵션 최적화 정도 설명
-O0 최소 대부분의 최적화를 하지 않는다. -g 디버그 옵션을 사용했을 때 디폴트 최적화 레벨로 사용된다
-O1 제한적 최적화를 제공하지만 디버깅에 일부 최적화 기능은 사용되지 않는다
-O2 많이(default) 좋은 최적화 기능을 수행한다
-O3 최대 -O2 와 동일한 최적화 기능을 수행하지만 추가적인 옵션 사용에 따른 제어를 제공한다

또한 프로그래머는 코드의 사이즈 또는 실행시간을 우선해서 최적화할 수 있다. 코드 사이즈 최적화 옵션은 -Os, 실행 시간 최적화 옵션은 -Ofast 다.