C의 객체 파일은 무엇입니까?


140

C의 라이브러리에 대해 읽고 있지만 객체 파일이 무엇인지에 대한 설명을 아직 찾지 못했습니다. 다른 컴파일 된 파일과 객체 파일의 실제 차이점은 무엇입니까?
누군가가 인간의 언어로 설명 할 수 있다면 기쁠 것입니다.



답변:


153

객체 파일은 컴파일 단계의 실제 출력입니다. 주로 기계 코드이지만 링커가 작동하는 데 필요한 기호뿐만 아니라 어떤 기호가 들어 있는지 확인할 수있는 정보가 있습니다. 참고로 "기호"는 기본적으로 전역 객체, 함수 등의 이름입니다.

링커는 이러한 모든 객체 파일을 가져와 결합하여 하나의 실행 파일을 만듭니다 (예 : 중복되거나 정의되지 않은 심볼이 없다고 가정). 명령 줄 옵션을 사용하여 "컴파일 만"하도록 지시하지 않으면 많은 컴파일러가이 작업을 수행합니다 (읽기 : 링커 자체 실행). ( -c일반적인 "컴파일 만하고 링크하지 마십시오"옵션입니다.)


실제로 대부분의 컴파일러에서 컴파일 단계의 출력은 어셈블리 코드이며 컴파일러는이를 어셈블러를 호출하여 오브젝트 파일로 만듭니다.
Chris Dodd

15
@ChrisDodd : 오래된 컴파일러의 경우가 종종있었습니다. 요즘 컴파일러는 요청하지 않는 한 어셈블리 코드를 생성하지 않으며 종종 내부적으로 사용하지 않습니다. 그러나 어쨌든 어셈블리는 컴파일 단계의 하위 단계이므로 모든 것이 무의미합니다.
cHao

2
단일 객체 파일을 실행할 수 있습니까?

1
@Honey : 일반적으로 아니요. 오브젝트 파일이 실행을 위해 설계된 형식 (기본적으로는 절대 그렇지 않음)이더라도 "작동하기 위해 필요한 기호"에 관한 부분은 기본적으로 거래를 종료시킵니다. 표준 "hello world"조차도 C 런타임 라이브러리에 연결해야합니다.
cHao

74
  1. 오브젝트 파일은 컴파일 된 파일 자체입니다. 둘 사이에는 차이가 없습니다.

  2. 실행 파일은 Object 파일을 연결하여 형성됩니다.

  3. 객체 파일에는 CPU가 이해할 수있는 저수준 명령어가 포함되어 있습니다. 이것이 기계 코드라고도하는 이유입니다.

  4. 이 낮은 수준의 기계어 코드는 어셈블리 언어를 사용하여 직접 작성한 다음 어셈블러를 사용하여 어셈블리 언어 코드 (영어로 표시)를 기계 언어 (16 진수로 표시)로 처리 할 수있는 명령어의 이진 표현입니다.

다음은 C와 같은 고급 언어 코드의이 프로세스에 대한 일반적인 고급 흐름입니다.

-> 전 처리기 통과

-> 여전히 C로 최적화 된 코드를 제공

-> 컴파일러 통과

-> 어셈블리 코드를 제공

-> 어셈블러 통과

-> 객체 파일에 저장된 기계 언어로 코드를 제공

-> 링커 통과

-> 실행 파일을 가져옵니다.

이 흐름에는 몇 가지 변형이있을 수 있습니다. 예를 들어 대부분의 컴파일러는 어셈블러를 거치지 않고 기계어 코드를 직접 생성 할 수 있습니다. 마찬가지로, 그들은 당신을 위해 전처리를 할 수 있습니다. 그럼에도 불구하고 더 나은 이해를 위해 구성 요소를 분해하는 것이 좋습니다.


5
최적화 된 코드는 전 처리기 단계에서 또는 그 직후에 생성되지 않습니다. 전처리 기는 자신의 언어 만 다룰뿐입니다. 컴파일 및 조립 단계에서 최적화가 수행됩니다.
Ignas2526

