AIX xlc 컴파일러 비트 설정
해당 부분은 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가 명시된다.