我是靠谱客的博主 鳗鱼百褶裙,最近开发中收集的这篇文章主要介绍__attribute__前言__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=func

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

注意事项

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

参考

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

最后

以上就是鳗鱼百褶裙为你收集整理的__attribute__前言__attribute__介绍参考的全部内容,希望文章能够帮你解决__attribute__前言__attribute__介绍参考所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部