__attribute__

2023-05-16

前言

本文介绍__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=func

void myfunc()
{
	printf("ohhh!");
}
init_func(myfunc);

注意事项

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

参考

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

__attribute__ 的相关文章

随机推荐

  • PX4代码解析(4)

    一 引言 PX4程序是基于实时操作系统 xff08 Real time operating system RTOS xff09 的上层应用程序 xff0c PX4飞控程序的很多重要模块都是在Nuttx操作系统的调度下运行的 因此 xff0c
  • PX4代码解析(5)

    一 前言 我所讨论的PX4代码是基于v1 11版本 xff0c 该版本与之前的版本有不少不同 xff0c 其中一个比较大的区别在于新版本大部分用到了C 43 43 中模板 xff0c 使得代码没有以前那么容易理解 xff0c 因此我在后面介
  • gcc与Makefile

    一 gcc命令 在linux开发编程过程中 xff0c 需要对完成的代码进行编译运行 xff0c 这时我们便需要用到gcc命令 xff0c 下面我介绍gcc的安装与使用 1 安装 在ubuntu系统下终端中输入下面的命令 sudo apt
  • 大疆嵌入式工程师面试

    昨天刚刚经历了大疆嵌入式第一轮面试 xff0c 面试官是个大佬 xff0c 感觉很不错 xff0c 但大疆面试问的很深 xff0c 自己有些答得不是很好 xff0c 记录一下 一面 xff08 8 16号 xff0c 35min左右 xff
  • PX4代码解析(6)

    一 前言 上一节介绍了PX4姿态估计调用函数的流程 xff0c 这一节分享一下我对PX4姿态解算的解读 首先 xff0c 要理解PX4姿态解算的程序 xff0c 要先从传感器的特性入手 xff0c 这里主要介绍的传感器有加速度计 xff0c
  • 嵌入式学习(2)-FreeRTOS--任务调度器开启过程分析

    FreeRTOS 开启任务调度器过程分析 vTaskStartScheduler xff1b 代码分析其中一些汇编的寄存器操作还不是特别清楚 xff0c 还需要进一步去学习 vTaskStartScheduler xff1b 代码分析 sp
  • 嵌入式学习(3)-FreeRTOS的创建任务过程

    创建任务过程理解 xTaskCreate xff08 xff09 分析prvInitialiseNewTask xff08 xff09 函数分析vListInitialiseItem xff08 xff09 函数分析prvAddNewTas
  • 浅记XACRO And Gazebo仿真建模

    目录 浅记XACRO And Gazebo仿真建模一 XACRO1 常量定义 2 宏定义 3 文件包含 二 ROS CONTROLros control是什么 xff1f 1 添加 惯性参数和碰撞属性 2 添加 gazebo标签 3 添加
  • OS——进程与线程

    文章目录 进程与线程进程进程的特点进程的模型进程的创建进程的终止进程的状态进程的切换进程的实现进程的合作 线程为什么有线程 xff1f 线程的使用经典的线程模型POSIX线程用户级线程内核级线程混合实现调度程序激活机制进程与线程的比较 进程
  • 720P、1080P、4K之间有什么区别和联系?

    720P 1080P 4K之间有什么区别和联系 xff1f 2018 02 26 11 27视频 视频分辨率 在高清网络摄像机中 xff0c 我们通常叫成百万 两百万像素摄像机 xff0c 经常会听到720P 1080P 4K xff0c
  • 了解python代码的执行顺序和对if __name__ == '__main__'理解

    进度一 xff1a 前几天 xff0c 我学习python时 xff0c 编写简单的代码 xff0c 一般是这样的 xff1a pi py PI 61 3 14 print 34 this is out 34 def main print
  • 跨域 php处理代码

    放到public index php中 header 39 Content Type text html charset 61 utf 8 39 header 39 Access Control Allow Origin 39 代表允许任何
  • 全日制和非全日制;定向和非定向区别联系

    全日制和非全日制 xff08 在职 xff09 是相对的 定向和非定向是相对的 xff0c 委托培养是定向的一种 一般情况下 xff1a 全日制绝大部分都是非定向的 xff0c 非全日制 xff08 在职 xff09 绝大部分都是定向的 定
  • 马云推出的“天猫精灵”到底有多牛? 细思极恐怖

    这个时代的变化有多莫测 xff1f 开网店 改变银行的马云 xff0c 搞起了机器人 xff01 搞搜索 做地图的百度 xff0c 完成了无人驾驶 xff01 马云又打响一枪 马云大动作不断 三个重磅后 xff0c 今天又打了对手一个措手不
  • Ardupilot -- APM源码笔记四(重制)~ 线程机制

    认识Ardupilot线程 在了解过Ardupilot的链接库之后 xff0c 是时候来认识一下Ardupilot是怎么处理线程了 xff0c 对于从arduino继承过来的setup xff08 xff09 loop xff08 xff0
  • 最简单的python 人脸检测

    本篇文章是最基本的人脸检测 xff0c 没有复杂的算法 xff0c 只是简单的运用了这三个库opencv xff0c numpy xff0c pillow 一 开发环境搭建 我们使用Python自带的IDLE进行编程 xff0c 我使用的电
  • FreeRtos 任务优先级和中断优先级

    首先打出这个标题是为了便于搜索 在这里赘述一下 这两者没有关系 只需要明白的是中断优先级高于任务的优先级 在单片机运行的过程中 中断来了就执行中断服务程序 在free rtos中 任务优先级设置的数值越大 任务的优先级越高 Unix任务优先
  • 嵌入式工程师的经典面试题目

    嵌入式工程师的经典面试题目 预处理器 xff08 Preprocessor xff09 1 用预处理指令 define 声明一个常数 xff0c 用以表明1年中有多少秒 xff08 忽略闰年问题 xff09 define SECONDS P
  • rabbitmq版本升级

    目录 一 背景 二 部署新的mq 三 元数据备份和还原 四 消息数据备份和还原 五 注意 一 背景 因原来rabbitmq版本存在漏洞需升级至最新版本 原来是使用软件包部署 xff0c 升级我采用使用docker compose部署 xff
  • __attribute__

    前言 本文介绍 attribute 的使用方法 attribute 介绍 要了解Linux Kernel代码的分段信息 xff0c 需要了解一下gcc的 attribute 的编绎属性 xff0c attribute 主要用于改变所声明或定