[완료] 링크 타임 코드 생성과 전체 프로그램 최적화에 대해 궁금한 게 있습니다

ssobranss의 이미지

링크 타임 코드 생성에서 제가 특별히 의문이 드는 부분은 다른 모듈에 있는 함수의 인라인화 입니다.

obj파일 생성->링크, 이때 LTCG를 적용하면 링크할때 단순히 심볼을 검색해서 실제 위치를 가져오는 것이 아니라 해당 소스파일을 갖고와서 인라인 한다는 얘긴데,

그럼 이때 다시 obj파일을 바꾸나요? 그다음에 다시 LTCG가 없는듯이 일반적인 링킹?

아니면 obj파일을 바꾸지 않고 그냥 그대로 합쳐서 exe나 dll을 생성할까요?

제 생각에는 vs2010에서 소스 파일마다 각각 /GL(전체 프로그램 최적화, LTCG와 같이 적용되야만 하죠)를 설정할 수 있는 걸로 봐서 obj파일 각각을 다시 바꾸는게 맞는 것 같습니다.

문제는 여기서 부턴데요,

msdn에 보면 obj파일과 다름없는 lib파일에 전체 프로그램 최적화를 하면 위험할 수 있다고 되어있습니다(호환이 안될 수 잇다고 되있더군요).

그런데 /GL이 obj 파일 하나하나에 해당하는 내용이라면 obj 파일이 생성된 시점에서 obj 파일은 그 자체로 완성된 것 아닌가요?

즉 제말은 obj 파일이 /GL이 적용되었다, 이런 정보를 따로 담고잇는 것이 아니라 그냥 일반적인 obj 파일과 다른 이유가 없는것 같은데(이 부분을 잘 모르겠습니다)

왜 그 obj 파일(lib 파일) 을 다른 데서 사용할 때 특별히 다른 점이 있는지 잘 모르겠네요.

요약하자면

/GL의 결과로 obj 파일 내용 자체가 바뀐다.

obj 파일 자체에는 '내가 /GL을 적용했소. 어쩌고저쩌고' 에 대한 내용을 담을 필요가 없다.

그래서 /GL이 적용된 obj 파일은 일반 obj 파일과 하등 다른점이 없다.

근데 왜 하필 /GL이 적용된 obj 파일(lib 파일) 만 다른 컴파일러나 컴퓨터에서 사용되는 것이 위험하다고 하느냐.

어느 부분에서 제 생각에 문제가 있나요?

chadr의 이미지

전체 최적화 옵션을 켜면 컴파일러는 타겟에 맞는 기계어 코드를 생성하지 않고 중간 언어인 IL 코드를 생성한다고 알고 있습니다.
그리고 최종적으로 링커가 IL을 타겟 기계어로 변환을 해서 실행파일을 만들어냅니다.

이때 링커가 최적화까지 같이 수행을 합니다.

따라서 /GL을 켜고 컴파일 한 obj 파일과 lib파일(obj파일의 묶음이죠)은 다른 링커(ex. gcc)에서 사용이 불가능합니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

hys545의 이미지

최적화나 다른 옵션하고는 상관없이
vc로 만든 obj나 lib는 gcc에서는 사용못하는 걸로 아는데
제가 잘못안건가여?

그리고 최적화 옵션 킨다고 il코드 안만들거 같은데여
최적화는 소스를 컴파일러가 맘대로 고치는 거뿐이기 때문에 링커하고는 아무 상관없는 작업같은데

즐린

chadr의 이미지

컴파일러간 lib 파일 사용이 완전히 안되는건 아닙니다. cpp로 컴파일한 것은 안되지만 c로 컴파일 한것은 가능합니다.

http://stackoverflow.com/questions/1138170/use-libraries-compiled-with-visual-studio-in-an-application-compiled-by-g-ming

그리고 "링크 타임 최적화"는 컴파일러가 최종 최적화를 하지 않고 링크타임에 최적화하는 기능입니다.
일반적인 최적화는 컴파일러가 하는게 맞습니다. 하지만 링크 타임 최적화는 최종 타겟 코드 생성을 링크 타임까지 지연시켜
링커가 수행하는 최적화합니다.

아래는 vs에 전체프로그램 최적화에 대한 설명을 그대로 옮긴 것입니다.

"코드 생성을 링크 타임까지 지연시켜 크로스 모듈을 최적화합니다. 링커 옵션 '링크 타임 코드 생성'이 설정되어있어야 합니다."

아래 문서에 링크타임코드생성 옵션을 켰을때 어떤 일이 일어나는지 자세히 설명되어있습니다.
여기에 IL코드를 생성한다고 나와있습니다. 여기서 생성하는 IL코드는 .net에서 사용하는 IL 코드는 아니고
임시적으로 최적화를 위해 생성하는 IL코드입니다. 따라서 문서화가 안되어있으며 vs 컴파일러에 따라서 생성하는
링크타임코드생성용 IL코드는 달라질 수 있습니다.

따라서 같은 vs 컴파일러간에도 호환이 안되니 위험하다는 의미입니다.

조금더 자세히 설명하자면 vs의 컴파일러는 프론트엔드, 백엔드, 그리고 링커로 이루어져있습니다.
프론트엔드는 소스코드를 파싱하여 IL코드를 생성합니다.
백엔드는 프론트엔드가 작성한 IL코드를 타겟 기계어로 변환합니다. 또한 일반적인 최적화 기능이 여기서 수행됩니다. 여기서 obj 파일이 생성됩니다.
그리고 링커는 아시다시피 백엔드가 생성한 obj를 링크합니다.

그런데 링크타임코드생성이 지정되면 vs는 백엔드를 호출하지 않고 대신 IL코드를 포함한 obj파일을 출력합니다.
그리고 링커를 호출하여 IL코드로 이루어진 obj파일들 넘김니다. 이때 링커는 다시 백엔드를 호출하여 프론트엔드로부터
받은 obj파일을 백엔드로 넘기고 백엔드가 최적화를 수행합니다.
그리고 링커가 원래 가지고 있던 링크 기능을 수행합니다.

http://msdn.microsoft.com/en-us/magazine/cc301698.aspx

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

ssobranss의 이미지

답변 감사드립니다.

댓글 달기

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