"object file"에서 "object"란 무엇이며, 왜 이렇게 불리나요?
"'객체 파일'이란 무엇인가?"라는 질문을 받았습니다.
위키를 보고 나니 사물이 포함되어 있다는 것만 알고 있습니다.
하지만 그 물건들은 무엇이고 왜 누군가가 그것들을 그렇게 불렀을까요?
객체 파일(또는 객체 코드)은 컴파일러가 소스 코드로부터 생성한 기계 코드 파일입니다.
실행 파일과 다른 점은 개체 파일이 연결되어 있지 않기 때문에 함수, 기호 등에 대한 참조가 아직 정의되지 않았다는 것입니다(기본적으로 메모리 주소는 비워 둡니다).
GCC로 C 파일을 컴파일할 때:
gcc -Wall -o test test.c
여기에 컴파일 및 링크가 있습니다.따라서 기호(라이브러리, 헤더 등)에 대한 모든 메모리 주소 참조를 포함하는 실행 파일이 표시됩니다.
하지만 이렇게 할 때는
gcc -Wall -o test.o -c test.c
파일을 생성하고 오브젝트 파일을 생성합니다.기계 코드이기도 하지만 실행 파일이나 라이브러리를 생성하기 위해서는 링크가 필요할 것입니다.
예를 들어, C 파일이 많은 프로젝트가 있을 때, 각각의 파일을 객체 코드로 컴파일한 다음, 모든 객체 파일을 연결하여 최종 제품을 만듭니다.
예를 들어 다음과 같습니다.
gcc -Wall -o foo.o -c foo.c // Object file for foo.c
gcc -Wall -o bar.o -c bar.c // Object file for bar.c
gcc -Wall -o main.o -c main.c // Object file for main.c
gcc -Wall -o software foo.o bar.o main.o // Executable (foo + bar + main)
개체라는 용어는 (기본적으로) 연결되지 않은 기계 코드의 시퀀스를 나타냅니다.개체 파일에 개체가 들어 있습니다.
왜 그런 전화냐고 물으셨잖아요.대답을 잘 못 하겠어요.왜 "blue"가 "blue"로 명명되었습니까? ;)
그 때부터 사용된 용어입니다...음, 수십년은...
참고로, GCC 내부 문서에서는 객체 코드를 다음과 같이 정의합니다.
저작물에 대한 "소스 코드"는 저작물을 수정하기 위해 선호되는 저작물 형태를 의미합니다."객체 코드"는 저작물의 출처가 아닌 형태를 의미합니다.
역사적인 이유에 대해서는 꽤 모호하지만...
이제 객체 파일이 무엇인지 더 잘 이해해 주시기를 바랄 뿐입니다.왜 그렇게 불리는지 아는 것보다 더 중요하다고 생각해요. 말은 그냥, 음, 말이란...
저는 이 이름이 다음을 구별하는 것과 관련이 있다고 생각합니다.
- 인간을 위한 코드 -- 소스 코드
- 컴퓨터용 코드 -- 개체 코드
개체 파일에는 다음이 포함됩니다.
- 헤더 정보 : 코드의 크기, 번역한 원본 파일의 이름, 작성 날짜 등 파일에 대한 전반적인 정보입니다.
- 객체 코드: 컴파일러나 어셈블러가 생성한 이진 명령어와 데이터.
- 재배치:링커가 개체 코드의 주소를 변경할 때 수정해야 하는 개체 코드의 위치 목록입니다.
- 기호: 이 모듈에 정의된 전역 기호, 다른 모듈에서 가져오거나 링커에서 정의할 기호.
- 디버깅 정보:개체 코드에 대한 기타 정보는 링크에 필요하지 않지만 디버거에 사용할 수 있습니다.여기에는 소스 파일 및 라인 번호 정보, 로컬 기호, 객체 코드에서 사용하는 데이터 구조에 대한 설명(예: C 구조 정의)이 포함됩니다.
출처 : 여기
개체 파일은 원본(텍스트) 파일의 이진법 표현입니다.데이터 유형을 다음과 같이 분류하는 다양한 섹션 모음입니다.
- 텍스트 섹션
- 자료구간
- 겹겹이 쌓다
- 산더미같이 쌓이다
컴파일러/환경에 따라 다를 수 있습니다.
예: *nix 시스템의 경우:
objdump -da.out <--- 우리가 a.cpp를 컴파일했다고 제공합니다.
disassembly of section .init:
08048278 <_init>:
8048278: 55 push %ebp
8048279: 89 e5 mov %esp,%ebp
804827b: 83 ec 08 sub $0x8,%esp
804827e: e8 61 00 00 00 call 80482e4 <call_gmon_start>
8048283: e8 b3 00 00 00 call 804833b <frame_dummy>
8048288: e8 9f 01 00 00 call 804842c <__do_global_ctors_aux>
804828d: c9 leave
804828e: c3 ret
Disassembly of section .plt:
08048290 <puts@plt-0x10>:
8048290: ff 35 78 95 04 08 pushl 0x8049578
8048296: ff 25 7c 95 04 08 jmp *0x804957c
804829c: 00 00 add %al,(%eax)
...
080482a0 <puts@plt>:
80482a0: ff 25 80 95 04 08 jmp *0x8049580
80482a6: 68 00 00 00 00 push $0x0
80482ab: e9 e0 ff ff ff jmp 8048290 <_init+0x18>
080482b0 <__libc_start_main@plt>:
80482b0: ff 25 84 95 04 08 jmp *0x8049584
80482b6: 68 08 00 00 00 push $0x8
80482bb: e9 d0 ff ff ff jmp 8048290 <_init+0x18>
Disassembly of section .text:
여기에 있는 다양한 호출 명령은 실제 기능을 호출하기 위해 다양한 라이브러리와 유사합니다.
링크한 페이지에 따르면 각 시퀀스 또는 개체에는 일반적으로 호스트 시스템이 일부 작업을 수행하도록 지시하는 내용이 포함되어 있으며 관련 데이터 및 메타데이터(예: 재배치 정보, 스택 해제 정보, 주석, 프로그램 기호, 디버깅 또는 프로파일링 정보)가 함께 포함되어 있을 수 있습니다.
기본적으로 객체 파일의 각 객체는 함수이며, 링커가 전체 프로그램에 포함시키기 위한 관련 정보입니다.
언급URL : https://stackoverflow.com/questions/8249945/what-is-object-in-object-file-and-why-is-it-called-this-way
'programing' 카테고리의 다른 글
| Excel 2010의 함수를 연결하여 작은 따옴표와 쉼표를 추가합니다. (0) | 2023.09.19 |
|---|---|
| MySQL에서 기본 키이기도 한 외부 키를 만드는 방법은? (0) | 2023.09.19 |
| WordPress Theme: 독립 실행형 테마 need index.php 파일 ERROR (0) | 2023.09.19 |
| Larravel 컨트롤러에서 Header Authorization 키를 가져오시겠습니까? (0) | 2023.09.19 |
| 이상적인 버퍼 크기는 얼마입니까? (0) | 2023.09.19 |