前言

本文介绍__attribute__ 的使用方法

__attribute__介绍

要了解Linux Kernel代码的分段信息,需要了解一下gcc的__attribute__的编绎属性,__attribute__主要用于改变所声明或定义的函数或 数据的特性,它有很多子项,用于改变作用对象的特性。比如对函数,noline将禁止进行内联扩展、noreturn表示没有返回值、pure表明函数除 返回值外,不会通过其它(如全局变量、指针)对函数外部产生任何影响。

子项 描述
section 将变量(整数变量、字符串和函数等)放入指定的节区段

section

子项section对代码段起作用。其作用是将作用的函数或数据放入指定名为"section_name"输入段。

__attribute__的section子项的使用格式为:

__attribute__((section("section_name")))

这里还要注意一下两个概念:输入段和输出段

输入段和输出段是相对于要生成最终的elf或binary时的链接过程说的

输入段
链接过程的输入大都是由源代码编绎生成的目标文件.o,那么这些.o 文件中包含的段相对链接过程来说就是输入段
输出段
链接过程的输出一般是可执行文件elf或库等,这些输出文件中也包含有段,这些输出文件中的段就叫做输出段。

输入段和输出段本来没有什么必然的联系,是互相独立,只是在链接过程中,Link程序会根据一定的规则(这些规则来源于Link Script),将不同的输入段重新组合到不同的输出段中,即使是段的名字,输入段和输出段可以完全不同。

使用方法实践

  • 将整型变量var存放到.text段
    int var __attribute__((section(".text"))) = 0;

  • 将字符串str存放到.data段
    char str[] __attribute__((section(".data"))) = "hello world";

  • 将函数存放到.mysection段(这个是自定义的段)

void __attribute__((section(".mysection"))) myfunc()
{printf("ohhh!");
}-------------------------------------typedef void (*funcptr)();
funcptr func  __attribute__((section(".mysection"))) = myfunc;
void myfunc()
{printf("ohhh!");
}---------------------------------------------typedef void (*funcptr)();
#define init __attribute__((section(".mysection")))
#define init_func(func) funcptr _fn_##func init=funcvoid myfunc()
{printf("ohhh!");
}
init_func(myfunc);

注意事项

在.init_array或者constructor中使内联汇编汇编的时候,需要使用pusha和popa指令保存指令上下文,不否会报错

参考

attribute 用法 section 部分
gcc attribute((section(“section_name”))) 使用方法

__attribute__相关推荐

  1. Linux下__attribute__((visibility (default)))的使用

    在Linux下动态库(.so)中,通过GCC的C++ visibility属性可以控制共享文件导出符号.在GCC 4.0及以上版本中,有个visibility属性,可见属性可以应用到函数.变量.模板以 ...

  2. GNU C之__attribute__

    __attribute__可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型属性(Type Attribute) __attribute_ ...

  3. __attribute__ ((packed))

    1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法.这个功能是跟操作系统没关系,跟编译器有关,g ...

  4. Linux C使用bool类型 出现错误expected '=', ',', ';', 'asm' or '__attribute__'

    #include <stdbool.h> 今天在linux下编了一个C程序,用到了bool类型,在编译的程序的时候出现以下错误: //error: expected '=', ',', ' ...

  5. [zz]GNU C __attribute__ 机制简介

    GNU C的一大特色(却不被初学者所知)就是__attribute__机制.__attribute__可以设置函数属性(Function Attribute).变量属性(Variable Attrib ...

  6. __attribute__ 总结

    attribute是GNU C特色之一,在iOS用的比较广泛.系统中有许多地方使用到. attribute可以设置函数属性(Function Attribute ).变量属性(Variable Att ...

  7. STM32学习笔记之__attribute__ ((at())绝对定位分析

    STM32也会遇到这样的绝对定位的问题如下: uint8_t   UART_RX_BUF[1024]   __attribute__ ((at(0X20001000)));   //就是将串口接收的数 ...

  8. @清晰掉 GNU C __attribute__

    __attribute__((packed))详解 1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有 ...

  9. __attribute__((packed))

    1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法.这个功能是跟操作系统没关系,跟编译器有关,g ...

  10. __attribute__函数的作用

    [iOS]__attribute__ 标签: iOS 2016-09-07 19:41 107人阅读 评论(0) 收藏 举报  分类: iOS开发(52)  版权声明:本文为博主原创文章,未经博主允许 ...

最新文章

  1. IDEA2017注册码
  2. python asyncio 异步编程---协程
  3. CMake入门(二)
  4. 理论基础 —— 索引 —— B 树、B+ 树与 B* 树
  5. 新股上市涨跌幅规则?
  6. 集中式 vs 分布式 版本控制
  7. ASP.NET 学习笔记
  8. VMware15 Pro激活密钥
  9. 2020苏州大学计算机考研经验总结博
  10. Qtdesigner 插入图片(一步到位)
  11. archlinux音量管理
  12. 苹果 CEO 为什么选中了何同学?
  13. linux 定时任务(crontab)
  14. flex 移动开发 html5,[ html5 ] 移动端适配方案 flex布局+rem布局
  15. SAP MM02主数据维护多语言长文本,丢失空格的解决办法
  16. java生成图片,可设置背景,文本+公式图片+图片
  17. Asp.Net Core 鉴权授权
  18. 论文写作 1: 学术论文的基本概念
  19. 计算机211应届毕业生薪资,毕业生“薪酬”最高的4所211大学,985大学的学生只能羡慕!...
  20. PMP 11.27 考试倒计时37天!来提分啦!

热门文章

  1. 小唐开始刷蓝桥(九)2012年第三届C/C++ B组蓝桥杯省赛真题
  2. 红米k30s至尊纪念版什么时候上市 K30S手机预约发售时间表
  3. java跳出递归_在Java项目中如何跳出递归循环
  4. Flink Caused by:org.apache.flink.streaming.connectors.kafka.internal.Handover$ClosedException
  5. pandas读取xlsx
  6. Spring依赖注入的接口为null
  7. U盘文件只读的解决办法
  8. 3D MAX 常用快捷键
  9. 效率丨顶级项目管理工具 Top10
  10. 【学习笔记】网络图数据分析导论(solid)