__attribute__
前言
本文介绍__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__相关推荐
- Linux下__attribute__((visibility (default)))的使用
在Linux下动态库(.so)中,通过GCC的C++ visibility属性可以控制共享文件导出符号.在GCC 4.0及以上版本中,有个visibility属性,可见属性可以应用到函数.变量.模板以 ...
- GNU C之__attribute__
__attribute__可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型属性(Type Attribute) __attribute_ ...
- __attribute__ ((packed))
1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法.这个功能是跟操作系统没关系,跟编译器有关,g ...
- Linux C使用bool类型 出现错误expected '=', ',', ';', 'asm' or '__attribute__'
#include <stdbool.h> 今天在linux下编了一个C程序,用到了bool类型,在编译的程序的时候出现以下错误: //error: expected '=', ',', ' ...
- [zz]GNU C __attribute__ 机制简介
GNU C的一大特色(却不被初学者所知)就是__attribute__机制.__attribute__可以设置函数属性(Function Attribute).变量属性(Variable Attrib ...
- __attribute__ 总结
attribute是GNU C特色之一,在iOS用的比较广泛.系统中有许多地方使用到. attribute可以设置函数属性(Function Attribute ).变量属性(Variable Att ...
- STM32学习笔记之__attribute__ ((at())绝对定位分析
STM32也会遇到这样的绝对定位的问题如下: uint8_t UART_RX_BUF[1024] __attribute__ ((at(0X20001000))); //就是将串口接收的数 ...
- @清晰掉 GNU C __attribute__
__attribute__((packed))详解 1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有 ...
- __attribute__((packed))
1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法.这个功能是跟操作系统没关系,跟编译器有关,g ...
- __attribute__函数的作用
[iOS]__attribute__ 标签: iOS 2016-09-07 19:41 107人阅读 评论(0) 收藏 举报 分类: iOS开发(52) 版权声明:本文为博主原创文章,未经博主允许 ...
最新文章
- IDEA2017注册码
- python asyncio 异步编程---协程
- CMake入门(二)
- 理论基础 —— 索引 —— B 树、B+ 树与 B* 树
- 新股上市涨跌幅规则?
- 集中式 vs 分布式 版本控制
- ASP.NET 学习笔记
- VMware15 Pro激活密钥
- 2020苏州大学计算机考研经验总结博
- Qtdesigner 插入图片(一步到位)
- archlinux音量管理
- 苹果 CEO 为什么选中了何同学?
- linux 定时任务(crontab)
- flex 移动开发 html5,[ html5 ] 移动端适配方案 flex布局+rem布局
- SAP MM02主数据维护多语言长文本,丢失空格的解决办法
- java生成图片,可设置背景,文本+公式图片+图片
- Asp.Net Core 鉴权授权
- 论文写作 1: 学术论文的基本概念
- 计算机211应届毕业生薪资,毕业生“薪酬”最高的4所211大学,985大学的学生只能羡慕!...
- PMP 11.27 考试倒计时37天!来提分啦!
热门文章
- 小唐开始刷蓝桥(九)2012年第三届C/C++ B组蓝桥杯省赛真题
- 红米k30s至尊纪念版什么时候上市 K30S手机预约发售时间表
- java跳出递归_在Java项目中如何跳出递归循环
- Flink Caused by:org.apache.flink.streaming.connectors.kafka.internal.Handover$ClosedException
- pandas读取xlsx
- Spring依赖注入的接口为null
- U盘文件只读的解决办法
- 3D MAX 常用快捷键
- 效率丨顶级项目管理工具 Top10
- 【学习笔记】网络图数据分析导论(solid)