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

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

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

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

-------------------------------------------------------------------------------------------------------------------

섹션은 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) 코드를 잘 만들어야 한다는 부담이 있다는 것에 주의해야 합니다.















리눅스 상에서 static 라이브러리를 각각의 shared object에서 인클루드하여 사용합니다. 그 라이브러리 안에는 static 변수가 하나 선언되어 있고 각각의 shared object에서는 그 변수를 공유하려합니다.
하지만 실제로 각각의 shared object에서는 각각의 static 변수를 가지게 되기 때문에 변수 공유는 불가능 합니다.
하지만 GCC에서 그런 기능을 할 수 있는 attribute를 제공합니다.
__attribute__((section("shared"), shared))) 와 같이 사용하면 그 변수를 공유할 수 있지만 위의 구문은 윈도우에서만 지원이 가능하다고 하네요...
리눅스에서 그런 방법을 사용할 수는 없을까요???
고수님들의 많은 답변 부탁드립니다.

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License

'C & C++ 관련' 카테고리의 다른 글

gettimeofday(), clock()  (0) 2009/03/15
__attribute__((section (section_name));  (0) 2008/12/30
숫자와 문자 사이 형 변환  (2) 2008/12/28
popen, fread  (0) 2008/11/30
Posted by Real_G