programing

C의 객체 파일이 뭐죠?

firstcheck 2022. 7. 16. 08:35
반응형

C의 객체 파일이 뭐죠?

C에 있는 라이브러리에 대해 읽고 있지만 오브젝트 파일이 무엇인지에 대한 설명을 아직 찾지 못했습니다.컴파일된 다른 파일과 오브젝트 파일의 실제 차이점은 무엇입니까?
누군가 인간의 언어로 설명해 주었으면 좋겠어요.

오브젝트 파일은 컴파일 단계에서의 실제 출력입니다.대부분 기계 코드이지만 링커에 의해 동작하기 위해 필요한 기호뿐만 아니라 어떤 기호가 있는지 확인할 수 있는 정보가 포함되어 있습니다(참고로 "symbols"는 기본적으로 글로벌 객체, 함수 등의 이름입니다).

링커는 이러한 모든 오브젝트파일을 조합하여 하나의 실행파일을 형성합니다(복제하거나 정의되지 않은 기호가 없는 것으로 가정합니다).많은 컴파일러가 명령줄 옵션을 사용하여 "컴파일만"하도록 지시하지 않으면 이 기능을 수행합니다(읽기: 링커는 스스로 실행).(-c는 일반적인 "컴파일만 하고 링크하지 마세요" 옵션입니다.)

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

  2. 실행 파일은 오브젝트 파일을 링크함으로써 형성됩니다.

  3. 개체 파일에는 CPU에서 인식할 수 있는 낮은 수준의 명령이 포함되어 있습니다.그래서 기계코드라고도 불립니다.

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

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

-->는 사전 테스트를 거칩니다.

--> 최적화 코드를 부여합니다(아직 C에 있습니다).

--> 컴파일러 경유

--> 어셈블리 코드를 부여합니다.

--> 어셈블러를 통과합니다.

--> OBJECT FILES에 저장되어 있는 기계어로 코드를 지정합니다.

--> 링커를 통과합니다.

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

예를 들어 대부분의 컴파일러는 어셈블러를 거치지 않고 기계어 코드를 직접 생성할 수 있습니다.마찬가지로 전처리를 대신 할 수도 있습니다.그래도 이해를 돕기 위해 유권자들을 분열시키는 것은 좋은 일이다.

오브젝트 파일은 3종류가 있습니다.

재배치 가능한 개체 파일

실행 가능한 개체 파일을 형성하기 위해 링크 시 재배치 가능한 다른 개체 파일과 결합할 수 있는 형식의 기계 코드를 포함합니다.

를 가지고 있는 경우a.c소스 파일을 작성하려면 다음 작업을 수행해야 합니다.gcc a.c -c

완전한 프로세스는 다음과 같습니다.프리프로세서(cpp)는 a.c. 상에서 동작합니다.출력(스틸 소스)은 컴파일러(cc1)에 공급됩니다.그 출력(어셈블리)은 어셈블러(as)로 공급되며, 이 출력은relocatable object file이 파일에는 오브젝트 코드와 링크(및 디버깅)가 포함되어 있습니다.-g사용된) 메타데이터이며 직접 실행할 수 없습니다.

공유 객체 파일

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

실행 가능한 오브젝트 파일

(로더에 의해) 메모리에 직접 로드된 후 나중에 실행할 수 있는 기계 코드를 포함합니다.

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

보너스 읽기:

에 대해 링크하는 경우static library입력 개체에서 참조되는 함수는 최종 실행 파일에 복사됩니다.와 함께dynamic libraries대신 라이브러리의 함수/실행과 동적으로 연결할 수 있는 기호 테이블이 생성됩니다.따라서 결과는 라이브러리에 따라 달라지기 때문에 부분적으로 실행 가능한 객체 파일이 됩니다.라이브러리가 존재하지 않으면 파일을 실행할 수 없습니다).

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

명령어는 다음과 같습니다.gcc a.c -o myexecutable는 포인트 1 및 포인트3에서 언급된 모든 명령어를 호출합니다(cpp -> cc1 -> as -> ld1).

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

오브젝트 파일은 1개(또는 여러 개)의 소스 파일을 컴파일 했을 때 얻을 수 있는 파일입니다.

완전한 실행 파일, 라이브러리 또는 중간 파일 중 하나입니다.

오브젝트 파일에는 보통 네이티브코드, 링커 정보, 디버깅 기호 등이 포함됩니다.

오브젝트 파일은 프로그램을 실행하기 위한 함수, 기호 및 텍스트에 의존하는 코드입니다.다른 텔렉스 기계로 신호를 보내기 위해 텔레타이핑을 해야 했던 오래된 텔렉스 기계처럼 말이다.

프로세서가 바이너리 코드를 실행해야 하는 것과 마찬가지로 오브젝트 파일은 바이너리 코드와 같지만 링크되어 있지 않습니다.링크를 사용하면 추가 파일이 생성되므로 사용자가 C 언어를 직접 컴파일할 필요가 없습니다.오브젝트 파일이 c language 또는 vb 등의 컴파일러와 링크되면 사용자는 exe 파일을 직접 열 수 있습니다.

언급URL : https://stackoverflow.com/questions/7718299/whats-an-object-file-in-c

반응형