링커 스크립트를 공부중에 질문입니다.

소맛라면의 이미지

floating_point = 0;
SECTIONS
{
  .text :
    {
      *(.text)
      _etext = .;
    }
  _bdata = (. + 3) & ~ 4;
  .data : { *(.data) }
}

Quote:

위에서 `floating_point' 심볼은 0으로 정의된다. `_etext' 심볼은 마지막 `.text' 입력 섹션 뒤의 주소로 정의된다.
`_bdata' 심볼은 `.text' 출력 섹션 뒤에서 4 바이트 경계로 정렬된 주소로 정의된다.

http://www.gnu.or.kr/manual/release/ld/ld-mahajjh/ld_3.html#SEC47

여기에 설명이 잘 나와있길래..공부중에 잘 모르는 부분이 생겨서
질문 드립니다..

다른건 이해가 가는데

Quote:
`_bdata' 심볼은 `.text' 출력 섹션 뒤에서 4 바이트 경계로 정렬된 주소로 정의된다.
요 부분이 이해가 가질 않습니다..

_bdata = (.+3) & ~4 가 어떻게 4바이트 정렬인지 잘 모르겠습니다..
설명좀 해주세요...처음에는 4비트 정렬인줄할고..그냥 넘어갔는데..
다시 읽어 보니 4바이트 더군요...
감사합니다..

cinsk의 이미지

4를 이진수로 표시하면 100입니다. 따라서 첫번째 자리와 두번째 자리가 0이면, 4의 배수가 되는 셈입니다. 한 번 볼까요?

0 - 00000
4 - 00100
8 - 01000
12 - 01100
16 - 10000

즉, 어떤 수에 4를 invert 시킨 수(~4)를 AND하면, 4의 배수로 (수치가 잘릴 수도 있음) 바뀝니다.

3을 더한 것은 주어진 수보다 같거나 큰 4의 배수로 만들기 위함입니다. 볼까요?

(4 + 3) & ~4 = 4
(5 + 3) & ~4 = 8
(6 + 3) & ~4 = 8
(7 + 3) & ~4 = 8
(8 + 3) & ~4 = 8
(9 + 3) & ~4 = 12
...

"_bdata = (. + 3) & ~ 4"를 위를 보며 생각하시면 해결되리라 생각합니다.

소맛라면의 이미지

(4 + 3) & ~4 = 4
(5 + 3) & ~4 = 8
(6 + 3) & ~4 = 8
(7 + 3) & ~4 = 8
(8 + 3) & ~4 = 8
(9 + 3) & ~4 = 12
... 

도대체 이해가 잘 안되는군요..;;

4+3이면 7 이진수로 0111
~4는 앞부분 잘라버리고 뒤에 4자리만 1011
두수를 & 하면 0011
십진수로 3입니다..

제 계산 법이 틀렸나요???;;
아직도 이해가 잘 안되는군요..;;

에효~ㅜ..ㅜ

무엇을 위해 사는가..

sangwoo의 이미지

소맛라면 wrote:
(4 + 3) & ~4 = 4
(5 + 3) & ~4 = 8
(6 + 3) & ~4 = 8
(7 + 3) & ~4 = 8
(8 + 3) & ~4 = 8
(9 + 3) & ~4 = 12
... 

도대체 이해가 잘 안되는군요..;;

4+3이면 7 이진수로 0111
~4는 앞부분 잘라버리고 뒤에 4자리만 1011
두수를 & 하면 0011
십진수로 3입니다..

제 계산 법이 틀렸나요???;;
아직도 이해가 잘 안되는군요..;;

에효~ㅜ..ㅜ

~4 라면 이진수로 나타내었을 때, 제일 작은 두 자리 (1의 자리와 2의 자리) 만 0이고 나머지는 1입니다. 따라서 AND를 취하면 제일 뒤 두 자리만 00이 되겠죠.

위에 말씀하신 4의 경우를 보면:
4+3이면 7, 이진수로 0111
그 다음, 0111 & ~4 를 하면 0100 이 되고, 이 수는 십진수로 4가 되는 겁니다.

----
Let's shut up and code.

소맛라면의 이미지

아직 이해가 안되서 다시 질문 드립니다..

이진수의 마직막 4자리만 따지면 1111 경우 8421이되고 ->15가 되져
4가 이진수가 되려면 0100이 되야 하지 않나요??

이를 반전 하면 1011로 되야 한다고 생각하는데...;;;

어느 부분에서 재가 잘못 생각 하고 있는지 모르겠군요...;;

흐미...;;

~4가 ~3이 되야 하는것 아닌지..;;

무엇을 위해 사는가..

pynoos의 이미지

~4가아니라 -4 아닌가요?

11111100 (-4)

& 뒤에 나와야할 값은 ~4가 아니라 -4이어야할 것 같습니다.

suh1978의 이미지

열정은 남자의 미래다! - suki1978 style, free style

_bdata = (. + 3) & ~ 4;

이 아니라

_bdata = (. + 3) & ~ 3;

이 맞지 않을까요. 계산상 4배수가 딱 맞아 떨어지구요

링커스크립트 메뉴얼에서 보면 ALIGN에 대한 함수 설명에서 다음과 같은 부분이 있습니다

ALIGN(exp) 는 다음과 동일하다

( . + exp - 1 ) & ~ ( exp - 1 )

이때 exp는 2의 몇제곱 형식이어야만 한다

결국 이 부분 다음 영역은 4의 배수로 정렬할 때 사용하는 지시어 인거 같구요.

# 링커스크립트를 공부하면서 검색하다가 위의 부분이 좀 이상한거 같아서 적어봤습니다

혹시 잘못된거면 말씀해주세요~ ㅎ

열정은 남자의 미래다! - suki1978 style, free style

댓글 달기

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