2013-01-13 3 views
7

먼저이 질문이 학교/숙제와 관련이 있다는 기록을 밝히고 싶습니다.컴퓨터 간의 C 오브젝트 파일 호환성

컴퓨터 CP1과 CP2가 모두 동일한 운영 체제와 기계어를 공유한다고 가정 해 보겠습니다. C 프로그램이 CP1에서 컴파일 된 경우 CP2로 이동하려면 소스 코드를 전송하고 CP2에서 다시 컴파일하거나 객체 파일을 전송해야합니다.

내 대답은 객체 파일로 충분하다는 것입니다. C 코드는 컴파일러에 의해 어셈블리로 변환되고 어셈블러에 의해 기계 코드로 어셈블됩니다. 아키텍처가 동일한 머신 코드와 운영 체제를 공유하기 때문에 문제가 발생하지 않습니다.

하지만 더 많이 생각할수록 혼란스러워지기 시작합니다.

내 질문은 : 그 파일이 아닌 실행 파일을 이의를 참조하기 때문에

A), 내가 거기를 가정하고있어 더 연결 없었다. CP2에서 링크 할 때 표면에 문제가 있습니까?

b) CP1에서 C11 표준을 사용했지만 CP2의 유일한 컴파일러가 C99 인 경우 중요합니까? 일단 코드가 컴파일/어셈블 된 후에는 이것이 부적절하다고 가정합니다.

c) 질문에 공유/동적 링크 라이브러리가 지정되어 있지 않습니다. 프로그램이 .dll/.so/.dylib 파일에 아무런 의존성이 없다면 이것은 실제로 작동 할 것입니다. 그렇지 않으면 CP2에서도 필요합니다.

너무 많은 문제가있는 것처럼 느껴지고, 모호한 질문을 생각하면 지금은 단순히 다시 컴파일하는 것이 더 안전 할 것이라고 생각합니다.

하프!

+0

컴퓨터간에 객체 파일을 복사하는 distcc는 C 언어의 경우에도 모든 노드에서 동일한 버전의 컴파일러를 사용하도록 권장합니다. – aschepler

답변

3

대답은 다릅니다. C 프로그램을 컴파일하고 다른 컴퓨터에 링크하기 위해 오브젝트 파일을 옮기면 작동 할 것입니다. 그러나 endianness 또는 name mangling과 같은 요인 때문에 프로그램을 의도 한대로 작동하지 않을 수 있으며 실행하려고하면 프로그램이 중단 될 수도 있습니다.

C11C99 컴파일러에서 지원하지 않지만 소스가 컴파일되고 어셈블 된 경우에는 문제가되지 않습니다.

소스가 한 컴퓨터에서 라이브러리로 컴파일되는 한 다른 컴퓨터에서 파일을 링크하거나 실행하지 않아도됩니다 (정적 라이브러리 만, 동적 라이브러리는 응용 프로그램을 실행하는 컴퓨터에 있어야 함). 이것은 프로그램이 의도 한대로 작동하지 않거나 충돌이 발생하지 않는 이전과 같은 문제가 발생하지 않도록 프로그램을 독립적으로 만들어야한다고 말했습니다.

이러한 문제가 발생하지 않도록 EABI을 지원하는 컴파일러를 사용할 수 있습니다. EABI를 지원하는 컴파일러는 다른 컴파일러에서 생성 된 코드와 호환되는 개체 코드를 생성하므로 개발자는 한 컴파일러에서 생성 된 라이브러리와 다른 컴파일러로 생성 된 개체 코드를 연결할 수 있습니다.

나는 이것을하기 위해 노력했지만, 많이하지는 않았다. 따라서 내 정보가 100 % 정확하지 않을 수 있습니다.

+0

"라이브러리가 필요하지 않습니다."- 정적 링크에만 해당됩니다. 다이나믹 라이브러리는 프로그램에 의해서만 참조되며 컴파일되지 않습니다. 누락 된 경우 프로그램이 시작되지 않습니다. –

+0

잡아 주셔서 감사합니다. – syb0rg

+0

Rev 2가 상당히 옳다. 네임 머글 링과 런타임 호환성에 대해 언급해야한다. 새로운 종류의 [ABI] (http://en.wikipedia.org)/wiki/Application_binary_interface)이 훨씬 뛰어나므로 툴체인을 다시 작성해야 할 가치가 있습니다. – jthill

1

a) 나는 이미 "객체 파일"이라는 용어가 링크 된 바이너리를 나타내는 데 사용된다는 말을 들었습니다. 다소 부정확하지만. 어쩌면 그들은 "바이너리"를 의미 할 수도 있습니다.다른 컴퓨터에서 링크하는 것은 다른 컴파일러를 사용하는 경우 문제가 될 수 있습니다. 오브젝트 파일 형식이 표준화되지 않은 한 확실하지 않습니다.

b) 정적으로 링크되어있는 경우 다른 표준 또는 컴파일러를 사용하여도 바이너리 코드는 중요하지 않습니다. 동적 lib의 함수에 의존하는 경우 문제가 발생할 수 있습니다. 어떤 대답을 c)뿐만 아니라 : 예, 이것은 문제가 될 것입니다. 필요한 버전의 동적 라이브러리가 모두 올바른 버전으로 설치되어 있지 않으면 프로그램이 시작되지 않습니다. 다시 연결 모드 (정적 대 동적)에 달려 있습니다.

0

Q : 컴퓨터 CP1과 CP2가 모두 동일한 운영 체제와 기계어를 공유한다고 가정 해 보겠습니다.

A : 그럼 당신은 두 컴퓨터 모두에서

Q를 같은 .EXE의의를 실행할 수 있습니다 : C 프로그램은 CP1에 컴파일 된 경우, CP2로 이동하기 위해서는 소스 코드

에게 전송하는 것이 필요하다

A : 아니오. 다시 컴파일하려면 소스 코드 만 있으면됩니다. 다른 호환되지 않는 CPU 및/또는 OS 인 경우 재 컴파일 만하면됩니다.

"개체 파일은"일반적으로 모든 프로그램 실행에 필요한되지 않습니다

http://en.wikipedia.org/wiki/Object_files

객체 파일은 일반적으로 직접 실행되지 않습니다 재배치 형식의 기계 코드 를 포함하는 파일입니다. 오브젝트 파일은 어셈블러, 컴파일러 또는 다른 언어 변환기 에 의해 생성되며 링커에 입력으로 사용됩니다.

"실행 프로그램"에는 하나 이상의 "공유 라이브러리"(일명 .dll 파일)가 필요할 수 있습니다. 이 경우 동일한 제한이 적용됩니다. 공유 라이브러리가 아직 상주하지 않은 경우 .exe와 함께 복사해야하며 CPU 및 OS 와도 호환되어야합니다.

마지막으로 "scripts"는 이 아니며은 다시 컴파일해야합니다. 스크립트를 컴퓨터간에 자유롭게 복사 할 수 있습니다. 그러나 각 컴퓨터에는 스크립트를 실행하는 "인터프리터"가 있어야합니다. Perl 스크립트에는 Perl 인터프리터, Python 스크립트, Python 인터프리터 등이 필요합니다.