컴파일 후에 얻은 객체 파일은 기계 언어의 실행 파일과 동일합니다. 객체 파일이 마지막 단계에서 두 번째 단계에서 생성되고 마지막 단계가 실행 파일이기 때문에 혼란 스럽습니다. 컴파일 후 얻는 .0 파일은 실행 파일입니까?
AV94

단일 객체 파일도 실행할 수 없습니까?

33

3 가지 종류의 객체 파일이 있습니다.

재배치 가능한 객체 파일

실행 가능한 객체 파일을 형성하기 위해 링크 타임에 다른 재배치 가능한 객체 파일과 결합 할 수있는 형태로 기계 코드를 포함합니다.

a.c소스 파일 이있는 경우 GCC로 오브젝트 파일을 작성하려면 다음을 실행해야합니다. gcc a.c -c

전체 프로세스는 다음과 같습니다. 전 처리기 (cpp)는 ac를 통해 실행됩니다. 출력 (여전한 소스)은 컴파일러 (cc1)로 공급됩니다. 출력 (어셈블리)은 어셈블러 (as)로 공급되어을 생성합니다 relocatable object file. 이 파일에는 객체 코드 및 링크 (및 -g사용 된 경우 디버깅 ) 메타 데이터가 포함되며 직접 실행 가능하지 않습니다.

공유 객체 파일

로드시 또는 런타임에 동적으로로드 할 수있는 특수 유형의 재배치 가능 오브젝트 파일. 공유 라이브러리는 이러한 종류의 개체의 예입니다.

실행 가능한 객체 파일

로더에 의해 메모리에 직접로드되고 (예 : execve ) 나중에 실행될 수있는 머신 코드를 포함합니다 .

여러 개에서 링커를 실행 한 결과 relocatable object filesexecutable object file입니다. 링커는 모든 동일한 유형의 입력 섹션 (예 :) .data을 동일한 유형의 출력 섹션 에 병합하여 명령 줄에서 왼쪽에서 오른쪽으로 모든 입력 개체 파일을 병합합니다 . 그것은 사용 symbol resolution하고 relocation.

보너스 읽기 :

static library입력 개체에서 참조되는 함수 에 대한 링크 는 최종 실행 파일로 복사됩니다. 함께 dynamic libraries심볼 테이블 대신 생성되는 라이브러리의 기능 / 전역으로 연결하는 동적 수있게된다. 따라서 결과는 라이브러리에 따라 부분적으로 실행 가능한 오브젝트 파일입니다. 라이브러리가 존재하지 않으면 파일을 더 이상 실행할 수 없습니다.

연결 프로세스는 다음과 같이 수행 할 수 있습니다. ld a.o -o myexecutable

명령 : gcc a.c -o myexecutable1 지점과 3 지점에서 언급 된 모든 명령 을 호출합니다 (cpp-> cc1-> as-> ld 1 )

1 : 실제로는 ld의 래퍼 인 collect2입니다.


11

객체 파일은 하나 또는 여러 개의 소스 파일을 컴파일 할 때 얻는 것입니다.

완전히 완료된 실행 파일 또는 라이브러리이거나 중간 파일 일 수 있습니다.

객체 파일에는 일반적으로 네이티브 코드, 링커 정보, 디버깅 심볼 등이 포함됩니다.


2

객체 파일은 프로그램을 실행하기 위해 기능, 기호 및 텍스트에 의존하는 코드입니다. 다른 텔렉스 기기로 신호를 보내려면 텔레 타이핑이 필요한 구형 텔렉스 기기와 같습니다.

프로세서가 실행하기 위해 이진 코드를 요구하는 것과 같은 방식으로, 객체 파일은 이진 코드와 유사하지만 링크되지는 않습니다. 링크는 사용자가 C 언어 자체를 컴파일 할 필요가 없도록 추가 파일을 작성합니다. 객체 파일이 c language 또는 vb 등과 같은 컴파일러와 연결되면 exe 파일을 직접 열 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.