OS/AIX::

AIX xlc 컴파일러 비트 설정

장피디 2014. 1. 9. 15:30
반응형


해당 부분은 AIX 전용 컴파일러인 xlc와 xlc의 컴파일 옵션을 사용하여 컴파일 하는 방식에 대해 소개합니다.


정적/동적 라이브러리를 생성하기 전 오브젝트(.o) 파일을 먼저 생성해야 한다.

해당 오브젝트 파일을 생성할 때 해당 오브젝트가 32비트/64비트인지 결정해야 하는데 시스템에 기본적으로 설정되어 있는 OBJECT_MODE에 따라 컴파일 옵션을 입력하지 않았을 때 기본 적용되는 비트 숫자가 다르다. 만약 명시적으로 컴파일 비트 숫자를 기입하려면 아래를 참고.


-q64 : 64비트 컴파일 옵션

-q32 : 32비트 컴파일 옵션

-qarch : 64비트 서브옵션 지원


만약 일관성 없이 해당 부분이 미지정 된다면 다음의 우선순위로 비트가 결정된다.


1. OBJECT_MODE 환경변수

2. 환경설정 파일

3. 명령행 옵션


-qarch 옵션과 함께 사용할 때 이 옵션은 목표하는 아키텍쳐 용으로 기계어와 모드를 결정하게 되는데, -q32, -q64옵션은 -qarch 옵션보다 우선순위가 높다. 그리고 한 줄에 -q32와 -q64 옵션을 모두 써주면 최종적으로 써준 옵션에 따라 모드가 결정된다. -qarch=com 으로 하면 앞으로의 호환성을 위해 좀더 일반적인 기계어를 사용하고 이외에는 특정 아키텍쳐에 많이 의존하게 된다.


64bit 모드에서 -qarch=com 은 -qarch=ppc 와 동일하게 취급된다.


컴파일할 때마다 매번 모드를 일일이 지정해줘야 한다면 매우 귀찮은 작업이 될 것이다.

(예를 들어 링킹 단계에서 일일이 32bit와 64bit를 구분해줘야 한다고 해보자) 

만약 개발 중 오직 한가지 모드로만 컴파일한다면 OBJECT_MODE 환경변수를 디폴트 모드로 바꿔주면 된다. 

OBJECT_MODE 환경변수에 대입할 수 있는 값은 다음과 같다.


(unset) 32bit 오브젝트를 생성/사용한다.

32 32bit 오브젝트를 생성/사용한다.

64 64bit 오브젝트를 생성/사용한다.

32_64 32bit/64bit 오브젝트를 모두 허용한다.


컴파일러, 링커에서는 OBJECT_MODE=32_64 를 허용하지 않는다. 환경변수를 이와 같이 설정하면 다음과 같은 에러가 발생한다.

1501-254 OBJECT_MODE=32_64 is not a valid setting for the compiler.


OBJECT_MODE 환경변수를 사용하면 컴파일러나 링커뿐만 아니라 개발과정 중 필요한 다른 어플리케이션도 이 변수를 참고하는 경우가 있으므로 편리하게 사용할 수 있다.


단 디폴트 모드를 결정하기 위해 OBJECT_MODE를 사용하고 있는 것을 일반 사용자가 모르고 있다면 심각한 문제가 발생할 수 있다. 

예를 들어 OBJECT_MODE가 64bit로 설정되어 있을 때 사용자가 64bit로 설계되지 않은 프로그램을 컴파일한다면 자동으로 64bit 코드가 생긴다. 

따라서 컴파일하기 전 사용자는 반드시 OBJECT_MODE를 검사해야 하고 자기가 의도한 모드로 설정되어 있는지 확인해야 한다.


링커 ld는 디폴트로 -b32 옵션을 사용하며 32bit 링킹을 지원하고, -b64 옵션을 사용하면 64bit 링킹을 지원할 수 있다. 

컴파일러 드라이버는 기본적으로 -q32나 -q64 옵션을 보고 링킹 옵션을 결정하므로 특별히 링커 옵션을 따로 정해줄 필요는 없다.


다음 명령어는 오브젝트 파일을 다룰 때 사용 하며 디폴트로 오브젝트 파일을 32bit XCOFF(eXtended Common Object File Format)로 가정한다.


ar - 링커에서 사용하는 인덱스 처리된 라이브러리를 관리한다.

dump - 오브젝트 파일에서 선택한 영역을 덤프한다.

lorder - 오브젝트 라이브러리에서 멤버 파일의 가장 적당한 순서를 찾는다.

nm - 오브젝트 파일, 실행 파일, 오브젝트 파일 라이브러리에서 심볼에 대한 정보를 보여준다.

ranlib - 아카이브 라이브러리를 랜덤 라이브러리로 변환한다.

size - XCOFF 오브젝트 파일의 섹션 크기를 보여준다.

strip - 바인더와 심볼릭 디버그 프로그램에서 사용하는 정보를 제거해서 XCOFF 오브젝트 파일의 크기를 줄인다.


64bit XCOFF 오브젝트 포맷을 지원하기 위해 위 명령어에는 -X 옵션이 추가되었다. 

-X 옵션은 명령어가 검사할 오브젝트 파일의 타입을 지정하며 다음 값을 지정할 수 있다.


32 32bit 오브젝트 파일만을 처리한다.

64 64bit 오브젝트 파일만을 처리한다.


32_64 32bit / 64bit 오브젝트 파일을 모두 처리한다.

단 위 명령어는 모두 OBJECT_MODE 환경변수를 참고한다. 그러나 -X 옵션으로 지정한 값이 더 우선순위가 높다.

64bit 어플리케이션을 개발하기 전에 우선 그 어플리케이션에서 사용할 라이브러리도 역시 64bit인지 살펴보아야 한다. AIX에서 제공하는 대부분의 C/C++ 라이브러리는 하이브리드 모드 아카이브(32bit, 64bit 오브젝트가 모두 들어있다)지만 써드파티 제품인 경우에는 해당되지 않을 수 있다.


해당 파일이 몇 비트 오브젝트인지 확인하기 위해서는 file objecname.o 를 사용하면 확인할 수 있다.

64비트의 경우 출력부에 64-bit가 명시된다.


반응형