[완료]GCC attribute section의 장점은?

refinestyle의 이미지

공부를 하다가 gcc 속성중에 section 이 있는걸 알았습니다.

함수 or 변수 __attribute__((section (section_name));

이렇게 하면 함수포인터나, 변수가 "section_name"이라는 section에 할당이 되는걸로 이해를 했습니다.

이 속성을 사용했을때 얻을 수 있는 장점은 어떤것인가요?

bushi의 이미지

섹션은 build 타임에 relocation 이 가능합니다. (ld 가 사용할 스크립트를 만들어주면 쉽습니다)

예를 들어 core layer 에 달린 각 sub system layer 의 initialize 함수들만 .init_sub 이라는 섹션에 몰아넣고, core 에서는 .init_sub 섹션에 있는 함수들의 entry 만 호출한다면, 각 sub system 의 intialize 함수들의 이름을 core layer 에서 알고 있을 필요가 없습니다.
리눅스 커널이 이런 방식으로 각 sub system 들을 초기화 합니다.
이럴 경우 오브젝트의 링크 순서가 상당히 중요하다는 것에 주의해야 합니다.

한발 더 나아가서,
위에서 예로 든 초기화 함수들은 처음에 단 한번만 사용되고 그 후에는 쓸 일이 없다면,
그 .init_sub 섹션이 있던 공간을 다른 용도로 재활용 하는 것이 가능하겠죠.
리눅스 커널이 이런 방식으로 RAM 을 아낍니다.
각 sub system 의 초기화 함수 뿐만 아니라 초기화 때만 필요한 데이타들까지 따로 섹션으로 가지고 있다가 초기화 과정이 끝난 후 일괄적으로 다 날려버립니다.

한발만 더 나가보지요.
ld 의 스트립트를 사용하면 각 섹션들의 base address 까지도 조정이 됩니다.
임베디드 시스템에서는 모든 조건이 열악합니다.
.text 와 .rodata 섹션은 ROM 에, .data 섹션은 SRAM 에, 위에서 예로 든 .init_sub 는 SRAM의 특정구역으로 조정해서 링크한 후에 코드 실행시 .init_sub 이 있던 공간을 깨끗하게 날리는 것이 가능합니다.
물론, 초기(bootstrap) 코드를 잘 만들어야 한다는 부담이 있다는 것에 주의해야 합니다.

댓글 달기

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