2012-02-10 4 views
3

x86-64 Red Hat Linux 용 GCC 4.4.4를 사용하여 컴파일 된 이진 파일 (C 프로그램)을 다운로드했습니다.이진 파일 실행

GCC 4.2.1을 실행하는 Mac OS X (실행중인 Lion도 x86-64)에서 실행하려고하면 정상적으로 작동합니까? cannot execute binary file? 이진 파일로 검색 할 수 없습니다.

왜 그렇게할까요? 파일이 이미 컴파일 되었기 때문에 gcc 버전과 아무 관계가 없다고 생각합니다. 두 시스템이 모두 실행되는 x86-64 용으로 컴파일되었습니다. 누군가 설명해 주시겠습니까?

답변

8

특정 OS 용으로 컴파일 된 바이너리가 다른 OS에서 실행될 가능성은 거의 없습니다. Mac 용 바이너리를 구하거나 원본을 가져 와서 직접 컴파일하십시오.

libc 및 libstdC++의 버전, .so 라이브러리의 버전 - OS 자체와 다른 API 인터페이스의 차이가있을 수 있습니다. 또는 다른 바이너리 형식 (예 : VMS 바이너리가 AIX에서 실행되지 않음).

+0

x86-64를 실행하지 마십시오? 어떤 의미에서 컴파일러는 x86 어셈블리 (두 시스템에서 모두 동일 함)로 컴파일합니다. 그렇다면 어셈블러가 어셈블리 코드를 각 시스템의 다른 바이너리 파일로 변환한다는 의미일까요? – darksky

+1

실제 지침에 대한 컴파일 결과는 동일하지만 Nayefc OS가 있다고 말할 수 있습니다. 먼저 모든 전역 변수로 실행 파일을 배치 한 다음 함수, 하드 코드 된 텍스트 문자열을 원하는지 결정할 수 있습니다. 이제 Adrian OS를 작성했습니다. 처음에는 함수가 먼저 나온 후 27680 바이트의 간격이 생겼습니다. (내가 좋아하기 때문에) ..- 요점을 얻었습니다. 따라서 Windows EXE는 Linux exe와 다를 수 있으며 Mac exe가 가능합니다 –

0

이 의미의 바이너리는 프로그램에 운영 체제 호출로 귀결되는 printf()가있을 때 운영 체제 호출을 만들기 위해 컴파일됩니다. 만약 컴파일 된 운영체제가 64 비트 레드햇 리눅스라고한다면, 바이너리는 레드햇 리눅스 경로에서 공유 라이브러리를위한 레드햇 리눅스 이름을 찾을 것입니다. 완전히 다른 운영체제, Mac OS X, 시스템 호출, 공유 라이브러리 또는 정적 라이브러리 등과는 어떤 방식 으로든 모양이나 형태가 전혀 다릅니다. 미니 쿠퍼에서 벗어나 그것을 볼트로 연결하는 것 자전거에. 예, 한 번에 그것이 원시 금속과 고무 였고 자전거 타이어로 형성 될 수있었습니다. 그러나 일단 바이너리, 자동차 타이어 또는 자전거 타이어를 만들면 그것이 바로 그 것입니다. 때로는 posix 시스템 상단에 창을 에뮬레이트하는 와인과 같은 에뮬레이터가 있습니다. 또는 전체 컴퓨터를 가상화하여 다른 운영 체제를 다른 운영 체제에서 실행시킬 수있는 vmware와 같은 가상 시스템입니다.

일반적으로 이전의 C 프로그램을 사용하지 않고 gcc 컴파일러가있는 운영 체제에서 컴파일하고 실행할 수는 없습니다. 네, 이식 가능한 C 프로그램을 작성하는 방법을 배울 수 있지만 모든 대상 플랫폼에서 지원되는 라이브러리를 신중하게 사용해야합니다. 그래서 심지어 귀하의 프로그램에 대한 소스 코드를 가지고 Mac으로 컴파일하고 컴파일하는 것이 반드시 작동하지는 않습니다.

+0

하지만 x86-64를 실행하지 마십시오? 어떤 의미에서 컴파일러는 x86 어셈블리 (두 시스템에서 모두 동일 함)로 컴파일합니다. 그렇다면 어셈블러가 어셈블리 코드를 각 시스템의 다른 바이너리 파일로 변환한다는 의미일까요? – darksky

+0

어셈블러와 컴파일러는 아무 관련이 없습니다. 해당 플랫폼의 시스템 라이브러리는 리눅스이고 macos는 고무 타이어와 금속 휠이 다른 크기의 차량에 맞게 만들어지는 것과 같은 방식으로 다른 플랫폼입니다. 동일한 브랜드가 타이어와 휠의 측면에있을 수 있으며 동일한 기계공이 타이어를 설치할 수 있습니다. 운영 체제가 동일하다면 windows와 linux와 macos 등이 없어야합니다. –

+0

순수한 의미의 어셈블러와 컴파일러와 링커는 x86-64라는 것을 알아야합니다. 예를 들어 printf로 hello world 프로그램을 만든다. C 라이브러리의 많은 부분조차도 플랫폼 전반에 걸쳐 일관되고 이식성이 뛰어나지 만, 프로그램에있는 C 라이브러리 계층은 다른면을 가지고 있으며, 다른면은 C 라이브러리가 운영 체제와 상호 작용하는 곳이며, 다른 곳에서는 사물이 서로 다릅니다 C 라이브러리 측이나 운영 체제 측 또는 둘 모두가 궁극적으로 이식성이없는 특정 운영 체제에 대한 시스템 호출을 만들기 위해이를 사용자 정의해야합니다. –

2

Rad Hat Linux와 Mac OS X 모두 'Unix 기반'이지만 서로의 바이너리를 실행할 수 없습니다. Mac에서 Windows 바이너리를 실행할 수없는 것과 마찬가지입니다.

11

다른 바이너리 형식이 있습니다. Linux 시스템은 실행 파일과 라이브러리에 ELF을 사용하지만 Mac OS X은 Mach-O format을 사용합니다. Windows는 또 다른 스틸을 사용합니다 : PE format.