컴파일러 관점에서의 목적 파일(object file)이 무엇인지 궁금합니다.

HDNua의 이미지

안녕하세요. KLDP에 오랜만에 들르는 ★병장★ HDNua입니다 (아유 부끄러워라)

이전에 Javascript를 이용해 컴파일러를 개발하고 있다고 난리를 친 적이 있습니다.
중간에 해결이 안 된 부분이 있어서 잠시 보류했던 게 벌써 몇 달이 되고
한 세 달 정도는 진척 없는 상태로 놀고 있었던 것 같네요.

제가 이번에 이 질문을 올리는 건 해결이 안 된 부분을 제대로 질문할 수 있게 되었기 때문입니다.

-----

이전에 제가 빌더를 개발하기 위해 한 작업은 다음과 같습니다.
1. CPU 모듈 작성 (완료)
2. CPU 모듈을 기반으로 작성된 어셈블리를 실행하는 Runner 모듈 작성 (완료)
3. Runner에서 실행 가능하게끔 작성한 어셈블리를 연결하는 Linker 모듈 작성 (완료)
그러니까 지금 이미 링커는 재활용 가능한 수준으로 구현이 된 정도입니다.

문제는 두 개 이상의 파일에 함수의 선언과 본문이 분리된 경우였습니다.

// main.c
#include <stdio.h>
void myprint1(const char *s);
void myprint2(const char *s);
int main() {
 myprint1("Hello, world! 1\n");
 myprint2("Hello, world! 2\n");
 return 0;
}
// myprint.c
#include <stdio.h>
void myprint1(const char *s) {
 puts(s);
}
void myprint2(const char *s) {
 puts(s);
}
// myprint_error.c
#include <stdio.h>
void myprint1(const char *s) {
 puts(s);
}
void myprint2(double d) { // 링크 에러
 printf("%lf", d);
}

만약 위 세 개의 소스가 컴파일 과정을 거친다면, main.o, myprint.o, myprint_error.o의 세 가지 목적 파일이 나올 것입니다.
세 개의 파일 모두 컴파일 시에 문제가 없지만,
1) main.o와 myprint.o의 링크는 성공합니다.
2) main.o와 myprint_error.o의 링크는 형식이 다르다는 에러를 내놓고 실패합니다.

저는 여기서 목적 파일이, 함수의 원형이나 구조체의 멤버와 같은 정보들을 기록하고 있다고 생각했습니다.
그런데 이전까지 저는, 목적 파일이 코드가 모두 어셈블리로 번역된 바이너리 파일이라고 생각하고 있었고
그래서 함수의 원형, 구조체를 표현하는 어셈블리가 있을 것이라 생각해서 이를 찾았습니다. 결과는 실패였구요.
여기서 막혀서 한참을 있었습니다. 어셈블리에 대해 이해가 부족한가 싶어 Irvine의 x86 어셈블리를 한참 뒤졌네요.

1. 일반적인 목적 파일에는 어떤 정보가, "어떻게 기록되는지" 궁금합니다.
이것이 빌더 개발자의 마음인지 궁금합니다. 목적 파일이라는 것이 어떤 정해진 형식이 있는 것이 아니라
빌더 개발자가 컴파일할 때 목적 파일을 어떻게 만들 것이라고 정해놓고, 그에 따라
링커가 이 목적 파일을 이런 식으로 링크해라 라고 만들어진 건지가 궁금해졌습니다.
(링커A는 컴파일러A의 목적 파일을 링크할 수 있지만 컴파일러B의 목적 파일을 링크할 수는 없을 수도 있을까 하는 질문입니다.)

2. 오늘에서야, 어쩌면 목적 파일에 함수의 원형은 문자열 형태로 보존해도 좋지 않을까 하는 생각을 해봤습니다.

; myprint_error.o
...
; not compiled sentences
void myprint1(const char *);
void myprint2(double);
; code area start
.code
call main
exit
main proc
...
main endp
end main

1번의 질문처럼 제 마음대로 목적 파일을 작성해도 된다면, 이런 형태는 일반적으로 사용되는지 궁금합니다.
(물론 이게 맞을 거라고 주장하는 건 아닙니다. 이럴 수도 있다고 생각을 해봤다는 거라..)

무엇이 궁금한 지가 나름 명확해졌다고 생각해서 고민 끝에 질문 올립니다.
KLDP 여러분의 도움을 청합니다. 읽어주셔서 감사합니다.

kukyakya의 이미지

오브젝트파일에는 각 함수의 컴파일된 바이너리(와 기타 정보)가 포맷에 따라 저장됩니다. 이에 대해서는 ELF format이나 기타 오브젝트파일 포맷을 참고하시고,

보통 구조체의 형식은 기계어로 따로 저장되지 않습니다. 구조체는 사람이 사용하기 편하도록 기본 자료형을 aggregate해 놓은 형식에 불과하므로, 기계어 레벨에서는 주어진 오브젝트의 위치와 사용하고자 하는 멤버의 offset만을 이용하여 메모리에 바로 접근합니다.

작성자분의 백그라운드를 알 수 없어 이런 말씀 드리긴 매우 송구스럽습니다만, 컴퓨터 구조 개론과 arm이나 mips 같은 구조가 간단한 CPU에 대해서 살펴보신 후에 작업을 진행하시는 것이 어떠할까 합니다.

HDNua의 이미지

ELF Format, MIPS 이 두 개에 대해 더 찾아봐야겠습니다.

저는 이렇게 생각했습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.