윈도우와 리눅스 사이에서 서로 실행되지 않는 이유에 대한 연구...

s_jeho의 이미지

에 대한 주제로 잡고 책을 붙든지도 거의 한달이 지났습니다.
만.. 시험이 겹쳐서 성과가 하나도 없네요..

얼마전부터 책을 뒤져뒤져 여러방면으로 알아보고는 있습니다만
제가 생각한게 맞는지 확인을해서 방향재설정을 해야할 필요성이
있기 때문에 질문드립니다.

거창하게 말할건 아니고, 같은 헬로월드 소스를 바탕으로
같은 gcc계열의 컴파일러로 컴파일을 했다고 할때
실행파일이 나오기 전까지의 파일들을 보고 비교하여 볼때
서로 바꿔서 이어서 컴파일을 해보면 에러가 뜹니다.

하지만 신기한건 어셈블리 상태나 목적파일 상태에서 윈도와 리눅스의
컴파일 결과물을 교환하여 이어서 컴파일 하면 에러가 뜨지만

전처리과정의 결과물은 서로 바꾸어서 컴파일을 하면 된다는것입니다.

가정이지만 링커와 로더에서 무언가 있지 않을까 생각했는데
전처리과정의 결과물을 교환하여 컴파일했을땐 문제가 없지만
어셈블과 오브젝트 파일에서만 교환시 문제가 생기는 걸로 보아
맞는것도 같고...

본래 커널과 컴파일러 두개를 모두 조사하려고 생각했습니다만
3일뒤가 중간검사라서 조금 빨리 진행시킬 필요가 있어
아시는 분의 도움을 구합니다..

윈도우와 리눅스간에 서로 컴파일이 되지 않는 문제를 저는
컴파일러에서 찾고 있었습니다만 OS의 커널에서의 문제라고도
볼수 있는지요?
뭐 실행파일을 놓고 보자면 그럴수도 있지만 단순히 컴파일하다
에러나는것이라 저는 링커와 로더 혹은 참조하는 라이브러리에서
문제가 생기는게 아닌가 생각했습니다...

졸려서 더 자세하게 쓰고싶어도 잘 안되네요;ㅅ;

아무튼 대략적으로 제가 생각하는 방향이 맞는지,
아니라면 어느부분에서 다시 조사해야 하는지 조언 부탁드립니다

pynoos의 이미지

컴파일러와 링커는 OS에 맞는 실행파일을 만들어 냅니다. 크로스 컴파일러까지 생각하면 컴파일러의 target os가 어떤것으로 설정되어 있느냐에 따라서 생성이 됩니다. gcc가 동일한 소스코드라고 생각되는 것을 동일한 CPU의 다른 OS에서 실행파일을 만들기까지에는 소스가 참조하는 설치되어 있는 헤더파일 및 c library와 관계가 있고, 지원하는 OS의 로더가 원하는 실행파일 형식 (PE, ELF..)이 다르면 실행이 되지 않습니다.

생각하는데 도움이 되시길..

thyoo의 이미지

PE, COFF, ELF등의 실행 Binary Format을
ABI(Application Binary Interface)라고 합니다.

동일한 마이크로 프로세서의 기계어 코드라고 해도
로더를 위한 부가적인 정보가 들어가기 마련이고,
로더가 어떤 ABI를 이해하느냐(지원하느냐)에 따라
실행 가부가 판가름 납니다.

또 문제가 되는 것은 Systemcall인데,
특정 ABI를 위한 로더와 Target OS를 위한 Systemcall
Wrapper를 새로 만들었다고 치더라도 Systemcall의
Protocol이 OS에 따라 다르다는 점입니다.

예를 들면
Linux는 Systemcall Interrupt가 80h이고
Win2k는 Systemcall Interrupt가 2Eh입니다.
인터럽트 후킹까지해야 된다는 얘깁니다.

더 자세한 내용은
WINE http://www.winehq.com/
LINE http://sourceforge.net/projects/line
을 참고하세요.
___________________________________
Less is More (Robert Browning)

___________________________________
Less is More (Robert Browning)

s_jeho의 이미지


죄송합니다 추가질문 드립니다..^_^;;

gcc가 실제론 전처리기, 어셈블러, 링커 로 연결되어있다고 알고있습니다.
그래서 gcc가 다목적용으로 사용될수 있는것이 각 OS에 맞는 어셈블러와 링커를 사용한다면 만들수 있다는것을 들었습니다.

gcc --save-temp 옵션을 주어서 hello.i hello.s hello.o 세파일을 얻었습니다.

전처리 파일을 살펴보았더니 단 1줄짜리 헬로월드 프로그램이 9백 몇십줄로 늘어나 있더군요.

자세히 보니 인클루드 된 stdio.h 같은 파일들이 보이는것으로 보아
아마 소스에 사용되었던 다른 함수들을 연결시키는게 아닐까 생각했습니다.

그리고 윈도우와 리눅스용으로 나누어져있는것같았습니다.

라이브러리를 사용하는데 윈도우에서 컴파일한 전처리 파일은
윈도우에서 썼던 gcc의 헤더파일의 경로가 입력되어있었고
리눅스에서 컴파일한 전처리 파일은 리눅스에서 썼던 gcc의
헤더파일의 경로가 입력되어있었습니다.

그런데 문제가 발생-

분명 전처리파일에선 명확하게 윈도우와 리눅스의 헤더파일 경로부터가 구분되어있는데,
윈도우상에서 전처리 컴파일한 결과물과 리눅스에서 전처리 컴파일한 결과물을 서로 바꿔서 컴파일해보면 컴파일이 됩니다-_-;;

어셈블러 단계나 목적파일 단계에선 안되면서-_-;;;;

전처리상에서부터 명확하게 나눠진듯 하면서도 어째서 전처리상에서는 서로 바뀌어서 컴파일이 될까요?

아마 공용으로 쓸수있는 어떠한 라이브러리가 존재해서 만약 전처리파일안에서 정의되지 않은 함수는 이런 공용 라이브러리를 이용해서 컴파일하는것일까요?

댓글 달기

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