zoukankan      html  css  js  c++  java
  • 利用链接器脚本实现数据匹配

    一、功能实现:

    ① 准备链接器脚本文件,可使用 ld --verbose > link.lds 命令生成。

    ② 编辑 link.lds 文件,在 .data 段下添加如下内容,以建立自定义数据段。

      .data           :
      {
        *(.data .data.* .gnu.linkonce.d.*)
        SORT(CONSTRUCTORS)
      }
    
      . = ALIGN(4);
      .MyData          :
      {
        KEEP(*(SORT(.MyDataSection_*)))
      }

    ③ 三个源码文件,main.c 如下:

     1 #include <stdio.h>
     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 <stdio.h>
     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();

    二、编译命令(需指定链接器脚本)

    gcc -Tlink.lds main.c person.c

    三、运行结果:

    Lance's age is: 16.
  • 相关阅读:
    查看mysql版本的四种方法及常用命令
    newInstance和new的区别(good)
    Citrix 服务器虚拟化之六 Xenserver虚拟机创建与快照
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 前缀表达式
    Java实现 蓝桥杯 算法训练 前缀表达式
  • 原文地址:https://www.cnblogs.com/GyForever1004/p/11707802.html
Copyright © 2011-2022 走看看