[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4. 섹션과 재배치


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1 배경

단적으로 말하자면, 섹션은 빈틈이 없는 어드레스들의 범위이다. 그러한 주소 안에 있는 모든 데이터들은 같은 어떤 특별한 목적으로 취급된다. 예를 든다면 “read only” 섹션이 있다.

링커 ld는 많은 목적 파일 (프로그램의 일부분인)을 읽어들여서 그것들을 결합하여 실행가능한 프로그램 형식을 구성한다. as가 목적 파일을 만들어 낼 때 그 부분적인 프로그램은 어드레스 0에서 시작하는 것으로 가정된다. ld 는 마지막 어드레스를 그 부분적인 프로그램으로 할당하는 데, 그래서 다른 부분적인 프로그램들이 겹쳐지지 않는다. 이것은 실지로 하나의 간략화이다. 그 러나 이것은 as가 섹션을 어떻게 사용하는 지를 설명 하는 데 충분하다.

ld 는 당신 프로그램의 블록 바이트를 이들의 실행시간 주소로 옮긴다. 이러한 블록들은 이들의 실행시간 주소로 단단한 단일체로써 미끄러져 들어가는 것이다. 이들 블록들의 길이는 변하지 않는다. 이러한 단단한 단일체들은 섹션(section) 으로 불리운다. 실행시 주소를 섹션에 할당하는 것을 재배치(relocation)라 부른다. relocation은 목적 파일의 주소의 기록을 조절하는 테스크를 포함 하는데, 그래서 그들은 고유의 실행 시간 주소로 참조된다. For the H8/300 and H8/500, and for the Hitachi SH, as pads sections if needed to ensure they end on a word (sixteen bit) boundary.

as가 만들어낸 목적 파일에는 비어있을 지언정 적어도 세 개의 섹션이 있다. 그것들은 text, data, bss 섹션들로 불리운다.

만일 COFF 형식으로 출력한다면, as는 또한 여러분들이 ‘.section’ 지시어 (see section .section)를 사용하여 명시한 이름으로 불리우는 섹션을 만들어 낼 수 있다. 만일 ‘.text’ 또는 ‘.data’ 섹션에 어떠한 지시어도 사용하지 않 는 다면, 그것에 해당하는 섹션들은 단지 존재만 하고, 비어 있게 된다.

as가 HPPA기종에서 SOM이나 ELF 출력을 만들어 낼 때, 당신이 ‘.space’와 ‘.subspace’를 사용하여 명시한 다르게 이름 붙여진 섹션도 만들어 낼 수 있다. ‘.space’, ‘.subspace’ 어셈블러 지시어에 대한 자세한 것은 HP9000 Series 800 Assembly Language Reference Manual(HP 92432-90001)을 보라.

덧붙여서, SOM 출력을 만들어 낼 때 as는 표준 text, data, bss 섹션에 있어서 다른 이름을 사용한다. 프로그램 text는 ‘$CODE$’ 섹션이 되고, data는 ‘$DATA$’ , BSS는 ‘$BSS$’섹션으로 사용된다.

목적 파일내에서, text 섹션은 0 번 주소에서 시작하고, data 섹션이 그 다음에 따라오며, 그 뒤에 bss 섹션이 뒤따른다.

HPPA에서 SOM이나 ELF 출력파일을 만들어 낼 때, text 섹션은 0 번 주소에서 시작하며 data 섹션은 0x4000000에 있으며, bss 섹션은 data 섹션 뒤에 온다.

as는 섹션이 재배치 될 때 어떤 데이터가 변경되는지, 어떻게 그 데이터를 변 경하는 지를 ld가 알게 하기 위하여 재배치에 필요한 세세한 정보를 목적 파 일에 쓴다. 재배치를 하기 위해서 ld 는 앞서 이야기 했듯이 목적 파일내에 있는 주소의 각각의 시간을 알아야 한다:

사실, as에 있어서 모든 주소는 다음과 같이 표현된다.

 
(섹션) + (섹션속에서의 옵셋)

더 나아가서, as가 따지는 대부분의 표현들은 이러한 섹션-관계에 바탕을 둔다.

이 매뉴얼에서 우리는 “secname 섹션 속의 옵셋 N”을 {secname N} 으로 표기 한다.

text, data, bss 섹션과는 별개로 여러분들은 절대(absolute) 섹션에 대해 서 알아야 한다. ld 가 부분적 프로그램들을 섞을 때, 절대섹션안의 주소는 바뀌지 않고 남게 된다. 예를 들면, 주소 {absolute 0}은 실행시간 주소 0으 로 ld에 의해 “재배치” 된다. Although the linker never arranges two partial programs’ data sections with overlapping addresses after linking, by definition their absolute sections must overlap. 프로그램 한부분에서 주소 {absolute 239} 은 프로그램의 다른 어느 부위에서 {absolute 239} 주소로 실행될 때 같은 주소 로 된다.

섹션에 대한 이러한 개념은 정의되지않은(undefined)섹션으로 확대된다. 어셈블시 알려지지 않은 어떠한 주소든 {undefined U}와 같이 정의된다. (U가 있는 부분은 나중에 채워진다.) 수치들이 항상 정의된 이후에 정의되지 않은 주소를 생성하는 것은 정의되지 않은(undefined) 심볼을 기재하는 방법 뿐이다. 통칭 공통된 블록이라 부르는 것에 대한 참조가 그러한 심볼이 된다. 이것의 값이 어셈블시 알려지지 않아서 undefined 섹션이 되는 것이다.

유사하게 section(섹션) 낱말은 링크된 프로그램에서 섹션의 그룹을 지칭 하는데에도 사용된다. ld는 모든 부분적인 프로그램의 text 섹션을 링크된 프 로그램안에 인접한 주소로 놓는다. 이것은 통속적으로 모든 부분적 프로그램의 text 섹션들의 모든 주소를 text section으로 참조하는 것이다. data와 bss 섹션도 마찬가지다.

어떤 섹션들은 ld에 의해 처리되고, 다른 것들은 as에 의해 처리되는데, 어 셈블을 할 때를 제외하고는 이는 별 의미가 없다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2 ld 에 있어서의 섹션

ld는 아래에 요약한 4가지 종류의 섹션으로 나눈다.

named sections
text section
data section

이 섹션들은 당신들의 프로그램에 담겨 있다. asld는 그것들을 분리된, 그러나 같은 섹션으로 취급한다. 하나의 섹션에 해당하는 것은 다른 섹션에도 마찬가지로 해당한다. 그러나 프로그램이 실행 될 때, 통속적으로 text 섹션은 변경되지 않는다. text 섹션은 종종 프로세스에 의해 공유된다. (text 섹션은 명령어와 상수 같은 것들 을 포함한다.) 실행중 프로그램의 data 섹션은 보통 변경된다. 예를 들면 C 변수들은 data 섹션에 저장된다.

bss section

이 섹션은 프로그램이 실행되기 시작할 때 0 바이트로 구성된다. 그것은 최기화 되지 않은 변수나 공통된 저장소를 담기 위해서 사용된다. 부분적인 프로그램의 개별 bss 섹션의 길이는 중요하다. 그러나 그것은 0 바이트로 시작하기 때문에 목적 파일내에서 명백하게 0 바이트를 저장할 필요는 없다. bss 섹션은 목적 파 일로부터 이러한 명백한 zero들을 제거하기 위해 발명되었다.

absolute section

이 섹션의 0번지는 항상 실행시간 0번지로 “재배치(relocated)”된다. 이것은 ld가 재배치시에 변경하지 말아야 할 주소를 우리가 참조하는 데 요긴하게 사용된다. 이러한 때에 우리는 절대 주소는 “재배치되지 않는 것이다” 라고 말할 수 있다. 절대주소는 재배치동안에 변경되지 않는다.

undefined section

이 섹션은 바로 앞의 섹션들에 없는, 객체를 참조하는 모든 주소들 을 잡아두는 곳이다.

세 개의 재배치 가능한 섹션들의 이상적인 예를 들어보자. 이 예는 ‘.text’와 ‘.ata’라고 불리우는 전통적인 섹션을 사용한다. 메모리 주소는 수평적인 축으로 가정했다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3 as 에 있어서의 섹션

여기에 나오는 부분들은 단지 as의 내부적인 사용에 관련된 것이다. 이것들은 실행시간에는 별상관이 없는 것들이다. 여러분들의 일반적인 목적에는 이러한 것들을 알아야 할 필요성을 느끼지 못 할 것이다. 그러나 이것들은 as의 경고메 세지로 나타날 수 있다. 그렇기 때문에 알아두면 그러한 의미들을 파악하는 데 도움이 될 것이다. 이러한 부분들은 어셈블리 언어로 작성된 프로그램내에서의 모든 표현들의 값이 섹션-관계 주소로 되는 것을 허용하기 위해서 사용된다.

ASSEMBLER-INTERNAL-LOGIC-ERROR!

내부적인 어셈블러 논리 에러가 발견되었다. 이것은 어셈블러에 버그가 있다는 것을 말한다.

expr section

어셈블러는 복잡한 표현을 내부적으로 심볼의 조합으로 저장한다. 그러한 표현을 심볼로서 재연하는 것이 필요할 때 그것을 expr 섹션에 놓는다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4 보조 섹션

어셈블된 바이트들은 전통적으로 두 개의 섹션(text와 data)의 상태로 된다. 여러분들은 섹션이라 불리우는 분리된 데이터 그룹을 가질 수 있는 데, 그 그룹은 설사 어셈 블리 소스에서 가까이에 인접하지 않는다 할지라도 목적 파일안에서 서로를 한쪽을 끝으로하여 가까이 존재하도록 하는 것이다. as는 이러한 목적으로 보조섹션(subsections)이라는 것을 사용하도록 허용한다. 각각의 섹션내에서, 0 에서 8192까지의 값이 붙여진 보조섹션이 존재할 수 있다. 같은 보조섹션속으로 어셈블된 객체들은 같은 보조섹션안에 있는 객체들과 함께 목적 파일로 들 어간다. 예를 들자면, 컴파일러는 text 섹션에 상수들을 저장할 것이나, 어셈블 된 프로그램속에 이리저리 흩어놓기는 싫어 할 것이다. 이러한 경우에 컴파일러 는 출력되는 코드의 각각의 섹션 이전에 ‘.text 0’과 같은 것을 발생시킬 수 있 을 것이다. 그리고 출력되는 각각의 상수그룹이전에 ‘.text 1’을 발생시킬 수 있다.

보조섹션은 선택적이다. 만일 보조섹션을 사용하지 않는다면 모든 것들의 보 조섹션 숫자는 0이 될 것이다.

각각의 보조섹션은 0에서 4바이트 씩 곱해서 높아진다. (보조섹션은 as의 다 른 취향에 따라 다르게 계산되어질 것이다.)

보조섹션은 목적 파일안에서 작은 수에서 큰 수로 정렬된 상태로 나타난다. (다른 이들의 컴파일러에도 해당되는 것이다.) 목적 파일은 보조섹션을 2번이상 포함하지 않는다. 목적 파일을 처리하는 ld와 다른 프로그램들은 그러한 것들의 자취를 보지 못한다. 그들은 단지 모든 text 보조섹션을 하나의 text 섹션으로 볼 뿐이며, 모든 data 보조섹션은 하나의 data 섹션으로 볼 뿐이 다.

보조섹션을 명시하려면, ‘.text expression’이나 ‘.data expression’ 구문과 같은 수치로 표시된 인자를 사용하라. COFF 출력을 만들어 낼 때, 여러분들은 특별한 보조섹션 인자를 사용할 수 있는 데, 이것의 이름은 마음대로 붙일 수 있다 . (‘section name, expression’.) Expression은 절대표현이 되어야 한다. (See section 표현) 단지 ‘.text’라고만 쓴다면 ‘.text 0’이 가정된다. 마찬가지로 ‘.data’는 ‘.data 0’을 뜻한다. 어셈블리는 ’text 0’에서 시작한다. 보기가 몇 개 있다.

 
.text 0     # The default subsection is text 0 anyway.
.ascii "This lives in the first text subsection. *"
.text 1
.ascii "But this lives in the second text subsection."
.data 0
.ascii "This lives in the data section,"
.ascii "in the first data subsection."
.text 0
.ascii "This lives in the first text section,"
.ascii "immediately following the asterisk (*)."

각각의 섹션은 위치 카운터라고 하는 그 섹션속으로 어셈블된 모든 바이트 마 다 하나씩의 증가를 하는 것을 가지고 있다. 보조섹션은 단지 보조섹션이라는 개념이 없는 as에게 제한된 편의를 제공하자는 것이다. 바로 위치 카운터를 처리하는 방법은 없으나 .align이라는 지시어를 사용하여 그것을 변경할 수는 있다. 그리고 라벨 정의는 그것의 현재값을 캡쳐한 다. 구문이 어셈블되는 섹션의 위치 카운터는 활성화된(active) 위치 카운터라 고 부른다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.5 bss 섹션

bss 섹션은 지역적인 공통되는 값들을 저장하기 위한 장소로 사용된다. 여러분 들은 bss 섹션에 주소 공간을 할당할 수 있으나, 프로그램이 실행되기 전에는 bss 섹션에 data를 로드할 수는 없다. 여러분들의 프로그램이 실행되기 시작할 때, 모든 bss 섹션의 내용물은 0 바이트가 된다.

bss 섹션의 주소는 특별한 지시 자에 의해 할당된다. 여러분들은 bss 영역에 바로 어떤 것을 집어넣고 어셈블 할 수는 없다. See section .comm, see section .lcomm.

(역자주: C에서 공통적으로 사용되는 전역변수 중 초기화되지 않는 변수들은 bss 섹션에 표시가 되는 것 같다. ‘.comm p,4,4’ 는 C에서 전역변수로 ‘char *p;’나 ‘int p;’ 로 선언한 것과 같은 의미이다. 전역변수 중에서 초기화된 것은 data 섹션으로 들어간다.)


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Autobuild on February 7, 2019 using texi2html 1.82.