练习使用 __attribute__ 属性(仿照内核)
上一篇文章分析了内核中各种 initcall 的调用过程,在这个基础上大概掌握了内核中使用的这种方法,于是参考内核及网友的文章自己动手写了下,记录在这个随笔中。
源代码如下:
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
typedef void (*myown_call)(void);
/* 引用 LDS 文件中的标识 */
extern myown_call _myown_start[];
extern myown_call _myown_end[];
/* 宏定义 */
#define _init __attribute__((unused, section(".myown")))
#define func_init(func) myown_call _fn_##func _init = func
/* 随便定义三个函数 */
static void func1(void)
{
write(1, "function one!\n", 14);
}
static void func2(void)
{
write(1, "function two!\n", 14);
}
static void func3(void)
{
write(1, "function three!\n", 16);
}
/* 定义函数函数指针 */
func_init(func1);
func_init(func2);
func_init(func3);
/* 定义的展开:
static myown_call _fn_func1 __attribute__((unused, section(".myown"))) = func1;
*/
/* 依次调用段内的函数 */
void do_initcalls(void)
{
myown_call *call_ptr = _myown_start;
do {
fprintf (stderr, "call_ptr: %p\n", call_ptr);
(*call_ptr)();
++call_ptr;
} while (call_ptr < _myown_end);
}
int main(void)
{
do_initcalls();
return 0;
}
其中 __attribute__((unused)) 表示该函数或变量可能不使用,这个属性可以避免编译器产生警告信息。
OK,源代码如上所示,接下来就要编译。
我们需要修改默认的 LDS 文件,通过
ld -verbose > demo.lds
命令导出链接器脚本文件。
修改 LDS,添加如下代码:
_myown_start = .;
.myown : { *(.myown) }
_myown_end = .;

然后编译即可:
gcc -o test -Tdemo.lds test.c
成功生成 test 可执行文件后运行。
运行结果如下:

我们也可以能过如下命令来查看自定义段内的数据信息:
objdump -d -j .myown test
数据信息如下:

OK,这篇文章到此结束,成功仿照内核完成了函数的调用。其实这也或许是在练习 C 语言中 attribute 属性的用法。
感谢您的浏览!
参考网友:my.oschina.net/u/180497/blog/177206
原文中的代码是
.myown : { *(.myown) } = 0x90000000
后面的 0x90000000 真心不知道是什么意思,哪位网友帮忙解读下,谢谢。
练习使用 __attribute__ 属性(仿照内核)的更多相关文章
- Linux gcc支持的语法 __attribute__ 属性设置
__attribute__实际上是gcc专有的一种语法,是用来设置函数属性.变量属性.类属性的 语法:之前在C中的结构体对齐中提到过,当时是用来告诉编译器这个结构体的对齐方式 ,其实他还有很多种用法, ...
- Linux内核入门(六)—— __attribute__ 机制【转】
转自:https://blog.csdn.net/yunsongice/article/details/5538020 GNU C的一大特色(却不被初学者所知)就是__attribute__机制.__ ...
- 初探内核之《Linux内核设计与实现》笔记下
定时器和时间管理 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务,推迟一段时间执行的任务),因此,时间的管理对于linux来说非常重要. 主要内容: 系统时间 定时器 定时器相关 ...
- __attribute__
转来的: http://www.cnblogs.com/astwish/p/3460618.html __attribute__ 你知多少? GNU C 的一大特色就是__attribute__ 机制 ...
- __attribute__ 你知多少?
GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属性(Function Attribute ).变量属性(Variable Attribute )和 ...
- 《Linux内核设计与实现》读书笔记(十七)- 设备与模块
本章主要讨论与linux的设备驱动和设备管理的相关的4个内核成分,设备类型,模块,内核对象,sysfs. 主要内容: 设备类型 内核模块 内核对象 sysfs 总结 1. 设备类型 linux中主要由 ...
- __ATTRIBUTE__ 你知多少?【转】
转自:http://www.cnblogs.com/astwish/p/3460618.html GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属 ...
- __attribute__你知多少(转)
转自:http://www.cnblogs.com/astwish/p/3460618.html GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属 ...
- Linux内核导出符号宏定义EXPORT_SYMBOL源代码分析
资源: <include/linux/moudule.h> --. #ifndef MODULE_SYMBOL_PREFIX #define MODULE_SYMBOL_PREFIX &q ...
随机推荐
- 大数据计算框架Hadoop, Spark和MPI
转自:https://www.cnblogs.com/reed/p/7730338.html 今天做题,其中一道是 请简要描述一下Hadoop, Spark, MPI三种计算框架的特点以及分别适用于什 ...
- C语言表达式和语句
一.表达式 在C语言中,常量.变量.函数调用以及按C语言语法规则用运算符把运算数连接起来的式子都是合法的表达式 . 最后一类可以理解为运算符和运算对象的组合.例如: 算术表达式 = 算术运算符 + 运 ...
- [Codeforces Round #516][Codeforces 1063C/1064E. Dwarves, Hats and Extrasensory Abilities]
题目链接:1063C - Dwarves, Hats and Extrasensory Abilities/1064E - Dwarves, Hats and Extrasensory Abiliti ...
- OJ001
#include<stdio.h> int main(){ int a,b; while (scanf("%d%d",&a,&b)!=EOF){ pri ...
- 电子科技大学实验中学PK赛(二)比赛题解
比赛地址:http://qscoj.cn/contest/27/ A题 FIFA强化 分析:这个题目要求说的比较明显,用几个if判断一下就好了.不要一判断完就输出,最好用一个ans储存下答案.输出答案 ...
- Pycharm画五角星
import turtle turtle.setup(600,400,0,0) turtle.bgcolor('red') turtle.color('yellow') turtle.fillcolo ...
- ABP入门系列(4)——创建应用服务
ABP入门系列目录--学习Abp框架之实操演练 一.解释下应用服务层 应用服务用于将领域(业务)逻辑暴露给展现层.展现层通过传入DTO(数据传输对象)参数来调用应用服务,而应用服务通过领域对象来执行相 ...
- JVM,Tomcat与OSGi类加载机制比较
首先一个思维导图来看下Tomcat的类加载机制和JVM类加载机制的过程 类加载 在JVM中并不是一次性把所有的文件都加载到,而是一步一步的,按照需要来加载. 比如JVM启动时,会通过不同的类加载器加载 ...
- Java面试题整理:这些Java程序员面试中经常遇见的题目,必须掌握才能有好结果
1.是否可以从一个static方法内部发出对非static方法的调用? 不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时 ...
- 音视频编解码技术(二):AAC 音频编码技术
一.AAC编码概述 AAC是高级音频编码(Advanced Audio Coding)的缩写,出现于1997年,最初是基于MPEG-2的音频编码技术,目的是取代MP3格式.2000年,MPEG-4标准 ...