링크 스크립트를 이용하여 데이터 일치

9276 단어
1. 기능 실현:
① 링크 스크립트 파일을 준비할 때 ld --verbose > link를 사용할 수 있습니다.lds 명령 생성.
② 링크 편집lds 파일,.데이터 섹션에 사용자 정의 데이터 섹션을 만들기 위해 다음과 같은 내용을 추가합니다.
  .data           :
  {
    *(.data .data.* .gnu.linkonce.d.*)
    SORT(CONSTRUCTORS)
  }

  . = ALIGN(4);
  .MyData          :
  {
    KEEP(*(SORT(.MyDataSection_*)))
  }

③ 세 개의 원본 파일,main.c:
 1 #include 
 2 #include <string.h>
 3 #include "person.h"
 4 
 5 #define MyDataStart(_TYPE) \
 6 ({\
 7     static char start[0] \
 8     __attribute__((unused, section(".MyDataSection_1"))); \
 9     (_TYPE*)start;\
10 })
11 
12 #define MyDataEnd(_TYPE) \
13 ({\
14     static char end[0] \
15     __attribute__((unused, section(".MyDataSection_3"))); \
16     (_TYPE*)end;\
17 })
18 
19 int main()
20 {
21     PERSON *person = NULL;
22 
23     for(person = MyDataStart(PERSON);
24         person < MyDataEnd(PERSON);
25         person++)
26     {
27         if(0 == strcmp(person->name, "lance"))
28             printf("Lance's age is: %d.
", person->age); 29 } 30 31 return 0; 32 }

④ person.h는 다음과 같습니다.
 1 #ifndef _PERSON_H_
 2 #define _PERSON_H_
 3 
 4 #pragma pack(4)
 5 typedef struct {
 6     unsigned char     *name;
 7     unsigned int     age;
 8 }PERSON;
 9 #pragma pack()
10 
11 #define MyDataListTail(_NAME) \
12 static PERSON _NAME \
13 __attribute__((unused, aligned(4), section(".MyDataSection_2"))) \
14 = {
15 
16 #define MyDataListTailEnd() \
17 }
18 
19 #endif

⑤ person.c:
 1 #include 
 2 #include "person.h"
 3 
 4 MyDataListTail(john)
 5     .name     = "john",
 6     .age    = 14,
 7 MyDataListTailEnd();
 8 
 9 MyDataListTail(siri)
10     .name     = "siri",
11     .age    = 15,
12 MyDataListTailEnd();
13 
14 MyDataListTail(lance)
15     .name     = "lance",
16     .age    = 16,
17 MyDataListTailEnd();

 
2. 컴파일 명령(링크 스크립트 지정)
gcc -Tlink.lds main.c person.c

 
3. 실행 결과:
Lance's age is: 16.

좋은 웹페이지 즐겨찾기