[随笔]gcc的__attribute__编译属性
2016-03-16 14:56
411 查看
注:此文非原创,是博主在学习过程中网络摘抄整理而出。
比如,对函数,noline将禁止进行内联扩展、noreturn表示没有返回值、pure表明函数除返回值外,不会通过其它(如全局变量、指针)对函数外部产生任何影响。
这里我们聊聊对代码段起作用的子项section。
其作用是 将作用的函数或数据放入指定名为”section_name”输入段。
这里还要注意一下两个概念:输入段和输出段
输入段和输出段是相对于要生成最终的elf或binary时的Link过程说的,Link过程的输入大都是由源代码编绎生成的目标文件.o,那么这些.o文件中包含的段相对link过程来说就是输入段。
而,Link的输出一般是可执行文件elf或库等,这些输出文件中也包含有段,这些输出文件中的段就叫做输出段。
输入段和输出段本来没有什么必然的联系,是互相独立,只是在Link过程中,Link程序会根据一定的规则(这些规则其实来源于Link Script),将不同的输入段重新组合到不同的输出段中,即使是段的名字,输入段和输出段可以完全不同。
其用法举例如下:
这样定义的变量var将被放入名为.xdata的输入段。
再如:
这个例子将使函数functionA被放入名叫.xinit的输入段。
需要特别注意的是,
下面是目前支持的变量属性:
• address (addr)
• aligned (alignment)
• boot
• deprecated
• fillupper
• far
• mode (mode)
• near
• noload
• packed
• persistent
• reverse (alignment)
• section (“section-name”)
• secure
• sfr (address)
• space (space)
• transparent_union
• unordered
• unused
• weak
另外,
1. 也可以通过在关键字前后使用 __(双下划线)来指定属性(例如,用
宏同名的情况。
2. 要指定多个属性,可在双括弧内用逗号将属性分隔开,例如:
__attribute__主要用于 改变所声明或定义的函数或数据的特性,它有很多子项,用于改变作用对象的特性。
比如,对函数,noline将禁止进行内联扩展、noreturn表示没有返回值、pure表明函数除返回值外,不会通过其它(如全局变量、指针)对函数外部产生任何影响。
这里我们聊聊对代码段起作用的子项section。
__attribute__的section子项的使用格式为:
__attribute__((section("section_name")))
其作用是 将作用的函数或数据放入指定名为”section_name”输入段。
这里还要注意一下两个概念:输入段和输出段
输入段和输出段是相对于要生成最终的elf或binary时的Link过程说的,Link过程的输入大都是由源代码编绎生成的目标文件.o,那么这些.o文件中包含的段相对link过程来说就是输入段。
而,Link的输出一般是可执行文件elf或库等,这些输出文件中也包含有段,这些输出文件中的段就叫做输出段。
输入段和输出段本来没有什么必然的联系,是互相独立,只是在Link过程中,Link程序会根据一定的规则(这些规则其实来源于Link Script),将不同的输入段重新组合到不同的输出段中,即使是段的名字,输入段和输出段可以完全不同。
其用法举例如下:
int var __attribute__((section(".xdata"))) = 0;
这样定义的变量var将被放入名为.xdata的输入段。
再如:
static int __attribute__((section(".xinit"))) functionA(void) { ..... }
这个例子将使函数functionA被放入名叫.xinit的输入段。
需要特别注意的是,
__attribute__的section属性只指定对象的输入段,它并不能影响所指定对象最终会放在可执行文件的什么段。
下面是目前支持的变量属性:
• address (addr)
• aligned (alignment)
• boot
• deprecated
• fillupper
• far
• mode (mode)
• near
• noload
• packed
• persistent
• reverse (alignment)
• section (“section-name”)
• secure
• sfr (address)
• space (space)
• transparent_union
• unordered
• unused
• weak
另外,
1. 也可以通过在关键字前后使用 __(双下划线)来指定属性(例如,用
__aligned__代替aligned)。这样将使你在头文件中使用它们时不必考虑会出现与
宏同名的情况。
2. 要指定多个属性,可在双括弧内用逗号将属性分隔开,例如:
__attribute__((aligned (16), packed))
相关文章推荐
- SQL左连接查询和又连接查询的区别
- 在java中生成二维码,并直接输出到jsp页面
- Win8.1+VS2013+WDK8.1+VirtualBox or VMware 驱动开发环境配置
- 解决的方法:warning: Clock skew detected. Your build may be incomplete.
- 当学习前端过程中心态发生了变化
- js插件心得
- MySQL中特有的函数CONV函数
- docker stop 与 docker kill的区别
- Flume架构与源码分析-核心组件分析-2
- iOS取整
- Windows驱动开发如何入门
- 前端入门相关工具
- python学习6 web开发
- response.getWriter()的作用
- Oracle学习笔记(三)
- Java-----隐藏手机号中间四位
- 从VC学习Android·序
- DARPA 2015 report
- HDU-1247 Hat's Words (字典树)
- 解决Cell底部分割线右移问题