• 利用链接器脚本实现数据匹配


    一、功能实现:

    ① 准备链接器脚本文件,可使用 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.
  • 相关阅读:
    NGINX学习(二)--nginx配置文件详解
    NGINX学习(一)--nginx的安装与启动
    Linux服务器参数查看命令
    记录工作中遇到的那些坑(一)--NGINX配置worker_connections
    Mysql视图触发器函数事务
    pymsql
    装饰器模型
    多进程属性和方法
    mysql
    FTP简单的大文件传输
  • 原文地址:https://www.cnblogs.com/GyForever1004/p/11707802.html
Copyright © 2020-2023  润新知