2010-03-13 8 views
11

최근 Mac에서 다른 라이브러리를 사용하는 호환되지 않는 라이브러리 아키텍처에 대한 오류가있는 오픈 소스 라이브러리를 컴파일하는 중 일부 문제가 발생했습니다. 누군가 특정 아키텍처에 대한 C 프로그램을 컴파일하는 개념을 설명 할 수 있습니까? 나는 전에 -arch 컴파일러 플래그를 보았고, "CPU"언어에 매핑한다고 가정하는 ppc, i386x86_64과 같은 값이 전달 된 것을 보았습니다. 그러나 여기서 나의 이해는 멈 춥니 다. 한 프로그램에서 특정 아키텍처를 사용하는 경우로드하는 모든 라이브러리도 동일한 아키텍처에 있어야합니까? 주어진 프로그램/프로세스가 어떤 아키텍처에서 실행되고 있는지 어떻게 알 수 있습니까?특정 아키텍처의 C 프로그램 컴파일

답변

13

누군가 특정 아키텍처의 C 프로그램을 컴파일하는 개념을 설명 할 수 있습니까?

예. 이 아이디어는 C를 이진 형식으로 코딩 된 프로그램이있는 고유 한 기계 명령어 시퀀스로 변환하는 것입니다. 여기서 "아키텍처"의 의미는 명령어가 바이너리로 코딩되는 방식 인 "명령어 세트 아키텍처"입니다. 예를 들어, 모든 아키텍처에는 두 개의 정수를 더하는 명령어를 코딩하는 고유 한 방식이 있습니다.

기계 명령어로 컴파일하는 이유는 명령어가 매우 빠르게 실행된다는 것입니다.

하나의 프로그램이 특정 아키텍처를 사용하는 경우로드하는 모든 라이브러리도 동일한 아키텍처에 있어야합니까?

예. (예외는 있지만 드물다.)

주어진 프로그램/프로세스가 실행중인 아키텍처를 어떻게 알 수 있습니까?프로세스가 하드웨어에서 실행중인 경우 인간의 독자 uname -a의 출력이 더 많은 정보를 수 있지만

, 그것은, 유닉스 명령 uname -m을 실행하여 발견 할 수있는 기본 아키텍처에서 실행되고 있습니다.

당신은 실행 가능한 바이너리 또는 공유 라이브러리 (.so를 파일)이있는 경우, 당신은 file 명령을 사용하여 구조를 발견 할 수 있습니다 :

% file /lib/libm-2.10.2.so 
/lib/libm-2.10.2.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped 
% file /bin/ls 
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped 

당신이 바이너리는 아주 오래된 컴파일 된 것을 볼 수 있습니다 내 하드웨어가 더 현대적인 i686이지만 80386 아키텍처. i686 (Pentium Pro)은 80386과 호환되며 80386 바이너리와 원시 바이너리를 실행합니다. 이러한 역 호환성을 가능하게하기 위해 인텔은 많은 문제와 비용으로 —으로 갔지만 실제로는 데스크톱 CPU로 시장을 공략했기 때문에 가치가있었습니다.

1

CPU와 다른 아키텍처를 구현하려면 크로스 컴파일러가 필요합니다. 즉, 생성 된 코드가 사용자가 앉아있는 컴퓨터에서 네이티브로 실행할 수 없음을 의미합니다. GCC는 이걸 잘 할 수 있습니다. 프로그램이 빌드 된 아키텍처를 확인하려면 파일 명령을 확인하십시오. Linux 기반 시스템에서 적어도 32 비트 x86 프로그램은 32 비트 x86 라이브러리가 필요합니다. 나는 그것이 대부분의 OS에 대해 같다고 생각한다.

3

여기서 혼란 스러울 수있는 점은 Mac 플랫폼에 실제로 universal binary이라고 부르는 내용이 있다는 것입니다.이 내용은 실제로 하나의 아카이브에서 2 개의 바이너리로, 하나는 Intel 용이고 다른 하나는 ppc 아키텍처 용입니다. 컴퓨터가 실행할 컴퓨터를 자동으로 결정합니다. 에뮬레이션 모드에서 다른 아키텍처 용 바이너리를 실행할 수 있으며 일부 아키텍처는 다른 아키텍처의 상위 집합입니다 (즉, i386 코드는 일반적으로 i486, i586, i686 등에서 실행됩니다).하지만 대부분의 경우 유일한 코드입니다 당신은 당신의 프로세서 아키텍처를위한 코드를 실행할 수 있습니다.

크로스 컴파일의 경우 프로그램뿐 아니라 사용하는 모든 라이브러리가 대상 프로세서와 호환되어야합니다. 때로는 두 번째 컴파일러가 설치되는 것을 의미합니다. 가끔은 컴파일러에 맞는 적절한 추가 모듈을 제공하는 것입니다. gcc is actually a seperate executable, though it can sometimes be accessed via a command line switch 용 교차 컴파일러. 다양한 아키텍처를위한 gcc 크로스 컴파일러는 개별 설치가 가능합니다.

1

ldd이 경우 도움이 되나요?

관련 문제