오브젝트 코드를 사용하지 않는 언어가 있다면 어떤 평가를 받을 까요?

나빌레라의 이미지

C언어로 프로그래밍을 할 때 오브젝트 코드(파일)은 프로그래밍에 많은 도움을 줍니다.

가장 많이 쓰는 부분은 누가 뭐라고 해도 수많은 라이브러리 파일들을 링킹해서 사용하는 것이지요.

그래서 보통 실행파일이 만들어지는 과정을 설명하면

소스코드 ---(컴파일러)---> 어셈블리어 ---(어셈블러)---> 오브젝트 코드 ---(링커)---> 실행파일

이렇게 설명되곤 합니다.

이 오브젝트 코드(파일)의 형태(포멧)은 플랫폼 별로 혹은 링커에 따라 다양하게 존재합니다.

링커는 여러개의 오브젝트 파일을 재배치하여 하나의 기계어 파일(실행파일)로 만들어 주는 역할을 하지요.

전에 제가 올렸던 글에 쓴것 처럼 요즘 저만의 언어+컴파일러+vm을 만들고 있습니다.

그 과정에서 재배치 정책을 설계 하려다 보니 오브젝트 코드(파일)의 형태(포멧)을 정하는 부분이 참 애매하더라구요.

그래서 그냥 오브젝트 코드(파일) 없이

소스코드(고급언어로 작성된 코드, 여러개) ------> 심볼테이블을 포함하는 어셈블리 코드(여러개) ------> 심볼테이블에 따라 재배치를 완료하여 하나로 만들어지고 모든 레이블이 주소로 치환된 어셈블리 코드(한개) ------> 기계어 코드(한개)

이런식으로 정리되더라구요. 그러다 보니 저 위에 있는 '컴파일러 ---> 어셈블러 ---> 링커' 의 분류로 봤을 때, 어셈블러와 링커의 순서가 바뀌거나 혹은 어셈블러와 링커의 역할이 하나로 합쳐져 버리는 결과가 나와 버리는 겁니다.

그래서 고민입니다.

굳이 오브젝트 코드라는 단계를 만들어서 어셈블러와 링커의 역할을 확실히 분리 해야 하나...
아니면 그냥 저대로(즉, 제 맘대로) 진행해 버릴까...

한 삼일 정도 고민해 본 결과, 제 스타일대로 오브젝트 코드 없이 '레이블과 심볼테이블을 하나에 가지는 어셈블리 코드'(이것을 일종의 오브젝트 코드라고 볼 수도 있겠네요), '심볼테이블은 사라지고 레이블은 주소로 치환된 어셈블리 코드' 이렇게 나눠도 라이브러리 링킹같은 동작은 무리없이 될것 같거든요.
(라이브러리의 코드 보안과 같은 문제는 생각하지 않는다는 것을 전제로 두고 있습니다.)

다만 저렇게 될 경우 '컴파일러 ---> 링커 ---> 어셈블러' 이렇게 논리적인 동작순서가 일반적인 경우와 반대로 된다는 문제가 생기게 됩니다.

뭔가 제가 전제를 잘못하고 있는것 같기도 하고 해서, 이렇게 KLDP에 넋두리삼아 올려 보네요.

아직 코딩은 한줄도 하지 않고 저런 문제를 핑계로 일주일 넘게 vi 화면만 띄워놓고 있는 중입니다...^^

댓글

바라미의 이미지

만약 운영체제가 페이징을 사용하고 또한, 가상 메모리 시스템을 사용할 때, 특히 메모리가 부족해서 스왑에다가 넣어야할때..
컴파일이 아니라 런타임시 재배치가 불가능하면 프로그램 전체를 디스크에 놓거나, 아니면 프로그램 전체를 메모리에 놓거나 해야할텐데요.

오브젝트파일의 재배치 기능은 그런 것을 고려해서 재배치 가능하게 만든 것 같기도 하고요..

creativeidler의 이미지

일단 맘대로 해보고 문제가 생기면 바꾼다...라는 전략은 어떨까요?

gurugio의 이미지


오브젝트 파일이라는게 존재하는 이유가 뭘까요?
저는 그냥 당연하게만 써와서 막상 이 질문에 답을 하기가 어렵습니다.

가만 생각해보면 모든 소스가 링크되고 주소값이 결정될 때를 위해 필요한게 아닌가 생각됩니다.
각각의 소스마다 코드/데이터/BSS가 있다면
각각의 섹션들이 하나로 묶이기 전에 (꼭 하나로 묶여야 하느냐도 질문이 되겠네요)
각 섹션들의 정보들을 가지고 있는게 오브젝트 파일이 아닌가 생각됩니다.
그러다가 오브젝트들이 합쳐질때 심볼의 상대주소가 결정되구요.
(컴파일러쪽은 젬병이라 그냥 아는 한에서 생각해봤습니다.)

만약 제 가정에 일리가 있다면
"심볼테이블을 포함하는 어셈블리"가 오브젝트 파일의 정의와 같은게 아닐까요?
동적 링크를 위해 더 많은 정보가 필요해지고 그래서 오브젝트 포멧으로 발전하지 않을까 생각됩니다.

으...역시 전자과 출신의 한계가 드러나네요
저는 올해 디버거-컴파일러를 공부해서 작게라도 만들어보려고 합니다.
커널에 자체 디버깅 기능을 넣고 싶은데 완전히 무지한 부분이라서 공부를 더 하려구요.
혹시 개발하시다가 시간되시면 좋은 강좌 부탁드립니다 ;-)

----
섬기며 사랑하면 더 행복해집니다.
개인 홈페이지가 생겼습니다 http://caoskernel.org
어셈러브를 개편중입니다 http://www.asmlove.co.kr

owlet의 이미지

말씀하신대로 하면 소스 한줄만 고쳐도 전체 소스에 대해서 어셈블리 과정을 거쳐야 하지않나요?
프로젝트 규모가 커지면 좀 불편하지 않을까요?

avatar08의 이미지


동의!!
------------------------------------------------------------
아무것도 모르겠다.
소주나 먹읍시다
blogname : http://smgs2848.blogspot.com

------------------------------------------------------------
아무것도 모르겠다.
소주나 먹읍시다
blogname : http://smgs2848.blogspot.com

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.