上一篇文章分析了内核中各种 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__ 属性(仿照内核)的更多相关文章

  1. Linux gcc支持的语法 __attribute__ 属性设置

    __attribute__实际上是gcc专有的一种语法,是用来设置函数属性.变量属性.类属性的 语法:之前在C中的结构体对齐中提到过,当时是用来告诉编译器这个结构体的对齐方式 ,其实他还有很多种用法, ...

  2. Linux内核入门(六)—— __attribute__ 机制【转】

    转自:https://blog.csdn.net/yunsongice/article/details/5538020 GNU C的一大特色(却不被初学者所知)就是__attribute__机制.__ ...

  3. 初探内核之《Linux内核设计与实现》笔记下

    定时器和时间管理 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务,推迟一段时间执行的任务),因此,时间的管理对于linux来说非常重要. 主要内容: 系统时间 定时器 定时器相关 ...

  4. __attribute__

    转来的: http://www.cnblogs.com/astwish/p/3460618.html __attribute__ 你知多少? GNU C 的一大特色就是__attribute__ 机制 ...

  5. __attribute__ 你知多少?

    GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属性(Function Attribute ).变量属性(Variable Attribute )和 ...

  6. 《Linux内核设计与实现》读书笔记(十七)- 设备与模块

    本章主要讨论与linux的设备驱动和设备管理的相关的4个内核成分,设备类型,模块,内核对象,sysfs. 主要内容: 设备类型 内核模块 内核对象 sysfs 总结 1. 设备类型 linux中主要由 ...

  7. __ATTRIBUTE__ 你知多少?【转】

    转自:http://www.cnblogs.com/astwish/p/3460618.html GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属 ...

  8. __attribute__你知多少(转)

    转自:http://www.cnblogs.com/astwish/p/3460618.html GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属 ...

  9. Linux内核导出符号宏定义EXPORT_SYMBOL源代码分析

    资源: <include/linux/moudule.h> --. #ifndef MODULE_SYMBOL_PREFIX #define MODULE_SYMBOL_PREFIX &q ...

随机推荐

  1. 查看Oracle中存储过程长时间被卡住的原因

    1:查V$DB_OBJECT_CACHE SELECT * FROM V$DB_OBJECT_CACHE WHERE name='CUX_OE_ORDER_RPT_PKG' AND LOCKS!='0 ...

  2. Redis_MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk问题解决

    原因:可参考https://www.linuxidc.com/Linux/2012-07/66079.htm 解决方案一: 修改redis.conf中 stop-writes-on-bgsave-er ...

  3. [转载]SSH框架搭建详细图文教程

    http://www.cnblogs.com/hoobey/p/5512924.html

  4. ivew ui

    render操作: render:(h, params) => { return h('div', [ h('Button',{ on:{ click:()=>{ this.edit(pa ...

  5. phpstorm 断点调试 傻瓜教程

    前言: 简单介绍下为什么要用断点调试,很多人说我在代码调试的部位用var_dump 或者 exit 或者print_r来进行断点,但是当项目足够大的时候这样的做法就比较费时费力,因为你断点后需要删除原 ...

  6. ucore代码分析

    lab2: 总共分为四个包一个文件,分别为: boot: 操作系统加载程序代码 kern: 操作系统内核代码 libs: 相关的库和数据结构 tools: 相关编译链接调试工具 Makefile: 构 ...

  7. java 加解密

    import javax.crypto.*; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingExc ...

  8. 微信小程序开发-窗体设置

    "window": { "backgroundTextStyle": "light", "navigationBarBackgro ...

  9. Spring Cloud Eureka 使用 IP 地址进行服务注册

    默认情况下,Eureka 使用 hostname 进行服务注册,以及服务信息的显示,那如果我们使用 IP 地址的方式,该如何配置呢?答案就是eureka.instance.prefer-ip-addr ...

  10. 树的简介及Java实现

    一.树的基本知识 树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合.把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的.它具有以下的特点:每个结 ...