利用链接器脚本实现数据匹配
时间:2019-10-20
本文章向大家介绍利用链接器脚本实现数据匹配,主要包括利用链接器脚本实现数据匹配使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、功能实现:
① 准备链接器脚本文件,可使用 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.\n", 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.
原文地址:https://www.cnblogs.com/GyForever1004/p/11707802.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 2020最新版 maven for MAC 安装及配置
- jemter安装(win/mac)并快捷启动的方法
- nmap 详解版-指令使用方法大全【含安装】
- 常见6种WAF绕过和防护原理
- 2020-mac 安装jdk1.8
- AWVS acunetix_WVS13的基础使用
- 为啥PHP in_array(0,['a', 'b', 'c']) 返回为true?
- docker安装伏羲扫描器fuxi-scanner
- 基于深度学习的文本分类应用!
- 表驱动法
- mysql将表结构导出excel
- 为什么会是Docker?
- 浅析http报文
- MySQL explain 中的 rows 究竟是如何计算的?
- SwiftUI: 使用 Touch ID 和 Face I