Map 파일내 i.function name section의 의미가 무엇일까요?

오류 메시지

There was an error processing your request.
sbklyu1의 이미지

안녕하세요.
ARM 기반 개발 환경 공부중 모르는 내용이 있어 자문을 구합니다.

ARM Cortex-M7 기반의 개발 환경에서 Map 파일 분석 중 Cross References내에 다음과 같이 i.함수명 형태로 표기되는 Section들이 다수 존재함을 발견하였는데요. 정확히 어떤 의미 일까요?
ARM의 Compiler 및 Linker 관련 가이드 문서들을 훑어 보았지만 설명이 되어있는 곳을 찾지 못하였습니다.

ex) 파일A.o(.text) refers to 파일B.o(i.함수명) for 함수명

제가 1차적으로 유추해 보았을때는 Inline 함수들 중 일부 Compiler에 의해 Inline 되지 못한 함수들이 AREA Symbol을 통해 별도 코드 section으로 잡히게 되고 이런 함수들의 경우 Inline 함수이지만 실제 Inline이 되지않아 저런식으로 i.함수명 section 및 함수명 Symbol이 남게 되는것으로 생각됩니다.

i.함수명 section에 대한 정확한 의미에 대해 알고계신 분들의 지식 또는 참고 자료등을 알려주시면 많은 도움이 될것 같습니다.

감사합니다.

Stephen Kyoungwon Kim@Google의 이미지

말씀하시는 내용을 보니 C 같네요. inline function의 심볼을 남기느냐 마느냐는 실제 inline이 되었느냐 아니냐와는 관계 없어 보입니다.

static inline인 경우 inline을 해넣거나 static 함수를 그 컴파일 모듈에 생성합니다. 이 경우에는 cross reference가 되지 않을 테고요.

extern inline의 경우는 정의가 있는 모듈에 그 함수를 생성합니다. 일반적은 함수와 같습니다. inline이 붙어 있으니까 컴파일러가 그 모듈 내에서의 콜 사이트에서는 인라인을 하려고 조금 노력해 봅니다.

inline의 경우, 해당 모듈의 콜 사이트에서 인라인을 실제로 할 경우 그 정의를 사용합니다. 그러나 그 모듈 내 혹은 밖에 non-inline 버전이 정의되어 있다고 가정하고, 컴파일러가 inline 하기 싫을 경우 그 함수를 부르게 됩니다. 이 non-inline 버전은 그냥 일반 함수입니다.

sbklyu1의 이미지

inline function의 심볼을 남기는 경우는 실제 inline 여부와는 관계가 없어 보인다고 말씀해 주셨는데요.

제가 테스트 중인 빌드환경(ARMCC, C++)에서는 header 파일에 inline 함수를 static 한정자 없이 사용중이고 외부 모듈에서 참조할수 있도록 구성된 상태입니다. (extern inline 함수에 해당될것 같네요)

해당 조건에서 inline 함수가 모든 호출부에서 인라인 적용된 경우는 Map 파일에서 Symbol이 잡히지 않는데 컴파일러의 인라인 조건에 미 충족된 경우(호출 횟수, 리턴값 사용여부)에는 말씀하신 것처럼 non-inline 버전이 해당 object내에 AREA 지정자로 정의되며 호출부에서도 AREA에 정의된 함수를 호출 참조하고 해당 함수의 symbol이 Map파일에 i.함수명 section으로 잡히고 있습니다.

모든 호출부에 inline 함수의 정의부가 인라인 적용된 경우 non-inline 버전의 함수 정의를 따로 생성하지 않아도 될것 같은데 그런 경우가 있는건가요? 아니면 이건 개발 환경(컴파일러등.)에 따라 다른걸까요?

Stephen Kyoungwon Kim@Google의 이미지

처음 질문에서 C의 인라인이라고 생각했습니다. C++의 인라인은 C와 다르고 컴파일러와 표준마다 조금씩 다를 수 있습니다.

static 없이 inline을 header에 정의와 함께 사용하시고 있을 것 같네요. 그 경우에는 제가 이해하기로는 이렇습니다. 그냥 add()라는 함수를 foo.h에서 inline function으로 정의한 다음, src1.cc, src2.cc, src3.cc 등이 두루 쓴다고 가정하겠습니다.

각 translation unit (src*.cc)들은 자기가 실제로 add를 인라인 하지 않을 경우, add() 함수를 만듭니다. extern inline이 아니라 그냥 inline이면 제가 이해하기로 external linkage가 없습니다. 이런 점에선 static function과 비슷합니다.

다만 링킹 타임에 가서는 다릅니다. static function은 file마다 이름과 타입이 같아도 파일마다 다른 구현을 갖도록 디자인되었지만 inline은 그렇지 않죠. inline이 external linkage가 없는 건, translation unit들마다 정의가 필요하지만 나중에 링크를 걸 때 서로 충돌하지 않게 하기 위해서이기 때문일 겁니다. 그래서 static function들은 당연히 링킹 이후에도 모두 살아남지만, inline function의 정의가 .o 파일 내에 생성되었던 것들은 하나 빼고는 다 버려지는데, 그 하나도 어떻게 선택할지는 링커 마음입니다. 모든 구현이 같을 거라 가정하겠다는 걸로 보이고요.

이렇게 되면, 처음에 -c로 컴파일 했을 때는 인라인 함수를 부르는 부분이 실제 inline 되지 않으면, 같은 .o 파일 내의 함수를 부르는 것처럼 되겠습니다. 링킹이 끝나면, 그 .o 파일 내에 있던 함수는 사라지고 결과적으로는 다른 .o 파일 내에 정의된, 동일할 것으로 가정된 함수를 외부 참조하는 것처럼 될 수도 있구요.

댓글 달기

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